web-dev-qa-db-ja.com

CSPは<a href>タグ内のJavaScriptをブロックしますか?

私は最近、このような_<a>_タグからJavaScriptを実行できることを発見しました

<a href="javascript:alert('test')">

これをクリックすると、現在のページで実行されます。また、クリックされたページのコンテキストで実行され、Webサイトのローカルストレージにアクセスできます。これを防ぎたい。 CSPを使用してインラインJavaScriptブロックをブロックできることはわかりますが、これにこれらのJavaScriptリンクが含まれているかどうかはわかりません。

CSPヘッダーを追加すると、これらのJSリンクが機能しなくなりますか?

1
Qwertie

ローカルHTMLファイルを使用した簡単なテストで質問に答えることができます。

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
<a href="javascript:alert('test')">click me</a>

リンクをクリックしようとすると、JavaScriptが実行されません。 Chromeのデベロッパーツールでコンソールを見ると、次のことがわかります。

次のコンテンツセキュリティポリシーディレクティブ「script-src 'self'」に違反しているため、JavaScript URLの実行を拒否しました。インライン実行を有効にするには、「unsafe-inline」キーワード、ハッシュ(「sha256 -...」)、またはナンス(「nonce -...」)のいずれかが必要です。

Unsafe-inlineを提案どおりに追加すると、代わりに期待どおりに機能します。つまり、スクリプトが実行されます。

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
<a href="javascript:alert('test')">click me</a>

また、 CSPのドキュメント から:

'unsafe-inline'
インライン要素、javascript:URL、インラインイベントハンドラー、インライン要素などのインラインリソースの使用を許可します。一重引用符を含める必要があります

2
Steffen Ullrich