programs:js_xss
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| programs:js_xss [2018/04/01 11:16] – 管理者 | programs:js_xss [2018/04/01 11:16] (現在) – [JavaScriptのクロスサイトスクリプティング対策について(下書き中)] 管理者 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== JavaScriptのクロスサイトスクリプティング対策について(下書き) ====== | ||
| + | クロスサイトスクリプティング(以下XSS)はJavascriptなどのWebアプリケーションの脆弱性の一つ、Webアプリケーションへの入力に対して攻撃者(*)が脆弱性のある文字列を入力する事で管理者やWebアプリケーションが想定しない行動が可能となり情報漏洩・データの書き換えや破壊・任意のスプリクトの実行など可能となる危険性があります。(*攻撃の意図が無くても脆弱性のある文字列を入力すればXSSが発生します) | ||
| + | |||
| + | 外部(*)からの入力を一切受け付けないWebアプリケーションでは発生しません。(*フォーム・cookie・データファイルなど) | ||
| + | |||
| + | ===== 対策 ===== | ||
| + | 基本的には外部から入力されたデータはそのまま出力せず、必ずXSS対策してから出力する事。 | ||
| + | |||
| + | ==== 1.htmlページに表示する場合 ==== | ||
| + | 外部から入力された文字列をそのままhtmlページに表示すると、htmlタグやスプリクトが使えるので危険です。 | ||
| + | |||
| + | 例えば対策してなければ、下記のように入力されればスプリクトが実行できます。 | ||
| + | < | ||
| + | <script type=" | ||
| + | </ | ||
| + | |||
| + | 対策は、「< | ||
| + | < | ||
| + | & | ||
| + | </ | ||
| + | ↓実際にhtmlで出力した場合、文字列として出力されます。 | ||
| + | |||
| + | < | ||
| + | & | ||
| + | </ | ||
| + | |||
| + | (「& | ||
| + | |||
| + | ==== 2.htmlタグの属性値に使う場合 ==== | ||
| + | 入力されたデータをhtmlタグの属性値(< | ||
| + | |||
| + | === 対策1 === | ||
| + | 属性がhrefとsrcの場合(< | ||
| + | |||
| + | 例えば | ||
| + | <code html> | ||
| + | <a href=" | ||
| + | </ | ||
| + | |||
| + | 次のデータを入力すると | ||
| + | <code html> | ||
| + | javascript: | ||
| + | </ | ||
| + | |||
| + | クリックするとjavascriptが実行できてしまう。 | ||
| + | <code html> | ||
| + | <a href=" | ||
| + | </ | ||
| + | |||
| + | httpから始まればjavascriptは実行できません。 | ||
| + | |||
| + | 注意:javascriptの文字をブロックしてもダメで、「j」を「J」にしたり実態参照の「&# | ||
| + | |||
| + | === 対策2 === | ||
| + | 「" | ||
| + | |||
| + | 下記のようにデータが挿入される場合 | ||
| + | <code html> | ||
| + | <input type=" | ||
| + | </ | ||
| + | |||
| + | 下記のようなデータを入力すると | ||
| + | <code html> | ||
| + | " click=" | ||
| + | </ | ||
| + | |||
| + | 次のようになり出力され、「click=" | ||
| + | <code html> | ||
| + | <input type=" | ||
| + | </ | ||
| + | |||
| + | 置換すれば下記のようになり安全です | ||
| + | <code html> | ||
| + | <input type=" | ||
| + | </ | ||
| + | |||
| + | |||
| + | === 対策3 === | ||
| + | 属性値は必ず「" | ||
| + | |||
| + | XSS以前の問題で、括ってないのはHTMLの文法エラーなのですが、括り忘れると対策2を実施しても意味がありません。 | ||
| + | |||
| + | 例えば、属性値を括って無い場合 | ||
| + | <code html> | ||
| + | <input type=text name=form1 value=ここに受け取ったデータが入る> | ||
| + | </ | ||
| + | |||
| + | 次のデータを入力すると | ||
| + | <code html> | ||
| + | ダミー onclick=javascript: | ||
| + | </ | ||
| + | |||
| + | 次のようになり出力され、「onclik」でスプリクトが実行できる状態になります。(※()内はバッククォートを使っていますが「' | ||
| + | <code html> | ||
| + | <input type=text name=form1 value=ダミー onclick=javascript: | ||
| + | </ | ||
| + | |||
| + | |||
