- ベストアンサー
PHPのSQLインジェクションはsprintf?
- PHPのSQLインジェクションはsprintf内でクォートをしてあるとそれで大丈夫なのでしょうか?
- sprintf内でのクォートにより、SQLインジェクションのリスクを軽減することができます。
- しかし、sprintf単体では完全な対策にはならず、適切なエスケープ処理やプリペアドステートメントの使用も重要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
sprintfを使っただけでは対策されず、mysql_real_escape_stringも必要となります。もっとよいのはsprintfもmysql_real_escape_stringも使わず、プレースフォルダを使ってSQLを呼び出すことです。 では、どうしてsprintfを使うとSQLインジェクション対策になるという話が出てきたかですが、ひょっとすると、数値の場合のことを言っているのかもしれません。この場合は、以下でSQLインジェクション対策になります。%dで受けることで、データが強制的に整数に変換されるので、攻撃の余地がなくなります。 sprintf('SELECT * FROM users WHERE ID = %d', $id); // IDが整数の場合 しかし、%sで受ける場合は、入力文字列はそのままSQL文の一部になりますので、SQLインジェクション攻撃が可能となります。そのため、mysql_real_escape_stringは必須です。 参考文献として、IPAの「安全なSQLの呼び出し方」のURLを添付しますね。少し難しいですが、SQLインジェクションの解説としてはとても詳しいです。
その他の回答 (2)
- corokorocoro
- ベストアンサー率29% (63/211)
>エスケープとしてこれで対策になっているのでしょうか? なっていない。 >文字列を""付きでsprintfするだけでなぜ対策になるのかわからないのです。 俺もわかりません。ド素人が作ったソースなのでしょう。 >作成者はPHPではこれでいいと言っています。 よくない。 PHPにおいてもプレースホルダを使うのが一般的になっている。 また、 >ネット調べるとmysql_real_escape_stringでエスケープしてから"%s"で変換すれば大丈夫といった内容は見つけたのですが、mysql_real_escape_stringなど不要との返事をもらいました。 http://php.net/manual/ja/function.mysql-real-escape-string.php mysql系の関数はすでにPHPにおいては非推奨の関数になっている。 使うべきはmysqliや汎用のDBドライバとなるPDOを利用すべき。
お礼
ずばりな回答ありがとうございます。 上記のような内容を伝えたのですが、 自分の作ったソースはとにかく変えたくないようで、 他のひとに作り直してもらうことになりそうです。
- corokorocoro
- ベストアンサー率29% (63/211)
今時のSQLインジェクション対策はプレースホルダが常識。 未だにエスケープ処理って何年前の対策方だよ。?そんな対策方は2000年頃かな?
補足
自分はJavaしか知らないのでプレースフォルダのイメージでしたが、作成者はPHPではこれでいいと言っています。 エスケープとしてこれで対策になっているのでしょうか? 文字列を""付きでsprintfするだけでなぜ対策になるのかわからないのです。
お礼
やはりプレースフォルダがいいのですね! わかりやすい回答ありがとうございます!! 参考文献もとても助かりました。