限定しりとり

mysqlの危険回避の質問です。
(私がした1つ前に質問したものでは、解決しなかったので再度表現を変えて行います。)

mysqlでwhere句の値に
1 OR effective=0
が入ると危険であり、シングルクオテーションで回避できる、とあるサイトでみました。

それを踏まえ、それまで以下の(1)で動いていたものを(2)にしたら、動かなくなりました。

そこで質問です。
(初めてphpに触れた人に教えるレベルで、かなり噛み砕いて教えていただけたら幸いです。)


■(1)はそのままでは危険という認識でよろしいですか?

■(2)はなぜ動かないのでしょうか?

■(1)を危険のない(もしくは可能な限り危険のない)書き方をするとしたらどうしたら
いいでしょうか?(PDOで書く事!やmysqliがいい、というのは知っています。
どうしてもmysql_real_escape_stringを使わなくてはいけないという条件があったと
想定して強引にやるとしたらどうか、という事でお答えをいただければと思います。)


(1)
$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",
mysql_real_escape_string($id),mysql_real_escape_string($password));



(2)
$id = "'" . mysql_real_escape_string($id) . "'";
$password = "'". mysql_real_escape_string($password) . "'";

$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id",$id , $password );


よろしくお願いします。

A 回答 (1件)

>(1)で動いていたものを(2)にしたら、動かなくなりました



そういうのはprint $sqlしてみて見比べればわかりますよね?

'%s' のところにシングルクォーテーション付きの文字列を入れれば
クォーテーションがダブってます。
あまりお勧めできませんが、あえてやるなら元文字列のシングルクォーテーションを
はずしてみればよいのでは?

$sql = sprintf("SELECT id , password FROM `adminDatabase` where id = %s and password = %s order by id",$id , $password );
    • good
    • 0
この回答へのお礼

ズブの素人なので、大変ありがたいご説明助かります。

printしてチェックというのは、目からウロコでした。
そうチェックするんですね~。

また変な質問にお付き合いいただいた事に感謝です。
本当にありがとうございます。

お礼日時:2013/03/12 12:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!