- ベストアンサー
mysql_real_escape_stringについて
素朴な疑問です。。 SQLインジェクション?の対策でSQLにINSERT時にmysql_real_escape_stringを使っています。 「テスト\」というデータをINSERTをすると DBには「テスト\\」で入ります。 そのまま取り出してしまうと「テスト\\」で出力されるのですが。 このときの出力時の処理はstripslashes()を使っているのでしょうか? 他にもっと簡単な方法等があれば教えてくださいm(__)m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>php.iniでOFFになっております。 それなら、問題なさそうですね。何でだろう? >mysql_real_escape_stringを使ってINSERTしたときに\が付いたままDBに入るのはおかしいということでしょうか? 私のところでは、発生しないですね。 もしかして、mysql_real_escape_stringを2回通してしまってるとかないですか? もし差し支えなかったら、ソースを見られれば、もうすこしヒントになるかもしれません。
その他の回答 (2)
- sgcarrot
- ベストアンサー率68% (17/25)
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から取り出すときに、 上記のような加工がされるので、これも要注意。
補足
回答ありがとうございます! 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)
http://oshiete1.goo.ne.jp/qa4135755.html でも、似た質問に答えた覚えがあるのですけどmysql_real_escape_stringの前に、magic_quotes_gpc で既にescape されているのでは?
補足
回答ありがとうございます。 magic_quotes_gpc はOFFにしてまして、 mysql_real_escape_stringを使用しなければ「テスト\」でデータがINSERTされます。 mysql_real_escape_stringを使うと「テスト\\」でINSERTされ、 SELECTで取り出したとき「テスト\\」になりますので・・・ stripslashes()を使うしかないですよね・・・?
お礼
回答ありがとうございました。 申し訳ないです・・・ 勘違いをしておりました。 おっしゃるとおり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))); こんな感じになっていました。 お恥ずかしいです・・・