🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

GETした値のエスケープのために必要なこと

PHPにしろなんにしろ、ウェブサービスを作るにあたってPOSTやらGETやらとは無縁でいられませんね。

XSSやらSQLインジェクションやらの魔の手を回避するためにも、エスケープについて知っておくべき必要がありそうです。

ちょっとした前提知識はあるものの、実際何をどう書けば良いかわからんかったので、調べたメモをここに。

最低限エスケープすべきもの

&
'
"
<
>

最低限これはやっとけだそうです。
そのための関数として、

$str = $_GET['query'];
$e_str = htmlspecialchars($str, ENT_QUOTES, "utf-8");

参考:PHP: htmlspecialchars - Manual

第二・第三引数は省略できるそうですが、きっちり指定しろとどこかで読んだ覚えがあります。

最低限はこうすべしとのこと。

もっとしっかりエスケープ

htmlentities($str, ENT_QUOTES, "utf-8");

より沢山の種類をエスケープしてくれるとのこと。
特に理由がない限りこっちを使ったら良いと思います。

シングルクォートにバックスラッシュが勝手に付く

これにちょっとハマりました。
PHPにはマジッククォートなる仕組みがあるらしく。

参考:PHPスクリプト講座:マジッククォートの処理 -- そふぃのphp入門

エスケープとかしなくても、サーバーの設定によっては自動でシングルクォート・ダブルクォートがエスケープされるそうな。
スラッシュ:"/"がくっついてかえってきます。

そのまま表示には使えないので、スラッシュを外します。

function escStr($str, $entq=ENT_QUOTES, $strcode='UTF-8'){
    if (is_array($str)) {
        $esstr = array_map("escStr", $str);
    } else {
        $esstr = htmlentities($str, $entq, $strcode);
    }
    
    if ( get_magic_quotes_gpc() ) { // サーバーで自動的にスラッシュをエスケープする設定になってるかチェック
		return stripslashes( $esstr ); // スラッシュを外す関数
	}else{
		return $esstr;
	}
}

echo escStr($_GET['query']); //エスケープ後!

参考:HTMLエスケープを簡単にする独自のPHP関数 - ウェブライフハック

これで良さそう。

SQL関係のエスケープには

そういう時はそういう用に、

mysql_real_escape_string($str);

とかそういうのがあるみたいです。

HTMLとして画面に出す文字のエスケープと、DBに格納するため・SQL発行のための文字のエスケープは別と考えた方が良さそうです。
そっちはまた今度!

もっと良い書き方がある・あれを忘れてるなどあればぜひぜひ教えていただけると助かります。