みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

検索機能ソースの脆弱性に関して

以前こちらでPHPの検索機能のソースに関して質問させて頂いた者です。そのときに、作成したソースに「SQLインジェクション」の可能性があるとのご指摘を受けたのですが、下記のソースを見ていただいて、どこに脆弱性があるのか、わかる方がおられましたら是非教えていただきたく存じます。
拙い知識ながらも、本等で調べて、$_POST['key']で受け取ったデータを、get_magic_quotes_gpcの設定がOFFの場合は、addslashes関数でエスケープ処理をする設定にしたのですが、フォームの入力値に「str' or '1'='1」のようなSQLインジェクション確認用の文字を入れたり、ソースの検証を自分で行った限りでは、エラーが発見できなかったのですが、どこがまずいのでしょうか?
ご教示いただけますよう、宜しくお願いいたします。

検索フォーム
<form method="post" action="view.php">
<input type="text" name="key">
<input type="submit" name="search" value="検索">
</form>

ログ表示PHP(view.php)
$key = "%";
if (isset($_POST['key'])) {
$key = (get_magic_quotes_gpc()) ? $_POST['key'] : addslashes($_POST['key']);
}
$sql = "SELECT * FROM shop WHERE todohuken='XX' ";
if(strlen($key) > 0){
$key = str_replace(" ", " ", $key);
$array = explode(" ", $key);
$and = "AND ";
for($i=0; $i<count($array); $i++){
$and .= "address LIKE '%$array[$i]%'";
if($i < count($array)-1){
$and .= " AND ";
  }
 }
}
mysql_select_db($database_connDB, $connDB);
$Recordset1 = mysql_query($sql.$and.";", $connDB) or die(mysql_error());

投稿日時 - 2006-09-15 02:37:52

QNo.2407465

すぐに回答ほしいです

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

がると申します。
とりあえず、addslashes自体に脆弱性があります………困ったことに。
http://www.st.ryukoku.ac.jp/%7Ekjm/security/memo/2006/02.html#20060212_addslashes
http://itpro.nikkeibp.co.jp/article/COLUMN/20060530/239359/?ST=lin-server&P=2
http://d.hatena.ne.jp/hoshikuzu/20060211#P20060211PHPSQLINJECTION
http://opentechpress.jp/security/article.pl?sid=06/05/31/0737235
などをご覧になってみてください。

投稿日時 - 2006-09-15 12:00:59

お礼

がるさん、前回に引き続きご丁寧な回答ありがとうございます。
addslashes関数を使うことの危険が認識できました。
今回はmysql_escape_string関数を使用しようと思います。
ありがとうございました。

投稿日時 - 2006-09-16 11:47:07

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

mysql_real_escape_string
もあります。

参考URL:http://www.php.net/manual/ja/function.mysql-real-escape-string.php

投稿日時 - 2006-09-15 12:06:03

お礼

そうですね。
mysql_real_escape_string関数の存在は知っていたのですが、今回はPHPの4.3.XXでの運用を考えているので、mysql_escape_string関数を使用するつもりです。
ご回答いただき、ありがとうございました。

投稿日時 - 2006-09-16 11:49:35

ANo.1

addslashes関数よりも、mysql_escape_string関数を利用した方が良いのではないかと思います。

投稿日時 - 2006-09-15 11:32:59

お礼

ご回答ありがとうございます。
私も最近本で調べたところ、addslashes関数よりも、mysql_escape_string関数やmysql_real_escape_string関数を使用した方が良いという記述は拝見しました。
やはりaddslashes関数には脆弱性があるのですね。
参考になりました。

投稿日時 - 2006-09-15 21:02:40

あなたにオススメの質問