• ベストアンサー

mysql_real_escape_stringについて

素朴な疑問です。。 SQLインジェクション?の対策でSQLにINSERT時にmysql_real_escape_stringを使っています。 「テスト\」というデータをINSERTをすると DBには「テスト\\」で入ります。 そのまま取り出してしまうと「テスト\\」で出力されるのですが。 このときの出力時の処理はstripslashes()を使っているのでしょうか? 他にもっと簡単な方法等があれば教えてくださいm(__)m

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

  • ベストアンサー
  • sgcarrot
  • ベストアンサー率68% (17/25)
回答No.3

>php.iniでOFFになっております。 それなら、問題なさそうですね。何でだろう? >mysql_real_escape_stringを使ってINSERTしたときに\が付いたままDBに入るのはおかしいということでしょうか? 私のところでは、発生しないですね。 もしかして、mysql_real_escape_stringを2回通してしまってるとかないですか? もし差し支えなかったら、ソースを見られれば、もうすこしヒントになるかもしれません。

kaz33
質問者

お礼

回答ありがとうございました。 申し訳ないです・・・ 勘違いをしておりました。 おっしゃるとおりmysql_real_escape_stringを2回通していることになっていました。 PearのDB.phpを使っていたのですが、DB.phpにはmysql_real_escape_stringがないと思い込んでしまい・・・ $con->query("INSERT INTO tb VALUES(?)", array(mysql_real_escape_string($val))); こんな感じになっていました。 お恥ずかしいです・・・

その他の回答 (2)

  • sgcarrot
  • ベストアンサー率68% (17/25)
回答No.2

ANo.1さんの指摘しているようにマジッククォートが有効になっている可能性が非常に高いです。 >magic_quotes_gpc はOFFにしてまして、 どのような方法でOFFにしてますか。ini_setでセットしたりしてないでしょね? 念のため phpinfo で再度以下の内容を確認してみてください。 magic_quotes_gpc ⇒onになってるとGET/POST/COOKIEの値が加工される。          kaz33さんの言う通りDB内に加工された状態で値が          入っているのなら、これがonになってる可能性高。 magic_quotes_runtime⇒onになってると、DBから取り出すときに、          上記のような加工がされるので、これも要注意。

kaz33
質問者

補足

回答ありがとうございます! php.iniでOFFになっております。 phpinfo()でも確認しました。 magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off mysql_real_escape_stringを使ってINSERTしたときに\が付いたままDBに入るのはおかしいということでしょうか?

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

http://oshiete1.goo.ne.jp/qa4135755.html でも、似た質問に答えた覚えがあるのですけどmysql_real_escape_stringの前に、magic_quotes_gpc で既にescape されているのでは?

参考URL:
http://jp.php.net/manual/ja/function.mysql-real-escape-string.php
kaz33
質問者

補足

回答ありがとうございます。 magic_quotes_gpc はOFFにしてまして、 mysql_real_escape_stringを使用しなければ「テスト\」でデータがINSERTされます。 mysql_real_escape_stringを使うと「テスト\\」でINSERTされ、 SELECTで取り出したとき「テスト\\」になりますので・・・ stripslashes()を使うしかないですよね・・・?

関連するQ&A