
PHPのSQLインジェクションですが、sprintf内でクォートをしてあるとそれで大丈夫なのでしょうか?
以下のようなコードがあり、nameは画面入力なのでSQLインジェクションが起こるのでは?
と作成者に確認したところ、"%s"してあるから大丈夫との返事をもらいました。
ネット調べるとmysql_real_escape_stringでエスケープしてから"%s"で変換すれば大丈夫といった内容は見つけたのですが、mysql_real_escape_stringなど不要との返事をもらいました。
なぜ?と聞くとそういうものだとしか回答がありません。
sprintf('UPDATE users SET name = "%s" WHERE id = %d', name, id);
結局上記のコードでSQLインジェクションは解消されているのでしょうか?
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.h …
No.3
- 回答日時:
>エスケープとしてこれで対策になっているのでしょうか?
なっていない。
>文字列を""付きでsprintfするだけでなぜ対策になるのかわからないのです。
俺もわかりません。ド素人が作ったソースなのでしょう。
>作成者はPHPではこれでいいと言っています。
よくない。
PHPにおいてもプレースホルダを使うのが一般的になっている。
また、
>ネット調べるとmysql_real_escape_stringでエスケープしてから"%s"で変換すれば大丈夫といった内容は見つけたのですが、mysql_real_escape_stringなど不要との返事をもらいました。
http://php.net/manual/ja/function.mysql-real-esc …
mysql系の関数はすでにPHPにおいては非推奨の関数になっている。
使うべきはmysqliや汎用のDBドライバとなるPDOを利用すべき。
ずばりな回答ありがとうございます。
上記のような内容を伝えたのですが、
自分の作ったソースはとにかく変えたくないようで、
他のひとに作り直してもらうことになりそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
csvファイルについて教えて下さ...
-
PHP8でWarning:Undefined varia...
-
PHPSpreadsheetによる書き出し...
-
PHPの変わった閉じタグの必要性...
-
セッション関数を使わずにファ...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
sqlから多次元配列に要素を格納...
-
phpのエラーについてです
-
DB(MySQL)から複数行のデータを...
-
リストから詳細画面に遷移する...
-
Resource id #3 をフィールドの...
-
テーブルに入っているデータと...
-
stringaddslashes 半角¥が消える
-
PHP+mysqlでSQL文に文字数制限...
-
会員登録したらメールが送られ...
-
検索表示について
-
XAMPPで画面が真っ白になります。
-
ボタンのonclick時における関数...
-
mysql_queryが動かなくて困って...
-
PHP+MYSQL IF文の初歩
-
PHP+MySQLでの検索結果の横並び...
-
"と'の使い方を教えていただけ...
-
mysql_queryでDB検索をしたいが...
-
C++でMySQLを処理したいです
-
縦に長い<table>でなく横に長い...
-
mariadbでのエラー
おすすめ情報