兵どもが、夢のあとさき

JavaScript 系の言語に興味を惹かれ、まったりと更新しております

JSONあれこれ(2)

前回、作成した(実は、本を参照させていただいただけ)下記プログラム (json.php) ですが、これをそのままWebサーバ上で実行すると、

<?php
# jQueryなど主要なJavaScriptライブラリを通じてのアクセスである
# (ブラウザからの直接アクセスでない)ことを確認します。
# この方法はJSONハイジャック攻撃など☆レシピ305☆(JSONのセキュリティについて知りたい)に対しても有効です。
if (! isset($_SERVER['HTTP_X_REQUESTED_WITH']) ||
    $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
  die(json_encode(array('status' => "不正な呼び出しです")));
}

# データを準備します。
$value = array(
  1 => array('item' => '台湾ラーメン', 'price' => 580, 'orders' => 113),
  2 => array('item' => '台湾ラーメン(アメリカン)', 'price' => 580, 'orders' => 72),
  3 => array('item' => 'ニンニクチャーハン', 'price' => 630, 'orders' => 87),
);

# Content-Typeを「application/json」に設定します。
header("Content-Type: application/json; charset=UTF-8");
# Internet ExplorerがContent-Typeヘッダーを無視しないようにします☆レシピ287☆(XSS対策をしたい)。
header("X-Content-Type-Options: nosniff");

# 可能な限りのエスケープを行ない、JSON形式で結果を返します。
echo json_encode(
  $value,
  JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
);
/* ?>終了タグ省略 ☆レシピ001☆(サーバーのPHP情報を知りたい) */

下記の表示がされます。

{"status":"\u4e0d\u6b63\u306a\u547c\u3073\u51fa\u3057\u3067\u3059"}

なんじゃこりゃ? ということでプログラムを少し修正します。

 ↓ これですね。

<?php
echo '<!DOCTYPE HTML>';
echo '<html lang="ja">';
echo '<head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
echo '</head>';
echo '<body>';
# jQueryなど主要なJavaScriptライブラリを通じてのアクセスである
# (ブラウザからの直接アクセスでない)ことを確認します。
# この方法はJSONハイジャック攻撃など☆レシピ305☆(JSONのセキュリティについて知りたい)に対しても有効です。
if (! isset($_SERVER['HTTP_X_REQUESTED_WITH']) ||
    $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
  die(json_encode(array('status' => "不正な呼び出しです"),  JSON_UNESCAPED_UNICODE));
}

日本語表示を行い、 die() に、JSON_UNESCAPED_UNICODE パラメータを付加しました。すると結果は、

{"status":"不正な呼び出しです"}

となります。要するに、XMLHttpRequest コール (ブラウザが実装している javascript の HTTP通信機能API) でないためエラーとなります。このプログラムが直接JSONデータを吐き出す仕様になっているために、そのままサーバにアクセスしてもエラーとなるようになっているのです。

 それでは、どのようにアクセスすればよいのでしょうか?