今回は、Ajaxでのリクエストの際、データのキーに “name”[ps](その後、’day’, ‘month’, ‘year’ も問題ありと判明)[/ps] を使用してはいけません、というお話です。

取り急ぎ、Ajaxで作りたい仕組みがあったので、JSONの勉強を今さらやってみたりしたのですが、途中いくつものポイントでゴリ押しめいた無理ワザをしてしまった今日この頃です。

WordPressのシステムから独立したスクリプトへリクエストを投げる際はまったく問題がなかったのに、システムに組み込んだものへ投げるとエラーが出てしまう。探ってみると、リクエストデータのキーに、”name” を用いたことが原因でした。

たとえばこれがOKで、

myblog/independent-ajax.php?name=my-request

これがNG

myblog/dependent-ajax.php?name=my-request

みたいな。見た目じゃさっぱり違いがわからないです。

上のやつは、WordPressとは切り離されたスクリプト。下のほうは、通常のページリクエストで、テンプレートをAjax用に作成したものです。

どうして下のほうがエラーになるのかというと、WordPressのコアがこの name をキーにした値に基づいてURLを解析してWordPress的に適切なページを検索して、それを表示しようとするようです。その結果ほしくないページのHTMLが出力されてしまうことになります。GETでもPOSTでも同様です。

たぶん、これはRewrite周りをきっちっと作りこめば回避できるはずですし、それに “name” 以外は何でもOKなのかといわれればそれも保証できないです。たとえばここなんかをちゃんと理解できればいいと思われます。でも、時間がないのでとりあえずこのまま。そのあたりを解決するまでは、今はとにかくリクエストのキーに “name” だけは絶対に使用してはならないということ。そして、今後エラーが発生した場合は、ひょっとしたらリクエストのキーに問題がないのか一度調べること。

一番安全なのは、リクエストのキーをただひとつだけ確実にユニークなものを決めておいて、それにラッピングして渡すことでしょうか。

たとえば JSON でリクエストを作るときに

jQuery.getJSON(
	'myblog/dependent-ajax.php',
	{ my-unique-key:{ name:ok } },
	function( data, status ){
	}
);

のようにして、受け取る側は $_GET[‘my-unique-key’] の中だけを参照するという按配。

いずれきちっとした様式にのっとって実装せねばと思いながら、ともすると何事もなかったかのように忘れ去ってしまいかねないので今回は単にメモ書き。

クライアントからのリクエストの際、データのキーに “name” を使用してはいけません。

[tsuiki]

あとで見つけた記事。

WordPressのURLをhackする

とても参考になりそう。

これをきっかけにして、’name’ 以外にも ‘day’, ‘month’, ‘year’ がだめであることを発見。

上記のことはつまりまた、Ajaxに限らず独自の実装でURLにクエリを追加する場合にも同じ注意が必要であることを意味します。

[/tsuiki]