たまたま見た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文を生成するのであれば文字列として渡してエスケープしてしまうと確実です。
Leave a Comment