Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17152] ファイルの概要

このコミットは、Go言語の標準ライブラリ encoding/json パッケージの挙動に関するドキュメントの更新です。具体的には、Go 1.2のリリースノートに、JSONエンコーディング時にアンパサンド (&) が常にエスケープされるようになったという変更が追記されています。

コミット

commit 9baac2bf157b61e47a4ab446bf1960f98f9847b5
Author: Rob Pike <r@golang.org>
Date:   Mon Aug 12 11:28:25 2013 +1000

    doc/go1.2.txt: json and ampersands
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/12698047

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/9baac2bf157b61e47a4ab446bf1960f98f9847b5

元コミット内容

doc/go1.2.txt: json and ampersands

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/12698047

変更の背景

このコミットは、Go 1.2のリリースノート (doc/go1.2.txt) に、encoding/json パッケージの変更点を追記するために行われました。具体的には、JSONエンコーディングにおいてアンパサンド (&) が常にエスケープされるようになったという挙動の変更が、ユーザーに明確に伝えられるようにするためのものです。

この変更の背景には、HTMLにJSONを埋め込む際のセキュリティ上の考慮事項があります。JSONデータをHTMLの <script> タグ内に直接埋め込む場合、JSON文字列内に特定のHTML特殊文字(特に &, <, >)が含まれていると、クロスサイトスクリプティング (XSS) などの脆弱性につながる可能性があります。例えば、& はHTMLエンティティの開始文字として解釈される可能性があるため、これをエスケープすることで、ブラウザがJSONデータをHTMLとして誤って解釈するリスクを低減できます。

Goの encoding/json パッケージは、デフォルトでHTMLに安全なJSONを生成することを目指しており、この変更はその方針に沿ったものです。

前提知識の解説

  • JSON (JavaScript Object Notation): 軽量なデータ交換フォーマット。人間が読み書きしやすく、機械が解析・生成しやすいという特徴があります。Web APIなどで広く利用されています。
  • encoding/json パッケージ: Go言語の標準ライブラリに含まれるパッケージで、Goのデータ構造とJSONデータの間でエンコード(Marshal)およびデコード(Unmarshal)を行う機能を提供します。
  • HTML特殊文字のエスケープ: HTMLドキュメント内で特別な意味を持つ文字(例: <, >, &, ", ')を、その文字自体として表示させるために、特定のシーケンス(HTMLエンティティ、例: &lt;, &gt;, &amp;)に変換することです。これにより、ブラウザがこれらの文字をHTMLタグやエンティティの開始として誤って解釈するのを防ぎます。
  • クロスサイトスクリプティング (XSS): Webアプリケーションの脆弱性の一種で、悪意のあるスクリプトがWebページに挿入され、そのページを閲覧したユーザーのブラウザで実行されてしまう攻撃です。HTMLにJSONを埋め込む際に、JSONデータが適切にエスケープされていないと、XSSの温床となる可能性があります。
  • Go 1.2: 2013年12月にリリースされたGo言語のバージョンです。このバージョンでは、パフォーマンスの向上、ランタイムの改善、標準ライブラリの機能追加など、多くの変更が加えられました。

技術的詳細

このコミット自体はコードの挙動を変更するものではなく、Go 1.2のリリースノート (doc/go1.2.txt) に以下の行を追加するものです。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -25,6 +25,7 @@ crypto/sha512: Sum512 and Sum384 functions to simplify hashing (CL 10630043).\
 crypto/tls: add support for TLS 1.1. (CL 7872043).\
 encoding/csv: always allow trailing commas (CL 12294043)\
 encoding/json: accept but correct invalid UTF-8 in Marshal (CL 11211045).\
+encoding/json: always escape ampersands (CL 12708044).\
 encoding/xml: allow attributes stored in pointers to be marshaled (CL 8653047).\
 flag: add Getter interface (CL 10472043).\
 flag: export commandLine (now CommandLine) (CL 12587043).\

追加された行 encoding/json: always escape ampersands (CL 12708044). は、encoding/json パッケージがGo 1.2で導入された変更点として、JSONエンコーディング時にアンパサンド (&) を常にエスケープするようになったことを示しています。

この変更は、元のコミット (CL 12708044) で実装されました。この実装により、json.Marshal 関数がGoの値をJSONバイトスライスに変換する際に、文字列内の & 文字を \u0026 のようにエスケープするようになります。これにより、生成されたJSONがHTMLドキュメントに埋め込まれた場合でも、XSS攻撃のリスクを低減し、より安全なJSON出力を保証します。

例えば、Go 1.2より前のバージョンでは、json.Marshal("foo&bar")"foo&bar" を出力する可能性がありましたが、Go 1.2以降では json.Marshal("foo&bar") "foo\u0026bar" を出力するようになります。

コアとなるコードの変更箇所

このコミット自体は、doc/go1.2.txt というドキュメントファイルの一行の追加のみです。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -25,6 +25,7 @@ crypto/sha512: Sum512 and Sum384 functions to simplify hashing (CL 10630043).\
 crypto/tls: add support for TLS 1.1. (CL 7872043).\
 encoding/csv: always allow trailing commas (CL 12294043)\
 encoding/json: accept but correct invalid UTF-8 in Marshal (CL 11211045).\
+encoding/json: always escape ampersands (CL 12708044).\
 encoding/xml: allow attributes stored in pointers to be marshaled (CL 8653047).\
 flag: add Getter interface (CL 10472043).\
 flag: export commandLine (now CommandLine) (CL 12587043).\

実際の encoding/json パッケージの挙動変更は、このコミットが参照しているCL 12708044で行われました。

コアとなるコードの解説

このコミットはドキュメントの変更であり、直接的なGoのコード変更は含んでいません。しかし、このドキュメント変更が指し示している encoding/json パッケージの変更は、json.Marshal 関数が文字列内のアンパサンド (&) を常に \u0026 の形式でエスケープするようになった点です。

この変更は、encoding/json パッケージ内部のエンコーダが、JSON文字列を生成する際に、特定のHTML特殊文字(<, >, &)をエスケープするロジックを強化したことによるものです。これにより、生成されるJSONがHTMLコンテキストでより安全に扱えるようになります。

関連リンク

  • Go 1.2 Release Notes: このコミットが更新しているドキュメントの最終版は、Go 1.2の公式リリースノートに含まれています。
  • Go issue tracker: 関連するバグ報告や機能要求が議論されている可能性があります。

参考にした情報源リンク