回答編集履歴

1

対策方法を全面的に書き直しました

2022/08/29 23:34

投稿

ockeghem
ockeghem

スコア11701

test CHANGED
@@ -2,5 +2,45 @@
2
2
 
3
3
  [不特定多数がページ上で任意のJavascript等を実行できるページは危険でしょうか?](https://teratail.com/questions/sv3qj1i8a7zd1f)
4
4
 
5
+ (以下、過去の回答はピント外れだったので書き直しました)
5
- 対策ですが、JavaScriptで処理をする場合は、エスケープやサニタイズは推奨されておらず、適切DOM操作で対処すべきです。ReactやVue.jsなどであれば自動的に適切なDOM操作をしてくれるので特別XSSを意識する局面はあありせんが、いわゆるバニラJSやjQueryを使う場合は注意が必要です。具体的なコード例を示していただければ、方向性せると思います。
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
+