回答編集履歴
1
対策方法を全面的に書き直しました
test
CHANGED
@@ -2,5 +2,45 @@
|
|
2
2
|
|
3
3
|
[不特定多数がページ上で任意のJavascript等を実行できるページは危険でしょうか?](https://teratail.com/questions/sv3qj1i8a7zd1f)
|
4
4
|
|
5
|
+
(以下、過去の回答はピント外れだったので書き直しました)
|
5
|
-
対策ですが、
|
6
|
+
対策ですが、「何もしない」という選択肢はありますが、緩和策として以下の3種類を単独、あるいは組み合わせて使用することができます。
|
6
7
|
|
8
|
+
(1) サニタイズ
|
9
|
+
これは質問者さんも言及されていますが、ユーザが指定したHTMLがイベントハンドラなど危険な属性を取り除くものです。script要素については、innerHTMLを使って表示する場合はJavaScriptが実行されませんが、逆に言うと存在しても「何もしない」ので除去するのがよいでしょう。
|
10
|
+
サニタイズの実装についてはthink49さんからも提案がありますが、いささか面倒な処理であるので既存のライブラリを使うのが良いでしょう。
|
11
|
+
たとえば、アプリケーションをAnguarで開発する案が考えられます。Angularは元々サニタイズの処理が内蔵されていますので、以下のようにHTML文字列を表示する処理を書いたとしますと、
|
12
|
+
|
13
|
+
```HTML
|
14
|
+
<span [innerHTML]="htmlString"></span>
|
15
|
+
```
|
16
|
+
|
17
|
+
これだけで危険な属性などは除去してくれます。たとえば、htmlStringに以下の文字列を指定すると、
|
18
|
+
|
19
|
+
```
|
20
|
+
<img src=1 onerror=alert(1)>
|
21
|
+
```
|
22
|
+
|
23
|
+
生成されるDOMは以下となります。危険なonerror属性が除去されています。
|
24
|
+
```HTML
|
25
|
+
<img src=1>
|
26
|
+
```
|
27
|
+
|
28
|
+
他のフレームワークでもサニタイズのライブラリを追加することはできるでしようが、Angularであればサニタイズ機能が元々内蔵されているので簡便です。
|
29
|
+
|
30
|
+
(2) コンテンツセキュリティポリシー
|
31
|
+
コンテンツセキュリティポリシー(CSP)はHTTPレスポンスヘッダに指定することで、仮にXSS脆弱性があっても、JavaScriptの実行を止めてくれます。
|
32
|
+
例えば、HTTPレスポンスヘッダに以下のように指定します。
|
33
|
+
|
34
|
+
```
|
35
|
+
Content-Security-Policy: script-src 'self'; object-src 'none'; base-uri 'none';
|
36
|
+
```
|
37
|
+
|
38
|
+
CSPを使うとJavaScriptをHTML内に書くことに制約が出てきますが、Angularなどで開発するとビルド時にHTMLとJavaScriptを分離してくれるので問題が出にくくなります。一方、jQueryなどで開発する場合はCSPを設定するのは面倒です。
|
39
|
+
|
40
|
+
(3) サンドボックスドメイン
|
41
|
+
HTMLを表示するサイトのドメインをアプリケーションとは別のものにする方法です。別のドメインをサンドボックスドメインと呼びます。サンドボックス側でJavaScript等が実行されても、アプリケーション側には影響しないとう性質を利用するものです。この方法は、手法として知っておいて損のないものですが、今回利用するにはやや大掛かり過ぎるかと思います。
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|