====== JavaScriptのクロスサイトスクリプティング対策について(下書き) ======
クロスサイトスクリプティング(以下XSS)はJavascriptなどのWebアプリケーションの脆弱性の一つ、Webアプリケーションへの入力に対して攻撃者(*)が脆弱性のある文字列を入力する事で管理者やWebアプリケーションが想定しない行動が可能となり情報漏洩・データの書き換えや破壊・任意のスプリクトの実行など可能となる危険性があります。(*攻撃の意図が無くても脆弱性のある文字列を入力すればXSSが発生します)
外部(*)からの入力を一切受け付けないWebアプリケーションでは発生しません。(*フォーム・cookie・データファイルなど)
===== 対策 =====
基本的には外部から入力されたデータはそのまま出力せず、必ずXSS対策してから出力する事。
==== 1.htmlページに表示する場合 ====
外部から入力された文字列をそのままhtmlページに表示すると、htmlタグやスプリクトが使えるので危険です。
例えば対策してなければ、下記のように入力されればスプリクトが実行できます。
対策は、「<」→「<」と「>」「 >」と「&」→「&」に置換(エスケープ)する事でhtmlタグやスプリクトを無効にできます。
<script type="text/javascript">alert('xss')</script>
↓実際にhtmlで出力した場合、文字列として出力されます。
<script type="text/javascript">alert('xss')</script>
(「&」は直接xssとは関係ありませんが、置換しない場合「< と <」を変換すると→「< と <」になり区別できなくなります。置換すれば→「<と &<」となり区別できます)
==== 2.htmlタグの属性値に使う場合 ====
入力されたデータをhtmlタグの属性値(
リンク
次のデータを入力すると
javascript:alert('xss')
クリックするとjavascriptが実行できてしまう。
リンク
httpから始まればjavascriptは実行できません。
注意:javascriptの文字をブロックしてもダメで、「j」を「J」にしたり実態参照の「j」や「j」などに置き換えても動作するし、javascript以外にVBScriptがあったり将来新しい言語が追加される可能性もあります。
=== 対策2 ===
「"」→「"」「'」→「'」に置換(エスケープ)する。
下記のようにデータが挿入される場合
下記のようなデータを入力すると
" click="alert('xss')
次のようになり出力され、「click="alert('xss')"」が実行できる状態になります。
置換すれば下記のようになり安全です
=== 対策3 ===
属性値は必ず「"」か「'」で括られている事
XSS以前の問題で、括ってないのはHTMLの文法エラーなのですが、括り忘れると対策2を実施しても意味がありません。
例えば、属性値を括って無い場合
次のデータを入力すると
ダミー onclick=javascript:alert(`xss`)
次のようになり出力され、「onclik」でスプリクトが実行できる状態になります。(※()内はバッククォートを使っていますが「'」から変換された「'」などでも動作します)