マジッククォートの処理
そふぃのPHP入門 >> PHP実践リファレンス >> フォーム処理 >> マジッククォートの処理

マジッククォートの処理

マジッククォートとは

マジッククォートなんて聞きなれない言葉だと思いますが、マジッククォートという設定項目がPHPにあるというだけの事です。デフォルトでONになってるので大抵のサーバでもONになってます。php.iniのmagic_quotes_gpcという設定項目がそれにあたります。この値がONになっていると、ユーザ入力GPC(Get/Post/Cookie)からの入力に勝手に変換を行います。

どのような変換内容かというと・・・

  • "
  • '
  • \
  • NULL

上記の文字を\でエスケープします。

つまり、magic_quotes_gpcがONの場合、フォームなどに入力した文字列に上記のものが含まれていた場合は勝手にエスケープ処理が行われて「\\」や「\"」のような文字列になるって事です。NULLは「何もない」という意味の特殊文字ですので今のところあまり気にしなくていいです。普通に「NULL」と入力して送信しても文字列としての"NULL"と扱われますので、そのまま表示されます。"\n"が「改行」を意味する特殊文字だというのを覚えてると思いますが、今回のNULLも似たようなものだと思ってもらっていいです。

実際やってみた方が早いと思うのでまずはサンプルフォームです。といっても前回のHTML文字のエスケープで扱ったものと変わりませんがw。このスクリプトにはHTML文字のエスケープ処理は入ってますがマジッククォートの処理は入ってません。

<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
  <input type="text" name="textbox" value="" />
  <input type="submit" value="送信" />
</form>
入力文字:
  1. <?php
  2. print htmlspecialchars( $_POST["textbox"] );
  3. ?>

出力結果

入力文字:

上記のフォームから"\を送信すると、出力部分は勝手に「\"」や「\\」になったと思います。

マジッククォート値の調べ方

さて、勝手に\を付加するこの機能、何というおせっかいな事を・・・と思うでしょうが、どうしてこんな事をするかというと、PHPマニュアルには初心者に便利、やSQLインジェクションのリスクを軽減させる、などと書かれてます。

PHPマニュアル なぜマジッククオートを使用するのか

は?は?何インジェクションだって?となるでしょうが、データベースにかかわるお話なので今は気にしなくていいです。データベースを使用しないなら初心者さんにはおせっかい以外の何者でもない機能です(ぉぃ。便利なのもデータベースを使用する時だけであって、今回みたいにデータベースを使用しないスクリプトを書くなら、うざい!!と思われても仕方のない機能なのですが(ぉぃぉぃ、ONになってしまっているものは仕方ありません。

先ほども解説したとおり、これはphp.iniのmagic_quotes_gpcという値がONになっていると起こる現象ですのでサーバの設定によっては起こるかもしれないし起こらないかもしれない、というとっても混乱させられる現象なんです。

また、困った事にデフォルト値がONの為、大抵のサーバでもONになってると解説しましたが、php.iniにも2種類あって通常のものとセキュリティ重視のものとがあります。このセキュリティ重視のphp.iniに関してはmagic_quotes_gpcのデフォルト値がOFFなんです。ここで2つのphp.iniの違いを解説するのは本筋ではないので、php.iniに関してはそういうものなんだと割り切ってもらう事にして、とりあえずご自分のサーバ設定を調べてみましょう。

いちいちphp.iniを開かなくてはならないのかというとそんな事はありませんので安心して下さい。magic_quotes_gpcの設定値を調べる関数がちゃんと用意されてます。

参考関数

書式

  • int get_magic_quotes_gpc( void )

get_magic_quotes_gpc()に引数は必要ないので楽チンです。magic_quotes_gpcの設定がONなら1を、OFFなら0を返します。

つまり、

  1. <?php
  2. // magic_quotes_gpcの設定値を調べる
  3. print_r(get_magic_quotes_gpc());
  4. ?>

出力結果

1

でちょちょいっと調べられます。

また、お馴染のでもphpinfo()でも調べられます。phpinfo()ならConfigurationのあたりにmagic_quotes_gpcの設定が載ってるはずです。

マジッククォート部分を取り除く

get_magic_quotes_gpcの値がONだった場合には、この値をOFFにしてしまうという方法もありますが、レンタルサーバなど設定値を変更できない環境も多々あります。また、ONである可能性も高いため、データベースを使用しているスクリプトがこの環境に依存している場合もあります。

じゃあどうしたらいいかというと、勝手につけられた\を取り除くのが手っ取り早いし、一般的でしょう。この処理にもちゃんと関数が用意されています。

参考関数

  • stripslashes() ---- バックスラッシュでクォートされた文字列を元に戻す

書式

  • string stripslashes( string string )

stripslashes()は、引数に文字列を指定すると\が取り除かれた文字列が返ってくる、という関数ですので、stripslashes()を利用して最初に出したフォームサンプルを改良します。

<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
  <input type="text" name="textbox" value="" />
  <input type="submit" value="送信" />
</form>
入力文字:
  1. <?php
  2. // まずはHTML文字のエスケープ
  3. $text = htmlspecialchars( $_POST["textbox"] );
  4.  
  5. // magic_quotes_gpcの値がONなら\削除
  6. if ( get_magic_quotes_gpc() ) {
  7.   $text = stripslashes( $text );
  8. }
  9. print $text;
  10. ?>

出力結果

入力文字:

これで先ほどのフォームと違い、\\のまま、ちゃんと出力されるようになったはずです。

上記のスクリプトは、get_magic_quotes_gpcの値がONで固定ならいちいちif文で囲む必要はありませんが、こうしておくと環境を調べてからスクリプトを書かなくてはいけないという煩雑さもなくなりますし、サーバを変えた時でもget_magic_quotes_gpc環境を調べ直して必要に応じて書き換える、みたいな面倒な事をしなくて済みます。いっその事マジッククォート部分を取り除くstripslashes()の処理はif文の条件式であるget_magic_quotes_gpc()とセットで覚えてしまいましょう。