teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2022/08/29 23:34

投稿

ockeghem
ockeghem

スコア11710

answer CHANGED
@@ -2,4 +2,44 @@
2
2
 
3
3
  [不特定多数がページ上で任意のJavascript等を実行できるページは危険でしょうか?](https://teratail.com/questions/sv3qj1i8a7zd1f)
4
4
 
5
+ (以下、過去の回答はピント外れだったので書き直しました)
6
+ 対策ですが、「何もしない」という選択肢はありますが、緩和策として以下の3種類を単独、あるいは組み合わせて使用することができます。
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) サンドボックスドメイン
5
- 対策ですが、JavaScriptで処理をする場合は、エスケープやニタ推奨されておらず、「適切なDOM操作」で対処べきです。ReactやVue.jsなどば自動的適切DOM操作してくれるので特別XSSを意識る局面あまりありませんがいわゆるバニラJSやjQueryを使う場合は注意が必要です。具体的なコード例を示していただければ方向性示せると思います。
41
+ HTML表示するサイトのドメインをアプリケーションと別のものにる方法です。別のドメインをサンドボックスドメインと呼びます。サンドボックス側JavaScript等が実行さても、アプリケーション側は影響しいとう性質利用すのです。この方法は、手法として知っておて損のないものですが今回利用するにやや大掛かり過ぎと思います。
42
+
43
+
44
+
45
+