あちあち情報局

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

ユーザ用ツール

サイト用ツール


js_xss

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

js_xss [2018/05/14 21:27]
管理者 作成
js_xss [2018/05/20 16:40] (現在)
管理者
ライン 1: ライン 1:
 +{{tag>​プログラミング関連 Javascript}}
 +[[start]]>[[programming_start]]
  
 +====== 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>​
 +
 +
 +
 +----
 +[[start]]>[[programming_start]]
js_xss.txt · 最終更新: 2018/05/20 16:40 by 管理者