【PHP】POST送信時にクォーテーションが勝手にバックスラッシュでエスケープされてしまう【マジッククオート】【WordPress】


PHPでデータをPOST送信する時に、ダブルクォーテーションやシングルクォーテーションに、勝手にバックスラッシュが混入していることに気づいた。

 

どこかのタイミングで自動的にエスケープ処理しているみたいなのだけど、
PHPでPOST送信をすると、自動で余計なバックスラッシュが付与される。

てっきりHTMLエンティティ絡みだと思って「html_entity_decode()」をしても消えてくれない(そのまま残る)。

この現象が起こるのは、確認した限りではダブルクォーテーションやシングルクォーテーションのみで、他の特殊文字("<"とか)には、この現象は発生していない。

 

すっごく調査して発覚したのは、php.iniでの「magic_quotes_gpc = On」設定だった。

 

こやつの名称は、

マジッククオートというらしい。

 

マジッククオートをoffにすれば、バックスラッシュでのエスケープを解除できる。

 

 

PHP 5.4 以前の場合

 

やり方は3種類。

 

php.iniを変更する場合

magic_quotes_gpc = Off

 

.htaccessで対応する場合

こちらを追記。

php_flag magic_quotes_gpc Off

 

PHPで対応する場合

$str = stripslashes($_POST['aaa']);

 

こちらのサイトを参考にさせていただきました。詳しい説明が載っています。
PHPでクォーテーションが勝手にエスケープされてしまう時は

 

PHP 5.4 以降で WordPress を使用している場合は

 

PHP7 にアップデートし、これでマジッククオートとはおさらばだと思っていたら!!

 

なぜかやっぱりマジッククオートしてしまう。 えぇ......(困惑)

 

公式マニュアルにはPHP 5.4以降はマジッククオート機能はなくなったと書いてあるのに!

php.iniにも、「magic_quotes_gpc」の項目がなくなっているのに!!

 

犯人は、Wordpressだった

 

 

WordPress自体にmagic quotesの機能が組み込まれているというオチだった。

wp_magic_quotes() という関数で組み込まれちゃってるんですね~。

 

WordPressよ、おぬしか!こっそり仕込んでおるのは!!ハハッ

 

対処法

stripslashes_deepを使用してクオートを外す処理をかませる。

$_POST = array_map('stripslashes_deep', $_POST);
var_dump($_POST);

 

POST以外も含めると、こんな感じ。

$_GET = array_map('stripslashes_deep', $_GET);
$_POST = array_map('stripslashes_deep', $_POST);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_SERVER = array_map('stripslashes_deep', $_SERVER);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);

参考:WordPress Codex