• ベストアンサー

addslashesによるエスケープ

フォームからのデータをデータベースに登録する際、addslashesを使用して登録データをエスケープしています。 SJISでデータを処理しているのですが、addslashesでエスケープする際に最後がエスケープされるデータの時困っています。 例えば登録したいデータが「サンプル表」などの時、addslashesすると INSERT INTO ・・・・, 'サンプル表\', ・・・ とINSERT文ができるのですが、これだとエラーが出ます。 こういう場合、皆さんはどのような処理をされているのでしょうか? 今は、エスケープする必要のあるデータ処理には INSERT INTO ・・・・, 'サンプル表\ ', ・・・ のように半角スペースを入れて、データを抽出した際、末尾の半角スペースを取り除いています。 他に思いつくのは、登録するデータをエスケープした際に末尾が「\」かどうか調べて、「\」の場合半角スペースなどを挿入するという方法などです。 もっといい処理があれば、ご教授いただければと思います。 よろしくお願いいたします。 長文ですみません。

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

mysqlで直接INSERT INTO ・・・・, 'サンプル表\', ・・・ を入力した場合はエラーになりません phpで"INSERT INTO ・・・・, 'サンプル表\', ・・・" と引用符で囲む場合は下記のようにさらにエスケープを追加する必要があります "INSERT INTO ・・・・, 'サンプル表\\\', ・・・" (php側で1回エスケープ処理され、さらにmysql側で1回エスケープ処理されるため)

fedorars
質問者

お礼

ありがとうございます。 なかなか文字コードのところは悩むところが多くて・・・ よく理解できました。 本当にありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

SJISの「表」はいろんなところで問題がでるため、 やはりEUCなどでデータを管理するのが安全かつ 効率的なのですけどね。

fedorars
質問者

お礼

EUCでできればいいんですけど、そうできない都合があって・・・ ありがとうございました。

関連するQ&A

  • エスケープ文字を登録するには?

    VB.NetよりMySQLのDBへ登録処理を行おうとしています。 画面側で全角文字と半角エンマークを入力された時の 登録結果は、半角エンマークを入れたことにより文字化け が発生してしまいます。 全角文字のみの場合は文字化けもおきません。 どのようにしたら文字化けをおこさずに、半角エンマーク (エスケープ文字)を登録することができるのでしょうか?

    • ベストアンサー
    • MySQL
  • PHPで「®」や特殊文字のエスケープ

    PHPでフォームから送られてきたデータを、MySQLに登録する際に、 「®」や特殊文字をエスケープして登録したいのですが、 どのようにしたらいいのでしょうか。 「<」や「&」などはhtmlspecialcharsでエスケープできているのですが、 「®」や特殊文字(~やm2など)がエスケープできず、 文字化けを起こして困っています。

    • ベストアンサー
    • PHP
  • htmlタグがあるデータのエスケープ処理

    今 phpを勉強していて自分の勉強用にブログを作ろうと思っています。 ですが、その事で分からないことがあり、質問させていただきます。 それは、データベース内にある記事データのエスケープ処理についてです。 記事データを日付順やカテゴリーごとに並べて出力する際にエスケープ処理をすると htmlタグがもちろんそのまま出力されてしまいます。 自分が参考にした本では出力するデータは全てエスケープするべきだと書かれていましたが、 今回のようなケースはどうすればいいのでしょうか? 1, ユーザー入力ではなく、運営者のみが入力するデータの場合、エスケープは必要ないのでしょうか?   その場合セキュリティの問題はないのでしょうか? 2, それとも全ての場合においてエスケープ処理は必要で、htmlタグを含んだデータを   データベースに入れるのが問題なんでしょうか? どなたか回答お願いします。

    • ベストアンサー
    • PHP
  • エスケープ文字の変換

    お世話になります。 今、php+mysqlでシステム作成中なのですが、 エスケープ文字の扱いで悩んでいます。 DBへinsertするデータに、 "c:\sato\仕事\見積もり" という文字列があったとすると、そのままinsertすると、エスケープ文字が無くなり、 "c:sato仕事見積もり" となります。 そこで、str_replace関数で、"\"マークを"/"で置き換え、insertしました。 しかし、違うデータで、 "c:\suzuki\仕事\開発予定表" という文字列をinsertしなければならなくなりました。 ほかの質問でも確認しましたが、最後の"表"という文字は、shift-jisでは文字化けしてします。("・"になってしまいました) 置き換えするなど小細工で何とか回避する方法はないでしょうか?? 現状、php、mysqlともにshift-jisで統一しています。 また、この元データは、shift-jisのCSVファイルから取り込んでいます。 このあたりでの問題は無いのでしょうか? よろしくご教授願います。

    • ベストアンサー
    • PHP
  • stringaddslashes 半角¥が消える

    form(POST)で変数をSQL文のinsertを用いてDBにいれていました。 ある日、アポストロフィ(シングルクォーテーション)の入っている変数があった場合、insert自体がうまくいっておらず、レコードが作られていないことに気づきました。 mysql_connect 以降 insert 以前に、 「mysql_real_escape_stringaddslashes」をいれることで、シングルクォーテーションも 問題なくinsertされるようになりましたが、半角エンマーク(バックスラッシュ?)を入れた場合にその文字が消えてDBに格納されます。 エスケープの記号とみなされてしまいます。 たとえば商品の値段として「\100」と書こうとしても、「100」になってしまいます。 全角でも閲覧するには支障がないので、 str_replace('\','¥',$str); のように修正しようとしてもうまくいきませんでした。 エスケープにエスケープしようとして、 str_replace('\','\\',$str); のように修正しようとしてもうまくいきませんでした。 最悪addslashesに変えないとダメかと思っていますが、 どうもaddslashesのほうはセキュリティ上、前者に劣るとも聞きましたので、このままなんとか「mysql_real_escape_stringaddslashes」で行きたいのですが。 うまい方法があるでしょうか?

    • ベストアンサー
    • PHP
  • 「表」の文字入りのレコードがinsertできません

    何回も質問して申し訳ありません。 サーバ、クライアントともキャラクタセットはすべてsjisに設定したのですが、「表」の文字入りのレコードをinsertしようとエラーになってしまいます。「表」の0x5Cが問題なのでしょうか。 insert into tb1 values(a '表'); とすると、後ろの'が入力してない扱いになってしまうようです。 insert into tb1 values(a '表/'); とすればうまくいくのですが、 statusで Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis となっていても、解決しない問題なのでしょうか。 申し訳ありません。できましたら、どなたかお助けいただければ幸いです。

    • ベストアンサー
    • MySQL
  • Sqliteで使えない文字。

    Sqlite3にて 列名やデータ内で使えない文字列(記号等の文字コード)を教えてください。 調べてみた情報では 改行や区切り文字などの基本的なことしか見つかりませんでしが 実際に使っていると、半角スペース等が混入している場合 全てではありませんが、データベース内で明らかに存在するのに検索できないなどの場合 があるようです。 一つずつ調べてエスケープ処理をすることは現実的に不可能なので 独自にエスケープ処理等を書かれている方に どのような文字列をエスケープしていますでしょうか?

  • Mysqlエスケープ文字回避の構文について

    現在、 開発言語「VBA」 データベース「Mysql」 で開発をおこなっています。SQL構文を実行する際、エスケープ文字が入力された場合、致命的エラーが発生してしまいます。 INSERT INTO T_Test VALUES ( '\','\','\','100','2009/09/02 16:03:26') この場合回避策はどのようにおこなうのがいいでしょうか? 複数画面でSQL文を実行しているところがあるので一番手間のかからない修正方法はないでしょうか?? VALUESでセットしている値は画面のテキストから入力された値などです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PHP prepare フィールド名をエスケープ

    PHPのPDOを用いて、mysqlにクエリを発行する際、 prepare() と bindParam() でエスケープをしています。 しかし、フィールド名やテーブル名をエスケープしようとした場合、 プリペアドステートメントを利用することができません。 例えば 「SELECT * FROM table WHERE {$sample} = :test」 のような状態です。 このような場合、どうやって変数部分を安全にエスケープすべきなのでしょうか?

    • ベストアンサー
    • PHP
  • エスケープしたくない、けど、したいのもある

    とあるテキストデータ(.txt)を読み込み、それを表示するスクリプトをPHPで作りました。 その際、もしテキストデータにHTMLタグが入っている場合、そのまま出力させて、タグが有効になるようにしています。 (というかテキストを何も処理せずそのまま出力するだけ) (セキュリティ的には、テキストデータは信頼できる自サイトの同一ディレクトリに置いてあるものからしか読み込ませないようになっています) しかし、今度は逆に、もしそのテキストデータに「<hoge>」などの文字がふくまれていた場合、ブラウザはそれをタグと認識し、見えない表示になります。 本当は見えるようにそこは「&lt;hoge&gt;」と出力してほしいわけです。 かと言って、 echo htmlspecialchars($txt, ENT_QUOTES|ENT_HTML5, "UTF-8"); などエスケープして出力すると、今度はHTMLタグとして出力させたい「<br>」なども「&lt;br&gt;」として出力されてしまい都合が悪いです.. ようは、 「こんにちは<hoge><br>ほげ」 という文字列のテキストを、 「こんにちは&lt;hoge&gt;<br>ほげ」 と出力してほしい.. もちろんテキストは「hoge」であるとは限りません。 何かよい解決方法はないでしょうか? ご教示頂けましたら幸いです。

    • ベストアンサー
    • PHP

専門家に質問してみよう