HTMLフォームから取得した場所にリダイレクトする以下のJSコードがあります。これはDOMベースのXSSのような攻撃に対して脆弱ですか?
document.theform.reference.onchange = function(){
var id = document.theform.reference.selectedIndex;
var url = document.theform.reference[id].value;
window.location.href = url;
}
はい、_document.theform.reference[id].value
_が別のユーザーによって制御される値である可能性がある場合、この脆弱性が存在します。
攻撃者がこの値をjavascript:alert('xss')
に設定した場合、次の行
_window.location.href = url;
_
スクリプトが、現在サイトを使用しているユーザーの現在のドメインのコンテキストで実行されます。
コードを見ると、ユーザーがフォームにURLパラメータを入力していると想定しています。
@SilverlightFoxが言ったように、攻撃者はフォームにjavascript:alert('xss')
を入力することができ、それはJSを実行しますが、彼のブラウザでのみです。 URLパラメータはWebサイトのURLの一部ではなく(GETパラメータまたはその他の方法で)、どこにも保存されていないため、攻撃者が手動でJSコードを実行するように仕向けることはできません。悪意のあるコードをフォームに入力します。
しかし、XSSは複雑なトピックであり、アプリケーションコード全体を理解することができないため、いくつかの予防策を講じます。
まず、ユーザーが入力できるURLを制限することが重要です。 URLの先頭、少なくともhttp://の部分をハードコードします。これにより、javascript:などの別のプロトコルを使用してURLを入力できないようになります。
また、可能であれば、ドメインにのみ入力できるURLを制限してください。ユーザーが他のドメインを入力できる場合は、ユーザーがサイトを離れることを警告します。
コードの他の場所にurlパラメータを挿入する場合は、適切な出力エンコーディングを使用してください。
はい、DOMベースのXSSに対して脆弱です。攻撃者がこの脆弱性を利用して被害者のブラウザにアクセスする方法については、これを参照してください Wikipediaの例 。