サンプル
ソースコード
<?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/"onmouseover="alert(1)"
http://example.com/?<script>alert(document.domain);</script> → http://example.com/?<script>alert(document.domain)</script>
https://example.com/?neko=1&yagi=2"onmouseover="alert(1)" → https://example.com/?neko=1&yagi=2"onmouseover="alert(1)"
javascript:alert('XSS') → javascriptalert('XSS')
jav	ascript:alert('XSS'); → jav&#x09ascriptalert('XSS')
color:expression(alert('XSS')); → colorexpression(alert('XSS'))
behavior:url(test.sct) → behaviorurl(test.sct)