Edited at

アプリ用APIで、jsonはunicode escapeしたくない

More than 3 years have passed since last update.

ここでいうアプリとは、iOSアプリ、Androidアプリの話になります。

またWebAPIの認証方式はOAuth2を想定しています。


jsonでユニコード エスケープすると視認性が低下する

WebAPIでjsonが流行ってる理由として視認性が優れていることもあると思います

たとえばこんなの

{

"name":"たろう",
"title":"自己紹介",
"comment":"はじめまして"
}

人間に優しく、わかりやすいです

でもunicode escapeするとこんなレスポンスになります

{

"name":"\u305f\u308d\u3046",
"title":"\u81ea\u5df1\u7d39\u4ecb",
"comment":"\u306f\u3058\u3081\u307e\u3057\u3066"
}

人間では解読できなくなる

アプリ開発する上で、APIレスポンスのこのフィールドが、UI上のここに当てはまっているか?というのを実際にAPIのレスポンスと照らし合わせながら確認することも多いと思います。

そのときにunicode escapeされていると、作業が捗らなくなります。


jsonでユニコード エスケープするとレスポンス容量が増加する

識別子一文字一文字が1byteとってしまうので容量増加になってしまいます

ピンと来ない人はこちらを読むといいかと思います


文字コード考え方から理解するUnicodeとUTF-8の違い | ギークを目指して

http://equj65.net/tech/charcode/



なぜ ユニコード エスケープが必要なのか

json をunicode escapeする理由はセキュリティが理由で


  • jsonを直接呼び出すことによるXSS

こちらは古いブラウザを使っていると、json中にjavascriptの任意のコードを仕込むと、それが実行されてしまうというブラウザのセキュリティホールです。以下が詳しいです


PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)~JSON等の想定外読み出しによる攻撃~ - ockeghem(徳丸浩)の日記

http://d.hatena.ne.jp/ockeghem/20110907/p1


上を読むとわかるのですが、 PHPのjson_encode()をOPTIONなしでそのまま使っていると、日本語はユニコードエスケープされるのですが、XSS対策としては足りてないです


アプリAPIではjson unicode escapeが必要なのか?

ユーザが投稿したコンテンツを返すAPIなどは、直接ブラウジングされた場合の注意が必要ですが、


PHPのイタい入門書を読んでAjaxのXSSについて検討した(3)~JSON等の想定外読み出しによる攻撃~ - ockeghem(徳丸浩)の日記

http://d.hatena.ne.jp/ockeghem/20110907/p1


こちらにあるように

Content-Type:application/json; charset=UTF-8

X-Content-Type-Options: nosniff

をレスポンスヘッダに設定しておけば、メジャーブラウザではIE7以前以外は問題なさそうです。


結論

利用サービスにもよるだろうけど、json unicode escapeをやめるのは選択肢として考えるのもいいのではないでしょうか

アプリ用APIの話で書いたつもりが、API全般の話になってた。

自分の認識が間違ってなければ、IE7以下を無視するのであれば、APIならなんでもjson unicode escapeしなくてもよさそう。


おまけ


著名アプリで使われてるAPIはどうなのか実際に見てみた


  • メルカリ


    • unicode escapeされてる



  • minne


    • unicode escapeしてない




jsonハイジャック

OAuth2を使うようにしてcookieを直接受け取るようなAPIを作らなければ問題ないはずです


JSONをvbscriptとして読み込ませるJSONハイジャック(CVE-2013-1297)に注意 | 徳丸浩の日記

http://blog.tokumaru.org/2013/05/JSON-information-disclosure-vulnerability-CVE-2013-1297.html