2012-11-08 28 views
8

最近、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%満足していません。誰もがより良い解決策を持っているか、彼らが提供できる有用な洞察力を持っていますか?

+0

はい、ファイル全体を修正する必要があります。あなたは "エスケープデータブレイクif文"とはどういう意味ですか?なぜjQueryセレクタがURLハッシュに格納されていたのですか? – Bergi

+0

基本的に、各ロードがポストバックであっても、ページングではGETパラメータとURLフラグメントが使用されます。次に、この情報を解析せずにjQueryに直接消費し、if(param [0] == "str")などのロジックがたくさんあります。これをエスケープするには、両方の値をエスケープする必要があります。 – sidonaldson

+0

はい、適切なルータと状態を使用してください<->セレクタマッパー – Bergi

答えて

6

式一致サウンドハッシュ(例:/^[\w_-]*$/)。

偽陽性エラー(例:src_records)を回避し、承認されたものとそうでないものを明確にし、より複雑な注入メカニズムをブロックします。

+2

そうだ。ブラックリストの代わりにホワイトリストにしてください! – Bergi

+0

私はそれが好きです。したがって、特定のXSS技術を特定するのではなく、受け入れ可能な文字のホワイトリストを作成してください。 – sidonaldson

+0

私はそれを検索文字列とハッシュ文字列に合わせて修正しました... var urlSearch = window.location.search.match(/^[ - \ w _&?= +] * $ /); var urlHash = window.location.hash.match(/^[ - \ w _&= +#] * $ /); if(urlSearch == null || urlHash == null)return; – sidonaldson

0

あなたの問題は、セレクタとしてだけでなく、jQueryの入力文字列がHTMLとして扱われることが原因です。

jQueryの代わりにネイティブdocument.querySelector()を使用してください。 IE7-のサポートがあなたのために重要である場合

することは、あなたはおそらく、ネイティブquerySelector()に似jQueryとは異なり、セレクタとは別のものとして、入力文字列を解釈することはありませんSizzleセレクタエンジンを試すことができます。むしろ、悪質なハッシュにマッチする正規表現(/(javascript|src|onerror|%|<|>)/g)、私は定期的に定義するを定義するよりも、

:あなたは理想からほど遠い正規表現のソリューションに固執するが、最良の選択は、あなたの制約を与えてもよい場合

+0

私は書き直しを避けようとしているので、これは助けにはなりません。 (ただし正当な観点からはこれは正しい) – sidonaldson