• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPのSQLインジェクションはsprintf?)

PHPのSQLインジェクションはsprintf?

このQ&Aのポイント
  • PHPのSQLインジェクションはsprintf内でクォートをしてあるとそれで大丈夫なのでしょうか?
  • sprintf内でのクォートにより、SQLインジェクションのリスクを軽減することができます。
  • しかし、sprintf単体では完全な対策にはならず、適切なエスケープ処理やプリペアドステートメントの使用も重要です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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インジェクションの解説としてはとても詳しいです。

参考URL:
http://www.ipa.go.jp/security/vuln/websecurity.html
doradorapoteti
質問者

お礼

やはりプレースフォルダがいいのですね! わかりやすい回答ありがとうございます!! 参考文献もとても助かりました。

その他の回答 (2)

回答No.3

>エスケープとしてこれで対策になっているのでしょうか? なっていない。 >文字列を""付きで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を利用すべき。

doradorapoteti
質問者

お礼

ずばりな回答ありがとうございます。 上記のような内容を伝えたのですが、 自分の作ったソースはとにかく変えたくないようで、 他のひとに作り直してもらうことになりそうです。

回答No.1

今時のSQLインジェクション対策はプレースホルダが常識。 未だにエスケープ処理って何年前の対策方だよ。?そんな対策方は2000年頃かな?

doradorapoteti
質問者

補足

自分はJavaしか知らないのでプレースフォルダのイメージでしたが、作成者はPHPではこれでいいと言っています。 エスケープとしてこれで対策になっているのでしょうか? 文字列を""付きでsprintfするだけでなぜ対策になるのかわからないのです。

関連するQ&A