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

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

このコミットは、Go言語の標準ライブラリのAPI定義ファイルである api/go1.txt の更新に関するものです。api/go1.txt は、Go 1の互換性保証の基盤となる重要なファイルであり、Go 1でエクスポートされるすべてのAPI(関数、型、メソッド、定数など)のシグネチャをテキスト形式で厳密に記述しています。このファイルは、Go言語の将来のバージョンがGo 1との互換性を維持していることを検証するための参照点として機能します。

コミット

commit 351213ce92d3e3ebf6546a332ae873a43da667a6
Author: Rob Pike <r@golang.org>
Date:   Tue Mar 20 14:53:18 2012 +1100

    api: update go1.txt after adding functions to html/template
    Fixes build, teaches lesson.
    
    R=golang-dev, r
    TBR=bradfitz
    CC=golang-dev
    https://golang.org/cl/5853051

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

https://github.com/golang/go/commit/351213ce92d3e3ebf6546a332ae873a43da667a6

元コミット内容

html/template パッケージに関数が追加された後、go1.txt を更新する。 ビルドを修正し、教訓を与える。

変更の背景

このコミットの背景には、Go言語の標準ライブラリである html/template パッケージに新しい関数が追加されたという事実があります。Go 1のリリースに向けて、GoチームはAPIの安定性と互換性を非常に重視していました。go1.txt は、Go 1で提供されるAPIの「公式な」リストとして機能し、このファイルに記載されていないAPIはGo 1の互換性保証の対象外となります。

新しい関数が html/template パッケージに追加されたにもかかわらず、go1.txt が更新されていなかったため、ビルドプロセスで問題が発生したか、またはAPIの定義が不整合な状態になっていたと考えられます。コミットメッセージの「Fixes build, teaches lesson.」という記述は、この不整合がビルドエラーを引き起こしたこと、そしてAPIの変更と go1.txt の更新が密接に連携していなければならないという教訓を示唆しています。

したがって、このコミットの目的は、html/template パッケージに追加された新しいエクスポートされた関数を api/go1.txt に正確に反映させ、Go 1のAPI定義の整合性を保ち、ビルドの問題を解決することでした。

前提知識の解説

api/go1.txt とGo 1互換性保証

api/go1.txt は、Go言語のバージョン1(Go 1)のリリース時に導入された、Goの互換性保証の核心をなすテキストファイルです。このファイルには、Go 1でエクスポートされるすべての公開API(関数、メソッド、型、定数、変数など)のシグネチャが厳密な形式で記述されています。

Goチームは、Go 1以降のすべてのGoのリリースにおいて、go1.txt に記述されたAPIとの後方互換性を維持することを約束しています。これは、Go 1で書かれたプログラムが、将来のGoのバージョンでも変更なしにコンパイルされ、実行されることを保証するための重要なメカニズムです。

go1.txt は、Goのリリースプロセスにおいて、APIの変更が互換性を損なわないかを検証するための基準点として使用されます。新しいAPIが追加されたり、既存のAPIのシグネチャが変更されたりした場合は、このファイルも適切に更新される必要があります。このコミットは、まさにそのプロセスの一部を示しています。

html/template パッケージ

html/template パッケージは、Go言語の標準ライブラリの一部であり、HTML出力の生成を安全に行うための機能を提供します。このパッケージの主な目的は、Webアプリケーションにおいて、ユーザー入力やデータベースからのデータなどをHTMLに埋め込む際に発生しうるクロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を自動的に防止することです。

html/template は、テンプレートエンジンとして機能し、Goの text/template パッケージを基盤としていますが、HTMLのコンテキストに特化したエスケープ処理を自動的に行います。これにより、開発者が明示的にエスケープ処理を記述する手間を省きつつ、セキュリティを確保できます。

HTML/JS/URL エスケープの必要性

Webアプリケーションにおいて、ユーザーから提供されたデータや外部から取得したデータをそのままHTMLページに表示したり、JavaScriptコードに埋め込んだり、URLの一部として使用したりすると、セキュリティ上の深刻な問題を引き起こす可能性があります。

  • HTMLエスケープ: 悪意のあるユーザーが <script> タグなどのHTML要素を挿入し、他のユーザーのブラウザで任意のスクリプトを実行させる攻撃(XSS)を防ぐために必要です。HTMLエスケープは、<&lt;>&gt;&&amp; などに変換します。
  • JavaScriptエスケープ: JavaScriptコード内にユーザー入力が埋め込まれる場合、悪意のあるスクリプトが挿入されるのを防ぐために必要です。JavaScriptエスケープは、文字列リテラル内で特殊な意味を持つ文字(例: "'\、改行文字など)をエスケープします。
  • URLエスケープ(パーセントエンコーディング): URLの一部として特殊な意味を持つ文字(例: (スペース), /, ?, &, = など)や、非ASCII文字を安全に表現するために必要です。URLエスケープは、これらの文字を %XX の形式(XXは文字のASCII値を16進数で表したもの)に変換します。

html/template パッケージは、これらのエスケープ処理を自動的に行い、開発者が意識することなく安全なWebアプリケーションを構築できるように支援します。

技術的詳細

このコミットは、html/template パッケージに以下の新しいエスケープ関連関数が追加されたことを api/go1.txt に反映させています。これらの関数は、特定のコンテキストでの文字列のエスケープを明示的に行うためのものです。

  • func HTMLEscape(io.Writer, []byte): 指定されたバイトスライスをHTMLエスケープし、指定された io.Writer に書き込みます。
  • func HTMLEscapeString(string) string: 指定された文字列をHTMLエスケープし、結果の文字列を返します。
  • func HTMLEscaper(...interface{}) string: テンプレート内で使用される関数で、引数をHTMLエスケープした文字列として返します。これは、テンプレートのパイプラインで複数の値をHTMLコンテキストで安全に結合するために使用されます。
  • func JSEscape(io.Writer, []byte): 指定されたバイトスライスをJavaScriptエスケープし、指定された io.Writer に書き込みます。
  • func JSEscapeString(string) string: 指定された文字列をJavaScriptエスケープし、結果の文字列を返します。
  • func JSEscaper(...interface{}) string: テンプレート内で使用される関数で、引数をJavaScriptエスケープした文字列として返します。これは、テンプレートのパイプラインで複数の値をJavaScriptコンテキストで安全に結合するために使用されます。
  • func URLQueryEscaper(...interface{}) string: テンプレート内で使用される関数で、引数をURLクエリ部分として安全にエンコードした文字列として返します。これは、URLのクエリパラメータに値を埋め込む際に使用されます。

また、以下のメソッドも追加されています。

  • method (*Template) Templates() []*Template: Template オブジェクトが持つ、関連するすべてのサブテンプレートのリストを返します。これは、テンプレートの構造を検査したり、特定のサブテンプレートにアクセスしたりする際に役立ちます。

これらの関数とメソッドの追加は、html/template パッケージの機能強化を意味し、より柔軟で安全なWebコンテンツ生成を可能にします。go1.txt へのこれらのエントリの追加は、これらの新しいAPIがGo 1の互換性保証の対象となることを公式に宣言するものです。

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

変更は api/go1.txt ファイルのみです。

--- a/api/go1.txt
+++ b/api/go1.txt
@@ -3348,10 +3348,17 @@ pkg html/template, const ErrPartialEscape ErrorCode
 pkg html/template, const ErrRangeLoopReentry ErrorCode
 pkg html/template, const ErrSlashAmbig ErrorCode
 pkg html/template, const OK ErrorCode
+pkg html/template, func HTMLEscape(io.Writer, []byte)
+pkg html/template, func HTMLEscapeString(string) string
+pkg html/template, func HTMLEscaper(...interface{}) string
+pkg html/template, func JSEscape(io.Writer, []byte)
+pkg html/template, func JSEscapeString(string) string
+pkg html/template, func JSEscaper(...interface{}) string
 pkg html/template, func Must(*Template, error) *Template
 pkg html/template, func New(string) *Template
 pkg html/template, func ParseFiles(...string) (*Template, error)
 pkg html/template, func ParseGlob(string) (*Template, error)
+pkg html/template, func URLQueryEscaper(...interface{}) string
 pkg html/template, method (*Error) Error() string
 pkg html/template, method (*Template) AddParseTree(string, *parse.Tree) (*Template, error)
 pkg html/template, method (*Template) Clone() (*Template, error)
@@ -3365,6 +3372,7 @@ pkg html/template, method (*Template) New(string) *Template
 pkg html/template, method (*Template) Parse(string) (*Template, error)
 pkg html/template, method (*Template) ParseFiles(...string) (*Template, error)
 pkg html/template, method (*Template) ParseGlob(string) (*Template, error)
+pkg html/template, method (*Template) Templates() []*Template
 pkg html/template, type CSS string
 pkg html/template, type Error struct
 pkg html/template, type Error struct, Description string

コアとなるコードの解説

このdiffは、api/go1.txt に追加された新しいAPIエントリを示しています。各行は pkg <パッケージ名>, <種類> <名前>(<引数>) <戻り値> の形式で、Go 1でエクスポートされるAPIのシグネチャを記述しています。

追加された行は以下の通りです。

  • pkg html/template, func HTMLEscape(io.Writer, []byte): html/template パッケージの HTMLEscape 関数。io.Writer とバイトスライスを引数にとります。
  • pkg html/template, func HTMLEscapeString(string) string: html/template パッケージの HTMLEscapeString 関数。文字列を引数にとり、文字列を返します。
  • pkg html/template, func HTMLEscaper(...interface{}) string: html/template パッケージの HTMLEscaper 関数。可変長の引数を受け取り、文字列を返します。これはテンプレート内で使用される関数です。
  • pkg html/template, func JSEscape(io.Writer, []byte): html/template パッケージの JSEscape 関数。io.Writer とバイトスライスを引数にとります。
  • pkg html/template, func JSEscapeString(string) string: html/template パッケージの JSEscapeString 関数。文字列を引数にとり、文字列を返します。
  • pkg html/template, func JSEscaper(...interface{}) string: html/template パッケージの JSEscaper 関数。可変長の引数を受け取り、文字列を返します。これもテンプレート内で使用される関数です。
  • pkg html/template, func URLQueryEscaper(...interface{}) string: html/template パッケージの URLQueryEscaper 関数。可変長の引数を受け取り、文字列を返します。テンプレート内でURLクエリのエンコードに使用されます。
  • pkg html/template, method (*Template) Templates() []*Template: html/template パッケージの *Template 型の Templates メソッド。[]*Template 型のスライスを返します。

これらの追加により、go1.txthtml/template パッケージの最新のAPIセットを正確に反映し、Go 1の互換性保証の対象となるAPIの範囲を明確にしています。

関連リンク

参考にした情報源リンク