WordPressで勝手にaddslashesされてバックスラッシュがついてしまう件

調べた結果、WordPressを使っているとmagic_quotesの設定は関係なく$_GET,$_POST,$_COOKIE,$_SERVERの4つは、必ずaddslashesされてバックスラッシュがつく事がわかりました。バージョン5.4.0以前のPHPでは、magic_quotesがONに設定されていると、POSTやGETで送ったデータの中にある全てのシングルクオート、ダブルクオート、バックスラッシュ、NULL文字の4つに自動的にバックスラッシュがついてエスケープされます。今作っているプラグインで$_POSTで送ったtextareaのデータにバックスラッシュがついたまま消えません。テスト環境のmagic_quotesはOFFなのにです。

この記事を書いた際のWordPressのバージョンは3.9.1です。

バージョン5.4.0以前のPHPでは、magic_quotesがONに設定されていると、POSTやGETで送ったデータの中にある全ての ' (シングルクオート)、 " (ダブルクオート)、 \ (バックスラッシュ)、NULL文字の4つに自動的にバックスラッシュがついてエスケープされます。

バージョン5.4.0から削除されたんですが、まだそれ以前のPHPは多いです。

そこで、get_magic_quotes_gpc関数で、magic_quotesがONかOFFか判別して、ONの場合にはstripslashesを使ってバックスラッシュを削除します。

if(get_magic_quotes_gpc()){
    $hoge = stripslashes($_POST['hoge']);
}else{
    $hoge = $_POST['hoge'];
}

ところが、今作っているプラグインで、この作業をしてもPOSTで送ったtextareaのデータにバックスラッシュがついたまま消えません。しかも、テスト環境のmagic_quotesはOFFなのにです。

調べたところ、「POST送信時にバックスラッシュが付加される現象: wordpressメモ」というページを見つけました。

結論を書くと、WordPressを使っているとmagic_quotesの設定は関係なく、$_GET,$_POST,$_COOKIE,$_SERVERの4つは、必ずaddslashesされてバックスラッシュがつきます。

詳細は「POST送信時にバックスラッシュが付加される現象: wordpressメモ」に書いてあるとおりなんですが、wp-includes/load.phpに、wp_magic_quotesという関数があります。

ここで、上記のget_magic_quotes_gpc関数で、magic_quotesが有効になっているか調べ、ONの場合にはstripslashesを使ってバックスラッシュを削除しています。

そして、それで終わらずに、add_magic_quotesという関数を実行しています。

function wp_magic_quotes() {
	// If already slashed, strip.
	if ( get_magic_quotes_gpc() ) {
		$_GET    = stripslashes_deep( $_GET    );
		$_POST   = stripslashes_deep( $_POST   );
		$_COOKIE = stripslashes_deep( $_COOKIE );
	}

	// Escape with wpdb.
	$_GET    = add_magic_quotes( $_GET    );
	$_POST   = add_magic_quotes( $_POST   );
	$_COOKIE = add_magic_quotes( $_COOKIE );
	$_SERVER = add_magic_quotes( $_SERVER );

	// Force REQUEST to be GET + POST.
	$_REQUEST = array_merge( $_GET, $_POST );
}

この、add_magic_quotesは何かというとWordpressの独自関数で、実体はwp-includes/functions.phpにあります。

この中で、addslashes関数を使って、$_GET,$_POST,$_COOKIE,$_SERVERの全てのデータをエスケープしています。

function add_magic_quotes( $array ) {
	foreach ( (array) $array as $k => $v ) {
		if ( is_array( $v ) ) {
			$array[$k] = add_magic_quotes( $v );
		} else {
			$array[$k] = addslashes( $v );
		}
	}
	return $array;
}

wp_magic_quotes関数はどこで呼び出されているかというと、wp-settings.phpの242行目です。(バージョン3.9.1の場合)

なのでWordPressを使う場合は、magic_quotesの設定に関係なく、stripslashesが必要でした。

これがわかるまで随分ハマりました。「POST送信時にバックスラッシュが付加される現象: wordpressメモ」を書かれた方には感謝です。