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

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

このコミットは、Go言語の標準ライブラリである text/template パッケージのドキュメントを更新し、HTML出力を生成する際には html/template パッケージを使用するよう明確に推奨する変更です。これは、text/template がHTMLエスケープを自動的に行わないため、クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を引き起こす可能性があるという重要な注意喚起をユーザーに促すものです。

コミット

commit 0357af80b461e8dea71602ee3d4bcb7d733c7613
Author: Rob Pike <r@golang.org>
Date:   Fri Feb 10 14:21:36 2012 +1100

    template: refer HTML users to html/template
    
    Fixes #2963.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5650051

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

https://github.com/golang/go/commit/0357af80b461e8dea71602ee3d4bcb7d733c7613

元コミット内容

template: refer HTML users to html/template

Fixes #2963.

変更の背景

このコミットの背景には、Go言語のテンプレートパッケージの設計思想とセキュリティ上の懸念があります。Goには、汎用的なテキスト生成のための text/template パッケージと、HTML生成に特化しセキュリティ機能が強化された html/template パッケージの2種類が存在します。

当初、ユーザーがHTMLを生成する際に text/template を誤って使用し、その結果としてXSS脆弱性を抱えるアプリケーションを開発してしまうリスクがありました。text/template は、入力されたデータをそのまま出力するため、ユーザーからの入力(例えば、コメント欄に悪意のあるスクリプトが埋め込まれたもの)を適切にエスケープせずにHTMLに埋め込むと、そのスクリプトがブラウザ上で実行されてしまう可能性があります。

コミットメッセージにある Fixes #2963 は、この問題に対する対応を示しています。Issue #2963(具体的な内容は今回の検索では特定できませんでしたが、文脈から text/template のセキュリティに関するドキュメント改善要求であったと推測されます)を受けて、開発チームは text/template のドキュメントに明確な警告と html/template への誘導を追加することを決定しました。これにより、開発者が適切なツールを選択し、より安全なウェブアプリケーションを構築できるよう支援することが目的です。

前提知識の解説

Go言語のテンプレートパッケージ

Go言語には、データ駆動型のテンプレートを扱うための2つの主要なパッケージがあります。

  1. text/template パッケージ:

    • 目的: あらゆる種類のテキスト出力を生成するための汎用的なテンプレートエンジンです。HTML、XML、プレーンテキスト、設定ファイルなど、形式を問わずテキストを生成できます。
    • 特徴: 入力されたデータに対して自動的なエスケープ処理を行いません。これは、生成するテキストの形式が多岐にわたるため、パッケージ側で一律にエスケープ処理を行うことが適切ではないからです。例えば、設定ファイルを生成する際に、特定の文字がエスケープされてしまうと、設定が正しく機能しなくなる可能性があります。
    • セキュリティ上の注意: HTMLなどのマークアップ言語を生成する際に、ユーザーからの信頼できない入力を直接埋め込むと、XSS(クロスサイトスクリプティング)などのセキュリティ脆弱性の原因となります。開発者は、text/template を使用してHTMLを生成する場合、すべての信頼できないデータを手動で適切にエスケープする責任があります。
  2. html/template パッケージ:

    • 目的: HTML出力を安全に生成するために特化されたテンプレートエンジンです。
    • 特徴: text/template と同じインターフェースを持ちながら、HTMLのコンテキスト(HTML要素内、JavaScript内、CSS内、URI属性内など)に応じて、自動的に適切なエスケープ処理を行います。これにより、悪意のあるスクリプトや不正なマークアップが挿入されるのを防ぎ、XSS攻撃からアプリケーションを保護します。
    • 「安全なデフォルト」: html/template は、テンプレートの作者は信頼できるが、テンプレートに適用されるデータは信頼できない、という前提で設計されています。そのため、データは自動的にエンコードされ、HTMLドキュメントに安全に埋め込まれます。ただし、template.HTMLtemplate.JStemplate.CSS などの型を使用すると、そのコンテンツは「安全である」と明示的にマークされ、自動エスケープがバイパスされます。これらの型は、信頼できるソースからのコンテンツにのみ使用すべきであり、信頼できない入力と組み合わせて使用すると、セキュリティリスクが生じる可能性があります。

クロスサイトスクリプティング (XSS)

XSSは、ウェブアプリケーションのセキュリティ脆弱性の一種です。攻撃者が悪意のあるスクリプト(通常はJavaScript)をウェブページに注入し、そのスクリプトが他のユーザーのブラウザで実行されることを可能にします。これにより、攻撃者はセッションクッキーの盗難、ウェブサイトの改ざん、フィッシング詐欺など、様々な悪意のある行為を行うことができます。

XSS攻撃は、ウェブアプリケーションがユーザーからの入力を適切に検証またはエスケープせずに、そのままウェブページに表示する場合に発生します。例えば、掲示板のコメント欄に <script>alert('XSS!');</script> のようなコードが入力され、それがそのまま表示されると、ページを閲覧したユーザーのブラウザで alert('XSS!'); が実行されてしまいます。

html/template パッケージは、このようなXSS攻撃を防ぐために、出力されるHTMLコンテンツを自動的にサニタイズ(無害化)する機能を提供します。

技術的詳細

このコミットは、src/pkg/text/template/doc.go ファイルのドキュメンテーションコメントを修正することで、text/template パッケージの利用者がHTML生成におけるセキュリティ上の注意点を明確に理解できるようにしています。

変更前は、text/template パッケージが「HTMLのようなテキスト出力を生成するためのデータ駆動型テンプレートを実装している」とだけ記述されていました。この記述は、HTML生成に text/template を使用しても問題ないという誤解を招く可能性がありました。

変更後は、以下の2行が追加されています。

+To generate HTML output, see package html/template, which has the same interface
+as this package but automatically secures HTML output against certain attacks.

この追加により、以下の点が明確になります。

  1. html/template への明確な誘導: HTML出力を生成する目的であれば、html/template パッケージを参照すべきであることが明示されます。
  2. セキュリティ機能の強調: html/template が「このパッケージと同じインターフェースを持つが、特定の攻撃に対してHTML出力を自動的に保護する」という重要な情報が提供されます。これは、html/template の主要な利点である自動エスケープ機能と、それがXSSなどの攻撃に対する防御策となることを示唆しています。

このドキュメントの変更は、コードの動作自体を変更するものではありませんが、開発者がGoのテンプレートシステムを安全に利用するためのベストプラクティスを促進する上で非常に重要です。特に、ウェブアプリケーション開発においてセキュリティは最優先事項であり、開発者が適切なツールと知識を持って脆弱性を回避できるよう、このようなドキュメントによるガイダンスは不可欠です。

html/template の自動エスケープは、出力されるHTMLのコンテキストを解析し、それに応じて適切なエスケープ処理を適用することで機能します。例えば、<script> タグ内ではJavaScriptのエスケープルールを適用し、HTML属性内ではHTML属性のエスケープルールを適用するといった具合です。これにより、開発者が手動でエスケープ処理を記述する手間を省き、エスケープ漏れによる脆弱性の発生リスクを大幅に低減します。

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

--- a/src/pkg/text/template/doc.go
+++ b/src/pkg/text/template/doc.go
@@ -3,8 +3,10 @@
 // license that can be found in the LICENSE file.
 
 /*
-Package template implements data-driven templates for generating textual output
-such as HTML.
+Package template implements data-driven templates for generating textual output.
+
+To generate HTML output, see package html/template, which has the same interface
+as this package but automatically secures HTML output against certain attacks.
 
 Templates are executed by applying them to a data structure. Annotations in the
 template refer to elements of the data structure (typically a field of a struct

コアとなるコードの解説

変更は src/pkg/text/template/doc.go ファイルのドキュメンテーションコメントに限定されています。

  • - Package template implements data-driven templates for generating textual output

    • 変更前は、「HTMLのような」という表現が含まれていました。
  • + Package template implements data-driven templates for generating textual output.

    • 変更後、この行からは「HTMLのような」という表現が削除され、より汎用的なテキスト出力に焦点を当てていることが明確になりました。
  • +

    • 空行が追加され、その後に新しい説明が続きます。
  • +To generate HTML output, see package html/template, which has the same interface

  • +as this package but automatically secures HTML output against certain attacks.

    • この2行が新たに追加されました。これは、HTML出力を生成する場合には html/template パッケージを使用すべきであること、そしてその理由が html/template が「このパッケージと同じインターフェースを持ちながら、特定の攻撃に対してHTML出力を自動的に保護する」ためであることを明確に述べています。

この変更は、text/template パッケージの機能自体には影響を与えませんが、そのドキュメントを通じて、開発者がHTML生成におけるセキュリティ上のベストプラクティスを理解し、適切なパッケージを選択するよう促すための重要な修正です。

関連リンク

参考にした情報源リンク