- 2011-06-03 (金) 21:47
- JavaScript
指摘を受けたのでメモ。
例えば http://example.com/ に以下のようなコードを書いたとする。
var url = location.href; document.write('<a href="' + url + '">リロードするお!</a>');
この状態でアドレスバーに http://example.com/#’>”><script>alert(0)</script> と打ち込むと、 IE8以下及びIE9互換モードの場合、alertが実行されてしまう。
対処法
clickイベントで対応する そもそも location.href を document.write() なりで直接DOMに書き出すのが問題なので。
location.href を使わない location.protocol + location.hostname + location.path をencodeURIComponent してなんとかする。
location.href から’#'以降を取り除く クエリを持ちまわしたい場合、’?'でURLを分けて、それぞれ’#'以降を取り除く。
escape してしまう なんかもうどうしても使いたい場合。
今回行った方法
以下のように String を拡張して、PHP の htmlspecialchars() のようなものを作り、location.href をエスケープする。
String.prototype.htmlspecialchars = function(){ var string = this; var table = [ [/&/g, '&amp;'], [/</g, ''], [/>/g, ''], [/"/g, ''], [/'/g, ''] ]; for (var i in table) { string = string.replace(table[i][0], table[i][1]); } return string; }</p> <p>var url = location.href.htmlspecialchars(); document.write('<a href="' + url + '">リロードするお!</a>');
結論
location.href をDOMに直接書き込まないのが一番。 jQueryなりを使えばそんなに苦じゃないはず。
参考 複数のニュースサイトで外部サイトにシェアするボタンの実装方法に問題がある件 dom based xss の発見と駆除と予防について
- Newer: 【JS】iPhoneでタップの反応が遅いと感じたら
- Older: 【JS】Node.jsはじめました
Comments:0
Trackbacks:0
- Trackback URL for this entry
- https://unolabo.boo.jp/archives/2011/06/03-location-href%e3%81%ab%e3%82%88%e3%82%8bxss%e8%84%86%e5%bc%b1%e6%80%a7.html/trackback
- Listed below are links to weblogs that reference
- 【JS】location.hrefによるXSS脆弱性 from うのらぼ。