XSSって怖ぇ~~
とあるサイトでXSSができてしまうことを偶然発見しました。
ところが普段私が使ってるChromeだとブロックしてくれるらしく、スクリプトの実行まではされませんでした。そこで他のブラウザではどうなってるのだろうと思って調べてみました。
これに対して
と送ってみると、実行されちゃうことがわかります。ちゃんと実用アプリではユーザーの入力値はよほどのことがない限り、
htmlescape()しておくか、スクリプトタグ、iframeを拒否するようにしましょう。
コメントを頂いてやっぱり、ちゃんとhtmlescape()しておいた方がいいと思いました。しかもオプションで用意されている引数を指定した方がいいみたいです。hakさん、ありがとうございました。
…Chorme最高!どっちの場合もちゃんとブロックしてくれました。FormのほうはURLの場合に比べて遭遇する可能性は少ないと思いますけど、たとえばFormに値を自動入力して、自動でポストしちゃうスクリプトをブックマーレットとして作ってTwitterのおかげで大活躍なURL短縮サービスかなんかで一見わからないようにしておけばURLと変わらなくなります。
まぁそもそもこういうぜい弱性を作っちゃう開発者が悪いのですが、安全なことにこしたことはありません。
ってことで、Chromeお勧めだよ!!爆速だよ!便利だよ!軽いよ!!(笑)
ところが普段私が使ってるChromeだとブロックしてくれるらしく、スクリプトの実行まではされませんでした。そこで他のブラウザではどうなってるのだろうと思って調べてみました。
検索窓などを想定したXSSぜい弱性のあるPHPコード
<?php
function xssPrint($post_name){
if($_POST[$post_name] == '')
return;
$text =mb_convert_encoding($_POST[$post_name],"UTF-8","auto");
if(get_magic_quotes_gpc())
$text= stripslashes($text);
print $text;
}
function xssPrint2($post_name){
if($_GET[$post_name] == '')
return;
$text =urldecode(mb_convert_encoding($_GET[$post_name],"UTF-8","auto"));
if(get_magic_quotes_gpc())
$text= stripslashes($text);
print $text;
}
?>
<html>
<head><title>XSS test</title></head>
<form name="form" method="post" action="XSS.php">
Fromで送信するタイプ
<input ype="text" name="xss1" value="<?php xssPrint('xss1');?>" ><br />
URL引数で送信するタイプ
<input ype="text" name="xss2" value="<?php xssPrint2('xss2');?>" ><br />
<button type="button" onClick="location.href='XSS.php?xss2='+encodeURI(document.form.xss2.value)">URL引数</button>
<button type="submit">From</button>
</form>
</html>これに対して
ぬるぽ♪" /><script type="text/javascript">window.alert("...Hello. Mr. ....");</script>と送ってみると、実行されちゃうことがわかります。ちゃんと実用アプリではユーザーの入力値はよほどのことがない限り、
htmlescape()しておくか、スクリプトタグ、iframeを拒否するようにしましょう。
コメントを頂いてやっぱり、ちゃんとhtmlescape()しておいた方がいいと思いました。しかもオプションで用意されている引数を指定した方がいいみたいです。hakさん、ありがとうございました。
調査結果
| ブラウザ | ぜい弱性の種類 | 調査結果 |
| Chrome 4.0.249.78 | URL | OK |
| From | OK | |
| IE8 | URL | OK |
| From | NG | |
| FF3.6 | URL | NG |
| From | NG | |
| Safari | URL | NG |
| From | NG |
…Chorme最高!どっちの場合もちゃんとブロックしてくれました。FormのほうはURLの場合に比べて遭遇する可能性は少ないと思いますけど、たとえばFormに値を自動入力して、自動でポストしちゃうスクリプトをブックマーレットとして作ってTwitterのおかげで大活躍なURL短縮サービスかなんかで一見わからないようにしておけばURLと変わらなくなります。
まぁそもそもこういうぜい弱性を作っちゃう開発者が悪いのですが、安全なことにこしたことはありません。
ってことで、Chromeお勧めだよ!!爆速だよ!便利だよ!軽いよ!!(笑)
ALAINはともかく、商用では重要な問題ですよね。勉強になりました
返信削除http://www.phppro.jp/phptips/archives/vol4/3
↑プログラム側ではこんな対応もあるみたいですね
@hakさん
返信削除おお!そうか、HTMLタグの「onMouseover」とかでもスクリプトが実行できちゃうんでしたね。こちらこそ勉強になりました。