重複の可能性:
PHPでのユーザー提供の正規表現のサニタイズ
ユーザーが何かを検索できるようにし、検索機能に正規表現を受け入れる機能があるとします。
サイトユーザーが投稿した正規表現で検索できるようにしても大丈夫ですか?ユーザーの観点から、私はそれを可能にするサイトが大好きです:D
セキュリティ上のリスクはありますか?正規表現をサニタイズするにはどうすればよいですか?
重複の可能性:
PHPでのユーザー提供の正規表現のサニタイズ
ユーザーが何かを検索できるようにし、検索機能に正規表現を受け入れる機能があるとします。
サイトユーザーが投稿した正規表現で検索できるようにしても大丈夫ですか?ユーザーの観点から、私はそれを可能にするサイトが大好きです:D
セキュリティ上のリスクはありますか?正規表現をサニタイズするにはどうすればよいですか?
主なリスクは、正規表現が非常に複雑で、何年にもわたって実行されるか、エンジンの再帰制限に達することです。この記事を参照してください。間違った場所でユーザーに正規表現の置換を許可すると、コードインジェクションのリスクが発生するため、他のリスクが発生する可能性があります。ただし、マッチング自体は、サーバーのDoSing以外に害を及ぼすことはありません。
最近、これらの危険な正規表現をどのように認識するかについて質問があり、一般的には不可能であるというコンセンサスがありました。質問を参照してください。
正規表現検索にかかる時間を制限し、時間がかかりすぎる場合は中止することをお勧めします。
直接的なセキュリティリスクは見られませんが、深刻なダウンタイムを簡単に引き起こす可能性のあるパフォーマンス関連の問題が見られます。これには、複雑すぎるフレーバーと広すぎるフレーバーの2つのフレーバーがあります。たとえば、次のようなクエリを考えてみましょう.*
。大きなデータベースを使用すると、そのうちの2つでもシステムを簡単に停止できることがわかりました。
実際のライブデータベース以外のものを使用してユーザー検索を実行します。できれば、メモリにキャッシュされた結果から実行しますが、これはそれほど重要ではありません。
または、コメント(* 、?)で提案されているようなワイルドカードのみを実装します。それらは、よりユーザーフレンドリーで扱いやすいです。
正規表現がプログラミングコードに影響を与えない場合、実際のセキュリティリスクはありません。実装されていないことが多い理由は、コストのかかる手順であり、SQLで使用されるのを見たことがないため、検索対象のすべてのコンテンツを取得してから、正規表現を実行する必要があるためです。 SQLlike
や完全一致などで許可される単純さよりも。