あちあち情報局

趣味や日曜プログラムなどを書いています

ユーザ用ツール

サイト用ツール


programs:js_xss

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
programs:js_xss [2018/04/01 11:13] – 作成 管理者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タグやスプリクトが使えるので危険です。
 +
 +例えば対策してなければ、下記のように入力されればスプリクトが実行できます。
 +<code>
 +<script type="text/javascript">alert('xss')</script>
 +</code>
 +
 +対策は、「<」→「&lt;」と「>」「 &gt;」と「&」→「&amp;」に置換(エスケープ)する事でhtmlタグやスプリクトを無効にできます。
 +<code>
 +&lt;script type="text/javascript"&gt;alert('xss')&lt;/script&gt;
 +</code>
 +↓実際にhtmlで出力した場合、文字列として出力されます。
 +
 +<html>
 +&lt;script type="text/javascript"&gt;alert('xss')&lt;/script&gt;
 +</html>
 +
 +(「&」は直接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から始まるか確認する。(※試して無いけど「/」や「./」や「../」からでも大丈夫かも)
 +
 +例えば
 +<code html>
 +<a href="ここに受け取ったデータが入る">リンク</a>
 +</code>
 +
 +次のデータを入力すると
 +<code html>
 +javascript:alert('xss')
 +</code>
 +
 +クリックするとjavascriptが実行できてしまう。
 +<code html>
 +<a href="javascript:alert('xss')">リンク</a>
 +</code>
 +
 +httpから始まればjavascriptは実行できません。
 +
 +注意:javascriptの文字をブロックしてもダメで、「j」を「J」にしたり実態参照の「&#x6a;」や「&#106;」などに置き換えても動作するし、javascript以外にVBScriptがあったり将来新しい言語が追加される可能性もあります。
 +
 +=== 対策2 ===
 +「"」→「&quot;」「'」→「&#39;」に置換(エスケープ)する。
 +
 +下記のようにデータが挿入される場合
 +<code html>
 +<input type="text" name="form1" value="ここに受け取ったデータが入る">
 +</code>
 +
 +下記のようなデータを入力すると
 +<code html>
 +" click="alert('xss')
 +</code>
 +
 +次のようになり出力され、「click="alert('xss')"」が実行できる状態になります。
 +<code html>
 +<input type="text" name="form1" value="" click="alert('xss')">
 +</code>
 +
 +置換すれば下記のようになり安全です
 +<code html>
 +<input type="text" name="form1" value="&quot; click=&quot;alert(&#39;xss&#39;)">
 +</code>
 +
 +
 +=== 対策3 ===
 +属性値は必ず「"」か「'」で括られている事
 +
 +XSS以前の問題で、括ってないのはHTMLの文法エラーなのですが、括り忘れると対策2を実施しても意味がありません。
 +
 +例えば、属性値を括って無い場合
 +<code html>
 +<input type=text name=form1 value=ここに受け取ったデータが入る>
 +</code>
 +
 +次のデータを入力すると
 +<code html>
 +ダミー onclick=javascript:alert(`xss`)
 +</code>
 +
 +次のようになり出力され、「onclik」でスプリクトが実行できる状態になります。(※()内はバッククォートを使っていますが「'」から変換された「&#39;」などでも動作します)
 +<code html>
 +<input type=text name=form1 value=ダミー onclick=javascript:alert(`xss`)>
 +</code>
 +
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki