• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:stringaddslashes 半角¥が消える)

stringaddslashes 半角¥が消える

このQ&Aのポイント
  • 変数をSQL文のinsertを用いてDBに格納する際、アポストロフィの入った変数ではinsertが正常に行われず、レコードが作成されない問題が発生しました。
  • mysql_real_escape_stringaddslashes 関数を使用することで、アポストロフィも正常に格納されるようになりましたが、半角バックスラッシュを含む文字列は消えてしまいます。
  • エスケープのためにバックスラッシュを置き換える方法を試しましたが、うまくいきませんでした。最悪の場合はaddslashesを使用する必要がありますが、セキュリティ上の懸念もあります。

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

今現在、どういう手順でDBに格納されていますか?「mysql_real_escape_stringaddslashes」という関数はありませんが、mysql_real_escape_stringとaddslashesを両方通しているわけではありませんよね。mysql_real_escape_stringのみということでよろしいでしょうか。   ・http://jp2.php.net/manual/ja/function.mysql-real-escape-string.php たとえば、下記のようなテストソースで確認すると、問題なくinsertされます。 <?php mysql_connect('localhost', 'username', 'password'); mysql_select_db('database'); // リテラル $sql = sprintf("insert into testtable (id, a, b) values (%d, '%s', '%s')", 1, mysql_real_escape_string('\100'), mysql_real_escape_string('it\'s fine day')); mysql_query($sql) or die(mysql_error()); // 変数 $id = 2; $a = '\123,456'; $b = 'it\'s rainy day'; $sql = sprintf("insert into testtable (id, a, b) values (%d, '%s', '%s')", $id, mysql_real_escape_string($a), mysql_real_escape_string($b)); mysql_query($sql) or die(mysql_error()); // 結果確認 $sql = "select * from testtable"; $res = mysql_query($sql) or die(mysql_error()); while ($row = mysql_fetch_array($res)) { print "<pre>"; print_r($row); print "</pre>"; print "<hr>"; }

raryrary
質問者

お礼

ごめんなさい。 なぜかできました。 質問にあげたソースより前のほうに、 別の作業で(メール送信用) if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} とかいてあったたところを if (get_magic_quotes_gpc()){$var = stripslashes($var);} に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。

raryrary
質問者

補足

>mysql_real_escape_stringとaddslashesを両方通しているわけではありませんよね。mysql_real_escape_stringのみということでよろしいでしょうか。 ごめんなさいコピペミスです。 mysql_real_escape_stringのみです。 こんなソースです。 ※magic_quotes_gpc=off ※文字コードはUTF-8 ※サーバーはさくらインターネット ------------- if(get_magic_quotes_gpc()) { function mres($str){ return mysql_real_escape_string(stripslashes($str)); } }else{ function mres($str){ return mysql_real_escape_string($str); } } $Pt_data = mres($_POST['変数']); $Pt_data = mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data = preg_replace('/&/','&',$Pt_data); $sql = "INSERT INTO `tb` ('$Pt_data') VALUES ('$Pt_data')"; $ret = mysql_query($sql); if($ret){ print "<p">入力できました</p>";} else { print "<p"></p>";} --------------- formの変数に 「\100\\100」といれると、「100\100」と表示されます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.5

#2です。 >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} > >とかいてあったたところを > >if (get_magic_quotes_gpc()){$var = stripslashes($var);} > >に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。 get_magic_quotes_gpcのチェックが逆ですよね。最初のソースではmagoc_quotes_gpcがoff(つまり、== 0 が真)の環境なのに、stripslashesを通してしまっているので「\」は落ちて当然です(magic_quotes_gpcで付加されたと判断されてしまう)。この時点でおかしくなっているわけですから、SQL文を生成する前の段階の各変数の値をprintしていればmysqlへ格納するときのescape処理の問題じゃないことはわかったと思います。 とはいえ、格納前には(addslashesではなく)mysql_real_escape_stringを通すべきですから、結果的には良かったのかもしれません。

raryrary
質問者

補足

そうなんです、 >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} は完全に逆ですよね、もしつけるなら  if (get_magic_quotes_gpc()==0){$var = addslashes($var);}  をしたうえで、エスケープ? それは完全にミスだったのですが、 私が疑問なのは、メール送信用に記述したものと 完全に別のソースなのになぜか >if (get_magic_quotes_gpc()==0){$var = stripslashes($var);} を通過しているみたいなんです。 通過した後で、あらためて$_POST[変数]と読み込んでいるのにもかかわらず。です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

私だったらmysql_real_escape_string()はデータベースに突っ込む直前に掛けます。 つまり $Pt_data= mres($_POST['変数']); $Pt_data= mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data= preg_replace('/&/','&',$Pt_data); ではなく、 $Pt_data = $_POST['変数']; $Pt_data= mb_convert_kana($Pt_data, "K", "UTF-8"); $Pt_data= preg_replace('/&/','&',$Pt_data); $Pt_data= mres($Pt_data); てな順番で。

raryrary
質問者

お礼

ありがとうございます。 本件とは直接関係なさそうですが、このやり方も参考にします!

全文を見る
すると、全ての回答が全文表示されます。
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

↓これを回答した(もはや質問者さんとの交換日記状態で誰も読まないと思う)関係で、ちょっと この質問にも回答させていただきたいと思います。 http://questionbox.jp.msn.com/qa7060370.html んで、#2の補足 見ました。 ↓ここ if(get_magic_quotes_gpc()) { function mres($str){ return mysql_real_escape_string(stripslashes($str)); } ん?stripslashes?? ここで円マーク 削っちゃってません? あー、俺が これ書いてる間に #2にお礼もついてますね。 > に直したところ、Mysqlのほうも直りました。原因はわかりません・・・。 stripslashes() を通ってないから直ったんですよー。っと思います。

raryrary
質問者

補足

交換日記、SQLインジェクションなどの勉強になりそうなので また時間をとって読んでみます。 みなさまへのお礼はまた改めて。今日は野球を見せてください。

全文を見る
すると、全ての回答が全文表示されます。
  • pQ2MZc53
  • ベストアンサー率12% (1/8)
回答No.1

> どうもaddslashesのほうはセキュリティ上、前者に劣るとも聞きましたので、 どこかで聞きかじった情報じゃなくて、公式ドキュメントを見れば済む話なのに…が率直な感想です。 mysql_real_escape_string http://php.net/manual/ja/function.mysql-real-escape-string.php 引用 mysql_real_escape_string() は、MySQL のライブラリ関数 mysql_real_escape_string をコールしています。 これは以下の文字について先頭にバックスラッシュを付加します。 \x00, \n, \r, \, ', " そして \x1a. addslashes http://php.net/manual/ja/function.addslashes.php 引用 データベースへの問い合わせなどに際してクォートされるべき文字の前に バックスラッシュを挿入した文字列を返します。 クォートされるべき文字とは、シングルクォート('), ダブルクォート("),バックスラッシュ (\) ,NUL (NULL バイト) です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • mysql_real_escape_string

    mysql_real_escape_stringについて調べていると、私と同じことを疑問に思い質問している人がいました。 こちらのページです。 http://okwave.jp/qa/q4423735.html mysql_real_escape_stringを通してDBに入れるとします。 すると、「テスト\」というデータをINSERTをするとDBには「テスト\」で入るのでしょうか? では、mysql_real_escape_stringを通さずにdbに入れても 「テスト\」というデータをINSERTをするとDBには「テスト\」で入ると思います。 上記のとおりとした場合、PHPはどうやってmysql_real_escape_stringを通したかどうか判定しているのでしょうか? 現在、mysql_real_escape_stringを通してDBに入れると、 「テスト\\」というデータがDBに入っています。 それをどうやって戻すのか調べていて、上記の質問を見つけました。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • array_mapを使ったエスケープ処理

    MYSQLとPHPでアプリケーション作成している初心者です。 今まで一つ一つの項目をmysql_real_escape_stringに通していたのですが今日、array_mapという関数がある事を知りました。 今まで自分がやっていたように項目毎に data1 = mysql_real_escape_string($_POST['data1']); data2 = mysql_real_escape_string($_POST['data2']); ...(省略) とするのは項目が増えれば増えただけ作業量も増えてしまうので $postdata = array_map("エスケープ関数",$_POST); としてPOSTされたデータは一括してエスケープ用関数を通そうかと思っています。 参考書などでこのような方法でエスケープ処理をしているのを見た事が無いの不安なのですが(googleで調べると結構やっている人がいました)、このやり方で何かデメリットはあるでしょうか?

    • ベストアンサー
    • PHP
  • キーワード検索について

    DB(mysql)内をキーワード検索する場合、 Like '%key%' などのようにLike検索をすると思うのですが、 一つ疑問なのが、「%」をキーワードとして検索したい場合は Like '%%%' となってしまい、すべてを表示してしまいます。 「%」をキーワードにした場合はどのような処理を行えば良いのでしょうか? あと、もう一つ分からないのが、mysql_real_escape_stringなどの関数でエスケープをしてDBに登録した場合、例えば、「&」は「&amp;」に変換されてDBに登録されると思うのですが、検索のキーワードを「amp」として検索すると、この「&amp;」までもがヒットしてしまいます。 これはどのようにして対処すれば良いでしょうか? DBに登録されるときに、エスケープされた文字が元に戻るようなことは期待できないでしょうか。 アドバイスをよろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_real_escape_stringについて

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

    • ベストアンサー
    • PHP
  • sqlite_escape_stringのアンエスケープ方法

    sqliteのエスケープ方法としてPHPマニュアルでは sqlite_escape_string() を利用することが望ましいと 記述されています。 実際にsqlite_escape_string() を使用してDBに格納するのは 問題ないのですが、データを取り出したときに エスケープされたままで出てきます。 アンエスケープする方法はどのようなものでしょうか? str_replace("'","''",取り出した文字列); とかではないですよね・・・。

    • ベストアンサー
    • PHP
  • SQLインジェクション対策(クオーテーション関連

    PHP Version 5.4.7の環境にて。 SQLite3::escapeStringを使って、 SQLインジェクション対策をしようと考えています。 HTMLの<form>からPOSTで値を受け取り、 その値をSQL文に入れ込み、 そのクエリ(※ちなみに、INSERTのみです。)をSQLite3のDBに対して行う、 なんてことをする際の、 SQLインジェクション対策として、お考え下さい。 POSTで受け取る値に入っていたら危険なものとして、 「シングルクオーテーション」が、まず、挙げられるかと思います。 「'」 ←これです。 さて、「"」 ←こちらはダブルクオーテーションですが、 こちらのダブルの方はエスケープする必要は無いのでしょうか? (例)※wikipediaより SELECT * FROM users WHERE name = '(入力値)'; SELECT * FROM users WHERE name = 't' OR 't' = 't'; → このSQL文では条件が常に真となるため、 nameカラムの値にかかわらず、全レコードが選択される。 → ということで、入力値に、 エスケープされていない「シングルクオーテーション」をそのまま使うのはNG。 ここまではOKです。 では、次に、ダブルクオーテーション版で、 SELECT * FROM users WHERE name = "(入力値)"; SELECT * FROM users WHERE name = "t" OR "t" = "t"; こちらはどうなのでしょうか? (シングルをダブルに変えただけですが。) ---------- ちなみに、 SQLite3::escapeString にて、 (1) $var = "Let's"; //←シングルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let''s と表示される (「 ' 」が1つ追加される。) (2) $var = 'Let"s'; //←ダブルクオーテーション $db = new SQLite3(':memory:'); $escaped_var = $db->escapeString($var); echo $escaped_var; //Let"s と表示される (何も追加されず。) というように、 シングルクオーテーションはエスケープされるが、 ダブルクオーテーションの方ではエスケープされませんでした。 これは、つまり、 ダブルクオーテーションの方は危険視されていない、 ということだと思いますが、 でも、本当にダブルクオーテーションをエスケープせずに、 そのまま、SQL文につっこんでも大丈夫なのでしょうか?

    • ベストアンサー
    • PHP
MG5130をWindows11で使いたい
このQ&Aのポイント
  • MG5130をWindows10で使っていましたが、PCが壊れたためWindows11に買い換えましたが、ドライバーをインストール出来ません。
  • MG5130を新しく買ったPCで使うことは出来ないのでしょうか?
  • キヤノン製品についての質問です。
回答を見る

専門家に質問してみよう