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