• ベストアンサー

文字が正しく表示されない

PHPを使っていますが、文字化けというわけではないのですが フォームからPOSTで送信して、画面に表示したときなどに、 例えば「十一」という文字が「十\一」というように「\」が 入ってきます。 このほかにも、特定の文字の部分で「\」が入って表示されて しまいます。 メールを送信したりしたときも、メール本文の中に「\」が入って 表示されたりします。 これは、エンコードの変換が悪いからなるのでしょうか。 どうも、理解できません。 解決法のヒントになる部分だけでも結構ですので、どなたか 教えていただけ無いでしょうか。

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

  • ベストアンサー
回答No.1

まず,本題に入る前に。 HTTPやHTMLに関する知識が多少必要 クロスサイトスクリプティング http://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html について一読をお願いする。 ポイント: ★そのまま出力してしまうと問題のある文字列があることがある。 ★これを ちゃんと出来るようにする為に「入力時」のValidationと「出力時」のSanitizationが重要 ★Sanitizationは出力時に状況に応じて行わなきゃいけないのに入力時に行おうとする解説が蔓延。 ★動けばいいやというプログラマには,絶対なるな! ★正しく出力時にやりましょう。 =========================== ■PHPにはマジッククオートという機能があり,デフォルトで有効 ユーザーが送信した内容に ' " \ 等が含まれていたとき, プログラムから文字列を取得しようとすると \' \" \\ という文字列になっている。 こうすればこの辺のことに詳しくない初心者の開発者がプログラムを組んでも XSSとかSQLインジェクション系の攻撃を受けないぜ! ヤッタネ! ……本当にそうか? 今回の内容をちゃんと理解しているプログラマに作らせればいいだけの話で, 熟練ユーザーにとってはわざわざ取り除かなきゃいけない分面倒だろう。 これは「入力時」にやっているよね…。「出力時によって異なる」Sanitizationの処理を決め打ちするのもまずかろう。 ========================================================= 面倒なだけならまだいい。問題は日本語のようなマルチバイト文字が絡んできた場合だ。 PHPの多くの関数はASCIIコードに含まれる1バイト文字(UTF-16除く)を前提としていて, それら以外に中国語日本語韓国語のようなマルチバイトのバイト列に対しても複数バイトをまとめて, ではなく1バイトずつ切り離して各バイトに対して処理を行う。 今回の主原因の話だが,Shift_JISを使ったとき,この'"\等と同じバイトが含まれるバイト列で表現される文字があり, http://shoulder.jp/archives/009250.php それをマジッククオート機能が誤認して\をくっつけると今回のような事態に陥る。 こういう文字列と,これらによって保護されていない,プログラムのリテラルによるものをうっかりプログラマがくっつけちゃったりする。 #一応addslashesとかいう関数がある。 さらに,一般的にマジッククオートの機能によって付けられた\を取り除くものとして用意されているものに,stripslashesという関数が一応ある http://jp.php.net/stripslashes これまた1バイト文字前提だと思う。(問題が起こるかはあまり考えてない) ========================================================== そういうわけでこんなトラブルを引き起こしたくないので PHPのソースコードはこういうバイト列のが含まれないEUC-JPやUTF-8がよく使われる。 もちろん最初っからマジッククオートの機能を無効にしておけばいいんだけどね☆ PHP 5.3.0から公式に非推奨になって,6.0.0にはないらしい。

ityounomi
質問者

お礼

ものすごく勉強になりました。 この画面コピーして、勉強します。 ありがとうございました。

その他の回答 (1)

  • tom233
  • ベストアンサー率17% (61/352)
回答No.2

質問者はS-JIS(今回のはS-JISのダメ文字が原因)で作っているのだろうけど サーバサイドのシステムの場合EUC-JPかUTF-8で作った方がいいよ。

ityounomi
質問者

お礼

フォームからポストして、別ページで受けて表示すると。 \が入りました。shift_jisがいけないようですね。 ありがとうございました。

関連するQ&A