2018/08/13)追記:最近のOWASPガイドの更新でJavaScript文字列はUnicodeエンコードで安全性を確保するよう変更されました。このブログでもUnicodeエスケープのまま利用するように書いています。他の言語のユーザーはUnicodeエスケープを利用しましょう。PHPもASCII領域の文字をUnicodeエスケープするようにした方が良いと思います。これは提案して実現するように努力します。4627で定義されています。メディアタイプはapplication/json、ファイル拡張子はjsonと定義されています。PHPにJSON形式のデータに変換するjson_encode関数とjson_decode関数をサポートしています。考慮しなければならない事があります。JSON_HEX_QUOT);と利用します。JSON_HEX_QUOTです。JSONデータの文字エンコーディングは基本UTF-8です。UTF-8文字データは”予めバリデーションしておく”必要があります。4627の定義を見てみましょう。セキュリティ的に必要なのは今回も文字リテラルの取り扱いです。%x5D-10FFFFJavaScriptの文字リテラルのエスケープと比べると、JSONはJavaScriptだからJSONの仕様はJavaScriptと同じ!と思っていると間違える事に気付くと思います。5.1とは異なる部分があります。これには注意が必要です。JSONを利用する利点の1つは相互運用性です。PostgreSQLはJSON型のデータ型をサポートしています。4427に準拠したエスケープ方法を利用する必要があります。これだけで終わりかというと、まだ注意事項があります。Patchという標準もあります。~1にエンコード(エスケープ)しなければならない、としています。Pointerの解説ではないので説明しませんが、RFCにはこのような決まりもあると知っておくと何かの役に立つかも知れません。JSONを出力する場合の注意点JSONを出力する場合、JavaScriptとしてのみ評価されるコンテクストなのか、HTMLとして評価されてからJavaScriptとして評価されるコンテクストなのかを注意しなければなりません。4627とECMAScriptのエスケープ仕様に従ってエスケープ処理すれば安全です。Webサーバーから出力する場合、クライアントがバグなどで誤ってHTMLと解釈しなければ、MIMEタイプをapplication/jsonまたはtext/javascriptに設定すればJavaScriptとしてのみ評価されます。safe?"}}HTMLの中に埋め込んた場合、HTMLと評価されてからJavaScriptとして評価されます。)をエスケープしなければなりません。HTMLの特殊文字として誤解釈させない方法にはHTMLエンティティ化するHTMLパーサーでは解釈できない方法でエスケープするの二種類の方法があります。1の方法はJavaScript/JSON専用の場合は動作しません。2の方法は汎用性があり、ユーザが使うコンテクストを考えなくても利用できます。1の方法が間違っている訳ではありませんが、2の方が優れていると思います。PHPのjson_encodeJSONを出力する場合の注意点を理解した上で、PHPのJSONエスケープ関数であるjson_encodeを見てみましょう。形式にした文字列を返します。json_encode関数は$valueの文字列を$optionsに従い、最大512までネストしたJSONデータを作成します。$valueが不正である場合などにはfalseを返します。$optionsに指定できるオプションは次の通りです。