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

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

このコミットは、Go言語の標準ライブラリである net/http パッケージ内の request.go ファイルに対する変更です。具体的には、HTTPリクエストのデフォルトのUser-Agent文字列に関するコメントが追加されています。

コミット

commit 7f6a7e22a8e93364d6d853c5983f8c0624c21165
Author: Russ Cox <rsc@golang.org>
Date:   Wed Sep 11 20:28:14 2013 -0400

    net/http: explain the "1.1" in the default User-Agent
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/13263052

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

https://github.com/golang/go/commit/7f6a7e22a8e93364d6d853c5983f8c0624c21165

元コミット内容

net/http: explain the "1.1" in the default User-Agent

このコミットは、net/http パッケージのデフォルトのUser-Agent文字列に含まれる「1.1」という表記について説明を追加するものです。

変更の背景

この変更の背景には、Go言語のnet/httpパッケージが送信するデフォルトのUser-Agent文字列が、一部の侵入検知システム(IDS)によってブラックリストに登録されてしまうという問題がありました。

元々、Goのnet/httpパッケージのデフォルトUser-Agentは「Go http package」のような形式でした。しかし、この特定の文字列が、悪意のある活動(例えば、ボットネットや特定の種類のスキャンツール)に関連付けられ、IDSによって不審なトラフィックとしてフラグ付けされることがありました。これにより、Goアプリケーションが正当なHTTPリクエストを送信しようとしても、IDSによってブロックされたり、警告が発せられたりする事態が発生していました。

この問題を解決するため、Go 1.1のリリース時にUser-Agent文字列が「Go 1.1 package http」に変更されました。このコミットは、なぜ「1.1」というバージョン番号がUser-Agentに含まれているのか、そしてそれが実際のGoのバージョンを反映しているわけではないという点を明確にするためのコメントを追加するものです。これは、将来的にGoのバージョンが上がっても、このUser-Agent文字列が変更されない可能性を示唆し、開発者が混乱しないようにするための配慮です。

前提知識の解説

HTTP User-Agentヘッダ

HTTP (Hypertext Transfer Protocol) は、Web上でデータを交換するためのプロトコルです。HTTPリクエストには、クライアント(Webブラウザやアプリケーション)がサーバーに送信する様々なヘッダ情報が含まれます。その一つが User-Agent ヘッダです。

User-Agent ヘッダは、リクエストを送信しているユーザーエージェント(クライアントソフトウェア)の識別情報を提供します。一般的なWebブラウザの場合、このヘッダにはブラウザの種類、バージョン、オペレーティングシステムなどの情報が含まれます(例: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36)。

サーバー側では、このUser-Agent情報を使用して、クライアントの種類に応じたコンテンツを提供したり、統計情報を収集したり、特定のクライアントからのアクセスを制御したりします。

User-Agentのブラックリスト化

User-Agent文字列は、Webスクレイピング、DDoS攻撃、脆弱性スキャンなどの悪意のある活動を行うボットやツールによっても使用されます。これらのツールは、しばしば特徴的なUser-Agent文字列を使用するか、あるいはUser-Agentを全く設定しないことがあります。

侵入検知システム(IDS)やWebアプリケーションファイアウォール(WAF)は、既知の悪意のあるUser-Agent文字列のリスト(ブラックリスト)を保持し、それらに一致するリクエストをブロックしたり、警告を発したりすることで、システムを保護します。

Goのnet/httpパッケージのデフォルトUser-Agentがブラックリストに登録されたのは、おそらくその文字列が特定の悪用パターンと関連付けられたためと考えられます。これは、正当なGoアプリケーションからのリクエストが誤ってブロックされるという、いわゆる「誤検知」の問題を引き起こしました。

技術的詳細

このコミットは、Go言語のnet/httpパッケージの内部実装に関するものです。net/httpパッケージは、GoアプリケーションがHTTPクライアントとして機能し、Webサーバーにリクエストを送信する際に使用されます。

変更の核心は、src/pkg/net/http/request.goファイル内のdefaultUserAgent定数に関連するコメントの追加です。

Go 1.1より前は、defaultUserAgentは「Go http package」のような文字列でした。Go 1.1のリリース時に、この文字列は「Go 1.1 package http」に変更されました。この変更は、前述のUser-Agentのブラックリスト問題に対処するためでした。

このコミットで追加されたコメントは、以下の点を明確にしています。

  1. 「1.1」の意図: defaultUserAgentに含まれる「1.1」は、実際のGoのバージョンを反映するものではないという点。これは、Go 1.1リリース時に変更された経緯を説明しています。
  2. 変更の理由: 以前のUser-Agent(「Go http package」)が、一部の侵入検知システムによってブラックリストに登録されてしまったため、変更されたという背景。
  3. 関連するコードレビュー: この変更に関する議論が行われたGoのコードレビュー(https://codereview.appspot.com/7532043)への参照。

このコメントは、コードを読む開発者に対して、なぜこの特定の文字列が使用されているのか、そして将来的にGoのバージョンが上がってもこの文字列が変更されない可能性があることを理解させるための重要なドキュメントです。これにより、User-AgentのバージョンがGoのランタイムバージョンと一致しないことによる混乱を防ぎ、また、なぜこのような一見奇妙な文字列が選ばれたのかという疑問を解消します。

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

diff --git a/src/pkg/net/http/request.go b/src/pkg/net/http/request.go
index ccdf121117..57b5d09484 100644
--- a/src/pkg/net/http/request.go
+++ b/src/pkg/net/http/request.go
@@ -291,6 +291,11 @@ func valueOrDefault(value, def string) string {\n 	return def\n }\n \n+// NOTE: This is not intended to reflect the actual Go version being used.\n+// It was changed from "Go http package" to "Go 1.1 package http" at the\n+// time of the Go 1.1 release because the former User-Agent had ended up\n+// on a blacklist for some intrusion detection systems.\n+// See https://codereview.appspot.com/7532043.\n const defaultUserAgent = "Go 1.1 package http"\n \n // Write writes an HTTP/1.1 request -- header and body -- in wire format.\n```

## コアとなるコードの解説

変更は`src/pkg/net/http/request.go`ファイル内の`defaultUserAgent`定数の定義部分に、複数行のコメントが追加された点です。

追加されたコメントは以下の通りです。

```go
// NOTE: This is not intended to reflect the actual Go version being used.
// It was changed from "Go http package" to "Go 1.1 package http" at the
// time of the Go 1.1 release because the former User-Agent had ended up
// on a blacklist for some intrusion detection systems.
// See https://codereview.appspot.com/7532043.

このコメントは、defaultUserAgent定数に設定されている文字列 "Go 1.1 package http" について、その背景と意図を説明しています。

  • // NOTE: This is not intended to reflect the actual Go version being used.
    • この行は、User-Agent文字列に含まれる「1.1」が、Goランタイムの実際のバージョンを意味するものではないことを明確にしています。これは、Goのバージョンが将来的に2.0やそれ以上になっても、このUser-Agent文字列が「Go 1.1 package http」のまま維持される可能性があることを示唆しています。
  • // It was changed from "Go http package" to "Go 1.1 package http" at the
  • // time of the Go 1.1 release because the former User-Agent had ended up
  • // on a blacklist for some intrusion detection systems.
    • これらの行は、User-Agent文字列が変更された具体的な理由を説明しています。以前の「Go http package」という文字列が、一部の侵入検知システム(IDS)によってブラックリストに登録され、問題を引き起こしたため、Go 1.1のリリース時に現在の文字列に変更されたことを述べています。
  • // See https://codereview.appspot.com/7532043.
    • この行は、このUser-Agent変更に関する詳細な議論が行われたGoのコードレビューへのリンクを提供しています。これにより、興味を持った開発者がさらに深い情報を得られるようになっています。

このコメントの追加により、defaultUserAgentの文字列がなぜこのようになっているのか、そしてその「1.1」が何を意味するのかという疑問が解消され、コードの可読性と保守性が向上しています。

関連リンク

  • Go Code Review 7532043: https://codereview.appspot.com/7532043

参考にした情報源リンク