正規表現でダッシュ、チルド、アテレート、a-z、A-z、0-9の文字を許可します
[A-za-z_0-9.,\t\r()\\[\\]@ ~/[-]+$]
これらの正規表現をバイパスする可能性はありますか?
実際、リクエストがサーバーに送られるたびに、リクエストは最初にこのページにヒットします。安全ですか?
実際にはアプリケーションは巨大なので、すべての応答インスタンスにエンコーディングを適用することはできません。一般的に緩和する方法はありますか?
「abc」や「alert(1)」のような文字列を実行すると、どちらにも一致しないと表示されるため、私は正規表現にあまり自信がありません。 XSSも難読化される可能性があります。つまり、XSSをキャッチするための適切な正規表現を書くのは簡単ではありません。詳細については、 https://www.owasp.org/indexを参照してください。 php/XSS_Filter_Evasion_Cheat_Sheet
アプリケーションを開発する前に、セキュリティを考慮してアプリケーションを設計する必要があります。場所に関係なくすべての出力がHTMLエンティティでエンコードされるように、コードをリファクタリングすることをお勧めします。
C#の例 https://docs.Microsoft.com/en-us/dotnet/api/system.web.httputility.htmlencode?view=netframework-4.8
@RaimondsLiepiņšの回答に同意します。ただし、もう少し拡大するには、XSSを防ぐ方法の性質がコンテキストに依存することを理解することが重要です。そのため、outputの適切なエンコードが最も効果的なソリューションです。すべての入力をプリエンプティブにクリーンアップしようとするcan作業は、ユーザーにとって他の問題を引き起こす不格好なソリューションになる傾向があり、それでも常に成功するとは限りません。コンテキスト対応の出力エンコーディングは、唯一確実なソリューションです。
現在の正規表現が失敗する例を示すために、ユーザー入力が引用符で囲まれていないJavaScriptに挿入された場合は失敗します。次のようなURLを想像してください。
https://example.org/page?id=5
Idパラメータは、次のようにページ上のいくつかのJavaScriptに挿入されます。
var resourceId = [ID_FROM_URL];
この場合、正規表現は、次のようなペイロードによるアクティブな悪用を停止するために何もしません。
http://example.org/page?id=alert(1)
このようなケースがない場合は、正規表現mightで保護されます。ただし、XSSではすべてがcontextに依存するため、確実に言うことはできません。これが、すべての入力に1つのルールを適用しようとすると、セキュリティホールが残る傾向がある理由です。考えられる問題が多すぎます。
正規表現ですべてのXSSが修正されても、それでも多くの問題が発生しています。問題は、実質的にすべての非ASCII文字がユーザー入力で使用されないようにすることです。それはあなたのシステムを使用し、アイルランド人(すなわち、Conor O'Brian
)、北米を除くすべての大陸からの誰でも(別名、私の良い友達Jávier
)、普通话/普通話を話す人、および「他の人が言った」ことを引用する必要がある人。
したがって、唯一の真の解決策は、それを正しく行うことです。大規模なソフトウェアシステムを構築していて、その後基本的なアプリケーションセキュリティについて学んだ会社で働いていると思います。残念ながら、これは予想よりも一般的に発生します。長い目で見ると、実際には1つの選択肢しかありません。それをやり直すだけです。安全に構築されていないシステムにセキュリティをボルトで固定しようとすることは、命題を失うことになります。最終的には、より強固な基盤でシステムを再構築するか、非常にハッキングされることになります。これらは唯一の長期的なオプションです。
短期的には、厳密なCSPを実装してXSS攻撃による潜在的な被害を軽減することもできますが、最初に安全に構築されていないシステムでは、通常、強力なCSPを実装することは非常に困難です。