最近、DOM XSS攻撃のためにテストされ、失敗した他人のコードを搭載しました。 基本的にURLフラグメントはそうのように、注入されるjQueryのセレクタに直接渡され、JavaScriptを有効にされています:DOM XSSの防止
"http://website.com/#%3Cimg%20src=x%20onerror=alert%28/XSSed/%29%3E)"
$(".selector [thing="+window.location.hash.substr(1)+"]");
問題は、これが彼らのスクリプト全体で発生していると、例えば修正する回帰テストの多くを必要とするだろうということですデータをエスケープすると、データが一致しないため、if文が真を返すことはありません。
問題のJavaScriptファイルは、多くの小さなファイルからのビルド時に連結されるため、修正がさらに難しくなります。
各インスタンスを通過してデバッグすることなく、これらのDOM XSS攻撃を一部のグローバルコードで回避する方法はありますか。
私たちはXSS攻撃で使用される一般的な文字を検出し、それがtrueを返した場合、単純にスクリプトを殺すために、スクリプトの先頭にはほとんどの正規表現を追加することを提案しました。
var xss = window.location.href.match(/(javascript|src|onerror|%|<|>)/g);
if(xss != null) return;
これは動作するようですが、私は解決策に100%満足していません。誰もがより良い解決策を持っているか、彼らが提供できる有用な洞察力を持っていますか?
はい、ファイル全体を修正する必要があります。あなたは "エスケープデータブレイクif文"とはどういう意味ですか?なぜjQueryセレクタがURLハッシュに格納されていたのですか? – Bergi
基本的に、各ロードがポストバックであっても、ページングではGETパラメータとURLフラグメントが使用されます。次に、この情報を解析せずにjQueryに直接消費し、if(param [0] == "str")などのロジックがたくさんあります。これをエスケープするには、両方の値をエスケープする必要があります。 – sidonaldson
はい、適切なルータと状態を使用してください<->セレクタマッパー – Bergi