質問
Twitterのような有名なサイトでさえXSSの脆弱性に苦しんでいますが、この種の攻撃を防ぐにはどうすればよいですか?
解決
あなたができる#1ことは、クッキーをHTTPのみに設定することです...これは、少なくともセッションCookieハイジャックから保護します。自分のサイトの管理者である可能性が高いときに、誰かがCookieを盗むように。
残りはすべてのユーザー入力の検証になります。
- ルール#0-許可された場所以外に信頼できないデータを挿入しない
- ルール#1-信頼できないデータをHTML要素コンテンツに挿入する前のHTMLエスケープ
- ルール#2-信頼できないデータをHTML共通属性に挿入する前の属性エスケープ
- ルール#3-信頼できないデータをHTML JavaScriptデータ値に挿入する前のJavaScriptエスケープ
- ルール#4-信頼できないデータをHTMLスタイルプロパティ値に挿入する前のCSSエスケープ
- ルール#5-信頼できないデータをHTML URL属性に挿入する前のURLエスケープ
ここで詳しく説明する非常に長いテーマ:
http://www.owasp.org/index.php/XSS_( Cross_Site_Scripting)_Prevention_Cheat_Sheet
http://www.owasp.org/index.php/Cross_site_scripting
XSSは多くのエクスプロイトの1つにすぎず、すべてのWeb開発者はトップ10のOWASPを心から学ぶべきです
他のヒント
準備済みステートメントを使用してSQLインジェクションを非発行にすることができるように、同様のことを行うテンプレートエンジン(DOMシリアライザー)を使用してXSSを非発行にすることができます。
すべての出力がテンプレートエンジンを経由するようにアプリケーションを設計します。テンプレートエンジンがデフォルトですべてのデータをHTMLエスケープするようにします。この方法により、デフォルトで安全であり、人間(および大規模システムの残りの部分)がHTMLのエスケープに熱心であることを必要としないシステムになります。
私はあなたがあなたのコードを書くものではありませんが、asp.netを使用する場合、部分的にカバーされます。 asp.netには要求検証と呼ばれるものがあり、有効にすると、ユーザー入力を介して悪意のあるスクリプトが導入されるのを防ぎます。
しかし、時々、この質問で入力したようなテキストエディタを許可する必要があります。この場合、一部の「リッチテキスト」を許可するには、リクエストの検証を部分的に無効にする必要があります。エンドユーザーが入力するhtml。この場合、何らかの種類のホワイトリストフィルタリングメカニズムを構築する必要があります。
FYI、他のことは知りませんが、MicrosftにはAnti-Xssというライブラリがあります。