説明

a要素のhrefへ、自由にURLを指定できるようなシステムの場合、XSSの危険性がある。
また、aタグ以外でも、要素の属性を指定できる場合、XSSを起きる。
該当する属性は、href,srcだけでなく、すべてに注意。

悪意のあるXSS攻撃にはセッションハイジャックがある。
クッキーからセッションIDを表示させるJSコードが埋め込まれてしまい、セッションIDを盗まれる。
セッションIDを盗まれるとなりすましも可能になる。

対策
URLに含まれる次の記号、「<>"'」をサニタイズすれば良い。
また、記号「:;」も除去しておいた方が良い。

XSSを引き起こすコードの例

典型的な危険コード
a要素のhrefに以下のコードが指定されていると、画面を開いただけでJSが実行される。
http://example.com/?<script>alert(document.domain);</script>


クリックするとJavaScriptが実行される。
<a href="javascript:alert('XSS')" >テスト</a>
テスト

以下のような特殊環境で起こるケースも。
javascript:alert%28location%29
リンクに触るだけで、XSSを引き起こす特に注が必要な危険コード。
以前、TwitterにXSS脆弱性の問題があったが、以下と同様なものである。
http://example.com/"onmouseover="alert(1)"
a要素以外も注意
<IMG SRC="jav ascript:alert('XSS');">
<IMG SRC="javascript:alert('XSS')"+
IE7以前では、CSS内でJSコードを実行することも
<div style="color:expression(alert('XSS'));">a</div>
<div style='behavior:url(test.sct)'>a</div>

サンプル

ソースコード
	<?php
		$xssList=array(
			"http://example.com/\"onmouseover=\"alert(1)\"",
			"http://example.com/?<script>alert(document.domain);</script>",
			"https://example.com/?neko=1&yagi=2\"onmouseover=\"alert(1)\"",
			"javascript:alert('XSS')",
			"jav	ascript:alert('XSS');",
			"color:expression(alert('XSS'));",
			"behavior:url(test.sct)",
		);


		foreach($xssList as $xss){

			$s=htmlspecialchars_url($xss);


			echo htmlspecialchars($xss);
			echo " → ";
			echo htmlspecialchars($s);
			echo "<br>";
		}

		/**
		 * URL用のサニタイズ
		 * 記号「<>"'」をエンコードし、記号「:;」を除去する。
		 * ただし「http:」「https:」に付いている「:」は除去しない。
		 * @param  $xss	サニタイズ対象文字
		 * @return サニタイズ後の文字
		 */
		function htmlspecialchars_url($xss){
			$s=htmlspecialchars($xss, ENT_QUOTES, 'UTF-8');
			$s=str_replace('http:','http<',$s);
			$s=str_replace('https:','https<',$s);
			$s=str_replace(':','',$s);
			$s=str_replace(';','',$s);
			$s=str_replace('http<','http:',$s);
			$s=str_replace('https<','https:',$s);
			return $s;
		}

	?>
		

実行結果
http://example.com/"onmouseover="alert(1)" → http://example.com/&quotonmouseover=&quotalert(1)&quot
http://example.com/?<script>alert(document.domain);</script> → http://example.com/?&ltscript&gtalert(document.domain)&lt/script&gt
https://example.com/?neko=1&yagi=2"onmouseover="alert(1)" → https://example.com/?neko=1&ampyagi=2&quotonmouseover=&quotalert(1)&quot
javascript:alert('XSS') → javascriptalert(&#039XSS&#039)
jav&#x09;ascript:alert('XSS'); → jav&amp#x09ascriptalert(&#039XSS&#039)
color:expression(alert('XSS')); → colorexpression(alert(&#039XSS&#039))
behavior:url(test.sct) → behaviorurl(test.sct)