• ベストアンサー

PHPの文字列のエスケープについて

php.iniの設定で「magic_quotes_gpc = On」なっており、htmlentities($str, ENT_QUOTES)で、ダブルおよびシングルクオートを共に変換します。 しかし、シングルクオートがエスケープされて、「'」になるのですが、これを「'」に変換しなければなりません。 (そんな依頼を受けて、プログラミングをしていますが、全くうまくいきませんorz。) 単純に考えて、シングルクオートをエスケープしなければよいと思うのですが、 フォームのデータを受けとるときに、シングルクオートをエスケープしなければならないとマズイことでもあるのでしょうか? 変な質問ですが、宜しくお願いします。

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

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

  • ベストアンサー
  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.4

フォームを受け取った時点では何も問題ないと思います。 受け取ったデータを元にSQL文を作成するときにはエスケープしないと問題になるかもしれませんね。 実装しだいだとは思いますけど。

becks09
質問者

お礼

確かに、実装しだいですね。 今回のは、データーベースのほうで、 エラーが起こるので、マズイケースでした....orz。

その他の回答 (3)

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

フォームのデータを受け取るときには全然マズイことはないです 後はそのデータをどう使うかでまずかったりまずくなかったりです

becks09
質問者

お礼

たしかに、おっしゃるとおり、 データによりけりですよね。 参考になりました。 ありがとうございました。

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

元に戻すなら最初から変換しないでもいいでしょう

becks09
質問者

補足

あのですね、 「マズイことでもあるのでしょうか?」と、聞いているだけです。 根本的に、最初からエスケープしなければ良いというのは、当たり前のことなので。

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

警告 この機能は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除されます。この機能を使用しないことを強く推奨します。 問題なさそうならOffでいいと思いますが。

becks09
質問者

お礼

そうなんですよねー。 htmlentities($str, ENT_COMPAT)としても問題なさそうなんですよー。 >HP 6.0.0 で削除されます。 これは知りませんでした、貴重な情報です。 ありがとうございます。

関連するQ&A

  • PHP+MySQLでエスケープされたデータを格納したい。

    php.iniの設定でmagic_quotes_gpc = Offにして、 mysql_real_escape_stringで出力エスケープしたデータを MySQLに格納するとバックスラッシュが格納されない。 エスケープされたデータを格納したいです。 php.iniの設定 --------------------------------------------------------- ; Magic quotes for incoming GET/POST/Cookie data. ; magic_quotes_gpc = On magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of '). magic_quotes_sybase = Off --------------------------------------------------------- $_POST['us_fname']には「'user'」という文字列が格納されています。 --------------------------------------------------------- $clean['us_fname'] = $_POST['us_fname']; $mysql['us_fname'] = mysql_real_escape_string($clean['us_fname']); $sql = "insert into table ( us_fname ) values ( '".$mysql['us_fname']."', ) "; --------------------------------------------------------- echo $mysql['us_fname']; で確認すると「\"user\" 」となっているんですが、 MySQLの中を確認すると「'user'」のままでシングルクォートがエスケープされていません。

    • ベストアンサー
    • PHP
  • エスケープ解除

    以下のようなPHP構文の時に、 magic_quotes_gpcがOnであっっとしたら、 どのようにエスケープを解除すればいいのでしょうか? // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k = $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); }

    • 締切済み
    • PHP
  • メールフォームが文字化けします、、、、

    メールフォームが文字化けします、、、。 「申します」→「垂オます」 とかなってしまいます。 また、「(1)」とかは「?」になってしまいます。 いろいろ調べてみたんですがこの辺かなぁとは思います。 ちなみにプログラミングなどド素人です。 ____________________________ if(get_magic_quotes_gpc()){$str = stripslashes($str);} //¥除去 return $str; } ____________________________ アドバイスお願い出来ましたら幸いです。><;

    • ベストアンサー
    • PHP
  • 文字列中のシングルクォートにエスケープシーケンスは必要?

    C言語でダブルクォートで囲まれた文字列内で使われる、「\」で始まるエスケープシーケンスがありますよね。例えば、 「\n」 ⇒ 改行 「\t」 ⇒ タブ 「\"」 ⇒ ダブルクォート 「\\」 ⇒ バックスラッシュ などですが、C言語のリフェレンスを見ると「\'」(シングルクォート)や「\?」(クエスチョンマーク)なども載っていました。でもこれらの文字は、実際はエスケープシーケンスを使わなくても、ちゃんとコンパイルされ表示もされます。 「'」や「?」をC言語の文字列内で使うには、公式には「\」が必要なんでしょうか?

  • エスケープ文字にstr_replaceが効かない

    フォームで送信された文字列のうち、str_replace関数を使って半角記号を全角記号に置換したいのですが、一部のエスケープ文字が含まれている文字列の置換が上手くいきません。 ソースは以下に記しますが、現状では、"(ダブルクォート)は\&quot;、&(半角アンド)は&amp;と置換されてしまいます。 この場合であれば、”(全角ダブルクォート),&(全角アンド)と出力させたいのですが・・・ どなたかお気づきの点ありましたらご教示宜しくお願いします! ===============ソースコード================================= <?php $system = ""; if (isset($_POST["submit"])) { $system = htmlspecialchars($_POST["system"], ENT_QUOTES); $system = mb_convert_encoding($system, "EUC-JP", "SJIS"); $system = str_replace('&', '&', $system); $system = str_replace('"', '”', $system); $system = str_replace('あ', '”', $system); $_SESSION["system"] = $system; } $str = <<<STRING <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <form method="post" action="{$SERVER['PHP_SELF']}" enctype="multipart/form-data" > <textarea name="system" cols=40 rows=5 wrap=soft>{$system}</textarea> <input type="submit" name="submit" value="送信"> </form> ----------------------------------------------------------<br> {$_SESSION["system"]} </body> </html> STRING; $str = mb_convert_encoding($str, "SJIS", "EUC-JP"); echo $str; ?> ============================================================ ちなみに、『あ』→『”(全角ダブルクォート)』と、正しく置換されます。

    • ベストアンサー
    • PHP
  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • .htaccessでmagic_quotes_gpcの値を変更できない

    .htaccessファイルに下記の内容を記述して、magic_quotes_gpcの値を変更したいのですが、変更内容が反映されません。 php_flag magic_quotes_gpc off (php.iniで指定すると変更内容が反映されることは確認済みです) magic_quotes_gpcの属性は、「PHP_INI_PERDIR」なので.htaccessファイルから変更できると思うのですが・・・。 環境は以下のとおりです。 OS:WindowsXP サーバー:XAMPP 1.6.4(PHP5、apache2.2) 原因について何かご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • parse_ini_fileでダブルクォートを含む値

    parse_ini_fileで読取る設定ファイルでは、 ダブルクォートを含む値を用いることはできないのでしょうか。 ダブルクォートを含んだ値を記述したかったのですが、 設定ファイルのパースエラーになるか、途中で値が切れてしまいました。 以下を試しました。 (PHP 5.0.4 です。) <テストコード> <?php print_r(parse_ini_file("test.ini")); ?> <設定ファイル test.ini の内容> (ダブルクォートを含む) key=val"ue --> 値がvalになる (ダブルクォートをエスケープ) key=val\"ue -->値がval\になる (全体をダブルクォートで囲んで中のダブルクォートをエスケープ) key="val\"ue" -->値がval\になる (全体をダブルクォートで囲んで中のダブルクォートを二連化) key="val""ue" -->パースエラーが発生し、値がvalになる (全体をシングルクォートで囲む) key='val"ue' -->値が'valになる マニュアルで以下の文が気になったのですが・・。 ( http://jp.php.net/manual/ja/function.parse-ini-file.php ) ----- 引用 ここから ----- 次の文字 {}|&~![()" は、キーで使ってはいけません。 また、値の中で特別な意味を持ちます。 ----- 引用 ここまで ----- ダブルクォートが「値の中で特別な意味」を持つ文字として 指定されていますが、具体的にどのような意味を持つのか分かりませんでした。 ですが、キーとしては禁止されているものの、値に含まれる文字としては禁止されていないようだったので・・。 どなたか詳しい情報ご存知の方いましたらご教授ください。

    • ベストアンサー
    • PHP
  • PHPの文字化け

    PHP4.3、Apache2.0.46を利用しています。 htmlタグ内でのテキストは正しく表示されるのですが returnやechoなどで表示させると文字化けしてしまいます。 PHPのスクリプトは全てEUCで記述されています。 化け方は、例を挙げると ※入力されたID、パスワードが正しくありません。 ↓ ※ュID鴻・若罩c障 のようになります。 php.iniの文字コードまわりの設定は output_buffering = Off magic_quotes_gpc = Off mbstring.http_output = EUC-JP mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none となっています。 どうかお知恵をお貸しくださいませ。

    • 締切済み
    • PHP
  • HTMLは、シングルクォートかダブルクォートか?

    HTMLで、<img src="images/spr2002.gif" width=130 height=130 border=0 alt="写真"> などクォート文字列がよくでてきますが、文法的にはシングルクォートかダブルクォートのどちらでもOKなのでしょうか? 大抵のHTMLエディタではダブルクォートを採用している事が多いようですが、私的には、PerlやPHPのprint文などでクォート文字列をエスケープする必要がないので、シングルクォートが良いような気がするのですが、みなさん、どちらが望ましいと思われますか?

    • ベストアンサー
    • HTML

専門家に質問してみよう