目次

JavaScriptのクロスサイトスクリプティング対策について(下書き)

クロスサイトスクリプティング(以下XSS)はJavascriptなどのWebアプリケーションの脆弱性の一つ、Webアプリケーションへの入力に対して攻撃者(*)が脆弱性のある文字列を入力する事で管理者やWebアプリケーションが想定しない行動が可能となり情報漏洩・データの書き換えや破壊・任意のスプリクトの実行など可能となる危険性があります。(*攻撃の意図が無くても脆弱性のある文字列を入力すればXSSが発生します)

外部(*)からの入力を一切受け付けないWebアプリケーションでは発生しません。(*フォーム・cookie・データファイルなど)

対策

基本的には外部から入力されたデータはそのまま出力せず、必ずXSS対策してから出力する事。

1.htmlページに表示する場合

外部から入力された文字列をそのままhtmlページに表示すると、htmlタグやスプリクトが使えるので危険です。

例えば対策してなければ、下記のように入力されればスプリクトが実行できます。

<script type="text/javascript">alert('xss')</script>

対策は、「<」→「&lt;」と「>」「 &gt;」と「&」→「&amp;」に置換(エスケープ)する事でhtmlタグやスプリクトを無効にできます。

&lt;script type="text/javascript"&gt;alert('xss')&lt;/script&gt;

↓実際にhtmlで出力した場合、文字列として出力されます。

<script type="text/javascript">alert('xss')</script>

(「&」は直接xssとは関係ありませんが、置換しない場合「< と &lt;」を変換すると→「&lt; と &lt;」になり区別できなくなります。置換すれば→「&lt;と &amp;&lt;」となり区別できます)

2.htmlタグの属性値に使う場合

入力されたデータをhtmlタグの属性値(<div id=“value”> の value の部分など)に使う場合は次の3点の注意が必要です。

対策1

属性が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」にしたり実態参照の「&#x6a;」や「&#106;」などに置き換えても動作するし、javascript以外にVBScriptがあったり将来新しい言語が追加される可能性もあります。

対策2

「“」→「&quot;」「'」→「&#39;」に置換(エスケープ)する。

下記のようにデータが挿入される場合

<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="&quot; click=&quot;alert(&#39;xss&#39;)">

対策3

属性値は必ず「”」か「'」で括られている事

XSS以前の問題で、括ってないのはHTMLの文法エラーなのですが、括り忘れると対策2を実施しても意味がありません。

例えば、属性値を括って無い場合

<input type=text name=form1 value=ここに受け取ったデータが入る>

次のデータを入力すると

ダミー onclick=javascript:alert(`xss`)

次のようになり出力され、「onclik」でスプリクトが実行できる状態になります。(※()内はバッククォートを使っていますが「'」から変換された「&#39;」などでも動作します)

<input type=text name=form1 value=ダミー onclick=javascript:alert(`xss`)>