PHP 実験室 【覚書 予期しないエスケープ文字】

PHP にて掲示板などを作成し、めでたく完成。いざ、公開したら書き込みの所々に勝手に「\」(バックスラッシュ)がついてしまった、なんてことはないでしょうか。例えば、「パソコン」→「パソ\コン」、「表示」→「表\示」のような感じで。これは、PHPの設定ファイル(PHP.ini)の「magic_quotes_gpc」という項目がONに設定されているためです。「magic_quotes_gpc」がON設定となっている場合、フォームから受け取った文字の中に「\(バックスラッシュ)」「"(ダブルクォーテーション)」「'(シングルクォーテーション)」があった際、その後ろに自動で「\」をつけるのです。こちらは「エスケープ処理」と言い、悪意あるユーザに不正な処理(SQL injection なんて有名ですね)をさせないためにも有効な設定となっています。で、S-JIS の文字コードには「0x5c」を含むものがあり、「0x5c」が「\」と同じ文字コードであることがそもそもの問題なのです。たとえば、「パソコン」の「ソ」のコードは「0x83 0x5c」なので、「パソコン」→「パソ\コン」となるわけですね。

原因が分かれば対処方法もおのずと見えてきます。まず、真っ先に思いつく方法として「PHP.ini」内の「magic_quotes_gpc」を「OFF」にすることが挙げられます。簡単ですが、問題もあって・・・。まず、レンタルサーバなど共用にてWebサーバを使用している場合にはこの設定は勝手に書き換えることができません。自分だけの都合で他人様に迷惑かけちゃだめですよね。まぁ、可能性としてサーバの管理者が「Apache」の「AllowOverride」の設定を「ALL」にしてくれているならば、「.htaccess」でユーザごとにこの制御が可能です。「.htaccess」ファイルの中に以下の1行を加えて下さい。

php_flag magic_quotes_gpc off

これで一応は解決できるのですが、既述の通りこれではセキュリティに不安が残ります。そこで、次のように不要なときにはバックスラッシュを取り除く処理を加えてやる方法をお奨めします。

php_flag magic_quotes_gpc off
  if (get_magic_quotes_gpc()) {
    $str = stripslashes($str);
  } 

stripslashe」はバックスラッシュが取り除かれた文字列を返します(2つ並んだバックスラッシュは1つのバックスラッシュになります)。逆に必要項目にバックスラッシュを加えたい場合は「addslashes」を使用します。こちらはデータベースへの問い合わせなどに際してクォートされるべき 文字の前にバックスラッシュを挿入した文字列を返します、とのことです(PHPマニュアル参照)。