先日PHPカンファレンス北海道2016にて「『例えば、PHPを避ける』以降PHPはどれだけ安全になったか」と題して基調講演を担当致しました。その際のスライドはこちら。したところ、以下のご指摘をいただきました。スライド拝見しました。39番目のスライドですが、バインドのタイミングでintにキャストするのはちょっと例として良くない気がします。意図的にオーバーフローを起こすことで想定外のレコードの取得を許してしまいそうです。キャストしない方がまだ安全だと思うのですが。2016年4月16日39番目のスライドは下記ですね。TokumaruSQLデータベースは、int型よりも大きな桁数を扱える場合があるので、intへのキャストを避けた方がよいという指摘は一般論としてはもっともなものだと考えます。PHPの場合、9223372036854775807を越える数字文字列をint型にキャストすると、9223372036854775807が返ります(64ビット環境の場合)。これを考慮していない場合、悪用される可能性はあります。"var_dump((int)'999999999999999999999999999999');"int(9223372036854775807)それにも関わらず、MySQLとPDOの組み合わせの場合、int型へのキャストが望ましい状況があります。その理由を説明します。PoCPDOのプレースホルダの挙動について、以下のサンプル(PoC)で紹介します。id=18015376320243461を検索して表示します。上記スクリプトのプレースホルダにより生成されるSQL文は下記のとおりです。id='18015376320243461'ポイントは、PDO::PARAM_INTと整数型を指定しているのに、文字列リテラル(赤字部分)として値が生成されているところです。MySQLと暗黙の型変換の問題ここで問題は、列idの型がDECIMAL(20)という数値型なのに、文字列型の値と比較しているところです。MySQLは、この場合、両者を浮動小数点型に変換してから比較します。5.6のリファレンスマニュアルから該当部分の引用です。次のルールでは、比較演算の際にどのように変換が発生するのかについて説明します。