$intval * 1でサニタイズ…

Security 7月 14, 2007
(Last Updated On: 2007年7月14日)

たまたま見たPHPのコードでSQL文中の整数値を

$intval * 1

として整数型にするサニタイズがありました。この方法をお薦めするわけではありませんが、以前のエントリ

http://blog.ohgaki.net/index.php/yohgaki/2007/07/04/example_1428_a_best_practice_query

でsprintf()の%dを使う方法よりはましです。

$ php -r “echo ‘99999999999999’ * 1;”
99999999999999

実行したマシンは32bitのLinuxシステムですが浮動小数点型に自動変換されるので2^31を越える値でも正しく表示されます。一方、PHPマニュアルの方法だと

$ php -r “printf(‘%d’, ‘99999999999999’ * 1);”
276447231

となってしまいます。最近のDBは大きなモノも珍しくないのでこの程度でオーバーフローするようでは安心できません。もっとも*1方式でもあと一桁増やすと

$ php -r “echo ‘999999999999999’ * 1;”9′ * 1);”
1E+15

と指数表記になるのでこれで十分とは言えません。しかし、マニュアルのベストプラクティスよりは良いです。printf系で処理するなら

$ php -r “printf(‘%1.0f’, ‘99999999999999’ * 1);”
99999999999999

これで十分なDBも多いとは思いますが、ダイナミックにSQL文を生成するのであれば文字列として渡してエスケープしてしまうと確実です。

投稿者: yohgaki