2018/08/08)正規表現のアルゴリズムを攻撃するDoS攻撃のReDoSを可能な限り回避する方法を考えてみます。破滅的なReDoSは非常に短い検索対象文字列でDoS攻撃が可能でした。念の為と思い、このエントリでは正規表現検索の対象文字列を短くする対策を紹介していましたが、この種の対策が効果があるケースがありました。ReDoSに脆弱になる典型的な正規表現は以下のような正規表現です。(PDF)マッチパターンが繰り返される正規表現が問題になります。メールアドレスにマッチする正規表現には色々なパターンが提案されていますが、検索して見つかった物にはとんでもなく長い物もあります。\t])*))*)?;\s*)http://emailregex.com/ReDoS対策を行うには正規表現はできるかぎり単純である方が良いです。上記の正規表現にはReDoSに脆弱となるとされているパターンに適合すると思われるパターンが含まれています。メールアドレスなら正規表現だけでマッチさせるのではなく”@”が一つだけ含まれるか?を文字列関数で検査し、ユーザー名部分とドメイン名部分を分解し検査するだけでもかなり単純になります。RFCに準拠するならメールアドレスのユーザー名部分は64バイト以下、ドメイン名部分の”.”で区切られた名前の部分は63バイト以下であることが要求されています。全体の長さは254バイト以下でなければなりません。これらの制限を文字列関数でチェックし、ユーザー名部分、ドメイン名のラベル部分(.で区切られた名前の部分)に分解した上で、正規表現でチェックすればReDoSに脆弱な正規表現を作る可能性は大幅に低減します。賢い正規表現より、通常の文字列関数で文字列を確認/分割し、単純な正規表現を書くようにした方が思わぬ脆弱性を作らなくて済みます。stupid”はセキュアコーディングの基本です。正規表現でも心掛けるようにする方が良いです。Regexという簡易チェックツールなども活用すると良いでしょう。https://www.npmjs.com/package/safe-regexOWASPのReDoS解説は簡潔かつ解りやすいです。起きてはならない場合、トランザクションはシリアライザブルPHPのOpenSSL関数を利用して暗号化する例2要素認証のTOTPとHOTP、どちらがより安全か?完全なSQLインジェクション対策JSONPは危険なので禁止インジェクション攻撃は3種類ある紹介エレクトロニック・サービス・イニシアチブのWebシステムのコンサルタントのブログです。PHPの開発、PHP4.x/5.xレガシーPHPセキュリティパッチサービスなどを行っています。ブログのサブタイトルを「書かない日記」としているのは、ブログを始めた時にあまり書かないつもりで始めたのでこのサブタイトルになっています。yohgaki@ohgaki.net私が記述したブログ中のコードは記載が無い場合はMITライセンスです。その他のコードは参考リンクなどのライセンス情報を参照ください。