PHPのjson_encode()でHTML5データ属性のシングルクォートを安全にエスケープする方法
JSONデータをHTML5データ属性に安全に埋め込むには
PHPで配列をjson_encode()でJSON形式に変換し、HTML5のdata属性に埋め込む場合、値の中にシングルクォート(一重引用符)が含まれていると、HTMLの構造が崩れたり、XSSなどのセキュリティリスクにつながったりする可能性があります。本記事では、シングルクォートを確実にエスケープする2つの方法を解説します。
方法1:htmlspecialchars()とENT_QUOTESを組み合わせる
json_encode()の出力をhtmlspecialchars()でサニタイズし、第2引数にENT_QUOTESフラグを指定する方法です。これにより、ダブルクォートだけでなくシングルクォートもHTMLエンティティへ変換されます。
printf('<article data-tags="%s">', htmlspecialchars(json_encode(array('html5', ...)), ENT_QUOTES, 'UTF-8'));
文字エンコーディングとして'UTF-8'を明示的に指定しておくことで、マルチバイト文字を含むデータでも安全かつ正確に処理できます。
方法2:JSON_HEX_APOS定数を使用する
json_encode()には、シングルクォートを自動的に16進数形式(\u0027)へ変換する組み込みオプションが用意されています。第2引数にJSON_HEX_APOSを指定するだけで有効になります。
json_encode(array('html5', ...), JSON_HEX_APOS)
なお、より厳格なエスケープが必要な場合は、JSON_HEX_TAG(< と >)、JSON_HEX_AMP(&)、JSON_HEX_QUOT(ダブルクォート)といった定数をビット演算子「|」で組み合わせると、包括的な対策が可能です。
まとめ
HTML5のdata属性にJSONデータを埋め込む際は、htmlspecialchars() + ENT_QUOTES の併用、または JSON_HEX_APOS オプションのいずれかを使うことで、シングルクォートによる不具合を防げます。出力先の文脈(HTML属性値として直接出力するか、JavaScript側で利用するか)に応じて、適切な方法を選択してください。
-
JavaScriptでJSON配列からデータを読み取る方法をサンプルコード付きで解説
Web開発では、APIから取得したJSONデータを処理する場面が非常によくあります。本記事では、JavaScriptを使ってJSON配列からデータを読み取り、画面に表示する方法を、実際に動作するサンプルコードとともにわかりやすく解説します。 JSON配列からデータを読み取る基本の流れ JSON形式の文字列をJavaScriptで扱うには、まずJSON.parse()メソッドで文字列をJavaScriptのオブジェクト(配列)に変換します。変換後は、forEach()メソッドなどを活用して、配列の各要素に格納された値へ簡単にアクセスできます。 サンプルコード <!DOCTYPE htm
-
JavaScriptでtextareaに入力されたJSONデータを整形(プリティプリント)する方法
textareaに入力されたJSONデータを整形(プリティプリント)して表示するには、JSON.parse()とJSON.stringify()を組み合わせて使用します。まずJSON.parse()で文字列をJavaScriptオブジェクトに変換し、その後JSON.stringify()の第3引数にインデント幅(例:4)を指定することで、インデントが整った読みやすいJSON文字列を取得できます。サンプルコード<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF