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);