最速怪談選手権

独学数ヶ月の初心者の質問で恐縮です。

もろもろの事情で仕方なくmysql_real_escape_stringを
以下(1)のように使用しなくてはならないと仮定し、
セキュリテイの面で(2)のようにシングルクオテーションつける
事で危険を回避できますか?

またシングルクオテーションは(2)のようにつけてはいけない
とかありますか?(記述の基本が曖昧なため、ただの確認の質問)

(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)
$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)’);


よろしくお願いします。

A 回答 (3件)

まずmysql_real_escape_string自体がmysql系の古い関数なので非推奨です。


独学で学習されているのでしたら、参考にしている書籍やサイトを新しいものに変えてください。
最低でもmysqli系の処理に置き換えてください。

また$idや$passwordなど管理側が仕様を指定できるものは
・m文字以上でn文字以下であること
・構成文字が英数字のみに限られること
などをチェックして、そうでない場合はエラーを返すような仕様にしておけば
あえてエスケープする必要はありません

任意の文字列を利用して検索をかけたりするような場合はPDOを利用し、
プリペアドステートメントで処理するのが妥当だといわれています。
    • good
    • 0
この回答へのお礼

詳しいご回答と、アドバイスありがとうございます。

管理側で仕様を指定する事でエスケープが不要というのは
勉強になりました。(m文字以上n文字以下、の意味が
ちょっとわからないので勉強します。)

ありがとうございました。

お礼日時:2013/03/11 12:51

「mysql_real_escape_stringを使うな」というのが正論なのですが、



>もろもろの事情で仕方なくmysql_real_escape_stringを

ということなので、回答しようかと思いましたが、(2)のようなプログラムを書く人であれば、やはり、生のmysql関数は使ってはいけません。

>PDOを利用し、プリペアドステートメントで処理する

でしょうね。それ以前にPHPの基本的な事柄についての理解を深める必要があります。

>$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)’);

を実行すると、$sql は、

SELECT id , password FROM `adminDatabase` where id = 'mysql_real_escape_string($id)' and password = 'mysql_real_escape_string($password)' order by id

になりますよ。
    • good
    • 0
この回答へのお礼

ご指導ありがとうございます。
シングルクオテーションで囲むと、囲まれたところが全て
文字になってしまうという事ですね。

勉強不足を解消したくググッてもうまく求めているものに対する
答えに到達できません。

(危険回避にシングルクオテーションを使用する事を
どこかで中途半端に覚えてしてしまったのが混乱の始まりです。)

PDOで書くのが良い等の情報も得ていますが、色々もろもろの事情で仕方なく
あえてmysql_real_escape_stringを使わなくてはいけないと仮定した場合、
本当にプログラムを熟知している人は、この条件化でどのように記述するのか
が知りたかったです。

色々ありがとうございます。
もっともっとがんばって調べてみます。

お礼日時:2013/03/11 23:42

(2)だとそもそも、変数を展開しないでしょう。

    • good
    • 0
この回答へのお礼

>(2)だとそもそも、変数を展開しないでしょう。

それは全角シングルクオテーションで打ってあるから
展開しない、という意味でしょうか?
すばやくご回答いただき、ありがとうございました。

ちなみに、半角シングルクオテーションのところを
まちがえて全角で打ってしまいました。(それは無視して
いただければと思います。)

お礼日時:2013/03/11 12:47

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