(PHP) SQL Injection対策で以下の方法は有効なのでしょうか?DBはMySQLです。


$test = $_POST['hate'];
$test = addslashes($test);
$test = mysql_escape_string($test);

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2006/03/14 22:08:06
  • 終了:2006/03/16 00:03:25

回答(2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752006/03/14 22:50:00

ポイント40pt

上記の例は問題があります。

以下のようなプログラムを実行してみてください。

<?php
$con = mysql_connect("localhost", "user_id", "password");
$test = "'" . '"' . "\n"; // シングルクォート、ダブルクォート、改行
print "そのまま表示<br />$test<br />";
$test2 = addslashes($test);
print "addslashes適用後<br />$test2<br />";
$test3 = mysql_escape_string($test2);
print "addslashesとmysql_escape_string適用後<br />$test3<br />";
$test4 = mysql_escape_string($test);
print "mysql_escape_string適用後<br />$test4<br />";
$test5 = mysql_real_escape_string($test);
print "mysql_real_escape_string適用後<br />$test5 <br />";
mysql_close($con);
?>

出力結果は

そのまま表示
'" 
addslashes適用後
\'\" 
addslashesとmysql_escape_string適用後
\\\'\\\"\n
mysql_escape_string適用後
\'\"\n
mysql_real_escape_string適用後
\'\"\n

となります。

このようにaddslashes()とmysql_escape_string()の両方を使うとデータの意味が変わってしまいます。

SQL Injectionは防げますが、正しく動作しません。

http://jp.php.net/manual/ja/function.mysql-real-escape-strin...

尚、mysql_escape_string()ではなくMySQL のライブラリ関数をコールするmysql_real_escape_string()を使うことが推奨されています。

(この関数はMySQLに接続した状態でなければ使用できません。)

SQL Injectionを防ぐ方法は上記のmysql_real_escape_string()の説明ページにある「例 3. "うまいやり方" のクエリ」の部分を参照してみてください。

参考になると幸いです。

id:esecua

回答ありがとうございます。

SQL Injection 対策には mysql_real_escape_stringのみで十分なのでしょうか?それ以外にSQLを使った攻撃方法などあれば教えてください。

2006/03/15 19:44:16
id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/03/15 23:53:32

ポイント35pt

SQL Injectionについては上記をご確認ください。

色々な例が載っています。

(すでにご存知かもしれませんが、念のため。)

SQL Injection以外にSQLを使った攻撃は…ちょっと思いつきません。

「大量のレコードを検索するSQL」なども場合によっては危険かもしれません。

クロスサイトスクリプティングで予期しない値を渡されると何が起こるか分かりませんので、セキュリティ面ではSQL Injectionだけではなく、クロスサイトスクリプティングにも注意した方が良いでしょう。

SQL Injectionの件ですが、細かいところまで気にしだすと色々あるようです。

特に文字コードにShift-JISを使っている場合、注意が必要です。

こちらがよくまとまっていると思います。

mysql_real_escape_string()でもエスケープされないことがあるそうです。

参考になると幸いです。

id:esecua

ご丁寧な回答ありがとうございます。

それにしてもbonlifeさんは技術が非常に高いと見えます。今後も私の質問を見つけた際はよろしくお願いします。

2006/03/16 00:02:27

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません