[インデックス 13426] ファイルの概要
このコミットは、Go言語の標準ライブラリ net/http
パッケージにおける、HTTP Range リクエストの処理に関するセキュリティおよび堅牢性の改善を目的としています。具体的には、悪意のある、または非効率な Range リクエスト(例えば、ファイルサイズを超える範囲を要求したり、非常に多数の小さな範囲を要求したりするケース)を検出し、それらを無視して通常の完全なコンテンツとして応答することで、サービス拒否(DoS)攻撃やリソースの無駄遣いを防ぐための変更が加えられています。
コミット
commit f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Sat Jun 30 12:26:06 2012 -0700
net/http: ignore malicious or dumb Range requests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6356050
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e
元コミット内容
net/http: ignore malicious or dumb Range requests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6356050
変更の背景
HTTP Range リクエストは、クライアントがリソース全体ではなく、その一部のみを要求するために使用されます。これは、動画のストリーミング、ダウンロードの再開、または大きなファイルの並行ダウンロードなど、正当な目的で広く利用されています。しかし、この機能は悪用される可能性も秘めています。
変更の背景には、主に以下の2つの問題が考えられます。
- サービス拒否(DoS)攻撃の可能性: 悪意のあるクライアントが、非常に多数の小さな範囲指定を含む
Range
ヘッダーを送信した場合、サーバーはそれらのすべての範囲を処理し、それぞれに対して個別のチャンクを生成し、マルチパートレスポンスを構築するために大量のCPU時間とメモリを消費する可能性があります。これにより、サーバーのリソースが枯渇し、正当なリクエストに応答できなくなるサービス拒否状態に陥る可能性があります。 - 非効率なリクエストの処理: 悪意がなくとも、不適切に実装されたクライアントや、デバッグツールなどが、ファイルサイズを大幅に超える範囲を要求したり、非常に非効率な範囲指定を行ったりすることがあります。このような「愚かな(dumb)」リクエストに対しても、サーバーが不必要にリソースを消費して処理しようとすることは、パフォーマンスの低下につながります。
このコミットは、これらの問題を緩和し、net/http
パッケージがより堅牢に、そして効率的に Range リクエストを処理できるようにするために導入されました。具体的には、要求された範囲の合計サイズが元のファイルサイズを超える場合に、その Range リクエストを無視し、代わりにファイル全体を返すことで、サーバーへの負荷を軽減します。
前提知識の解説
HTTP Range リクエスト
HTTP/1.1 では、クライアントがリソースの特定の部分のみを要求するために Range
ヘッダーを使用できます。
Range
ヘッダー: クライアントが要求するバイト範囲を指定します。例:Range: bytes=0-499
(最初の500バイト)、Range: bytes=500-
(500バイト目から最後まで)、Range: bytes=-500
(最後の500バイト)。Content-Range
ヘッダー: サーバーが部分的なコンテンツを返す際に、そのコンテンツがリソース全体のどの部分であるかを示します。例:Content-Range: bytes 0-499/1234
。206 Partial Content
ステータスコード: サーバーが Range リクエストを正常に処理し、部分的なコンテンツを返した場合にこのステータスコードを返します。200 OK
ステータスコード: サーバーが Range リクエストを無視し、リソース全体を返した場合にこのステータスコードを返します。これは、Range ヘッダーが無効であるか、サーバーが部分的なコンテンツの提供をサポートしていない場合などに発生します。416 Requested Range Not Satisfiable
ステータスコード: クライアントが要求した範囲がリソースの現在のサイズと矛盾する場合(例: 存在しない範囲を要求した場合)に返されます。
マルチパートレスポンス
複数の Range が指定された場合(例: Range: bytes=0-499, 900-999
)、サーバーは multipart/byteranges
の Content-Type
を持つレスポンスを返すことがあります。この場合、レスポンスボディは各範囲のコンテンツを区切り文字で区切って含みます。このマルチパートレスポンスの生成は、サーバーにとって追加の処理オーバーヘッドを伴います。
Range Header DoS (サービス拒否) 攻撃
前述の通り、悪意のあるアクターは、非常に多数の重複しない、または非常に小さな範囲を Range
ヘッダーに含めることで、サーバーに過剰な処理を強制し、リソースを枯渇させる可能性があります。例えば、1GBのファイルに対して Range: bytes=0-0,1-1,2-2,...,1048575-1048575
のように、1バイトずつの範囲を100万個指定するようなリクエストは、サーバーに膨大な数の小さなチャンクを読み込み、結合し、マルチパートレスポンスを構築させることになり、深刻なパフォーマンス問題を引き起こします。
このコミットは、このような攻撃パターンを検出し、Range リクエストを無視することで、サーバーを保護します。
技術的詳細
このコミットは、src/pkg/net/http/fs.go
ファイル内の serveContent
関数に主要な変更を加えています。serveContent
関数は、HTTPリクエストに応じてファイルやその他のコンテンツをクライアントに提供する役割を担っています。
変更の核心は、クライアントから送られてきた Range
ヘッダーによって解析されたすべての範囲(ranges
スライス)の合計サイズを計算し、それが元のコンテンツのサイズ(size
)以上であるかどうかをチェックするロジックの追加です。
-
sumRangesSize
関数の追加:sumRangesSize
という新しいヘルパー関数が追加されました。この関数は[]httpRange
型のスライスを受け取り、その中の各httpRange
構造体のlength
フィールド(各範囲のバイト長)を合計して返します。func sumRangesSize(ranges []httpRange) (size int64) { for _, ra := range ranges { size += ra.length } return }
-
serveContent
関数内のチェック:serveContent
関数内で、Range ヘッダーが正常に解析され、ranges
スライスが生成された直後に、以下のチェックが追加されました。if sumRangesSize(ranges) >= size { // The total number of bytes in all the ranges // is larger the the size of the file by // itself, so this is probably an attack, or a // dumb client. Ignore the range request. ranges = nil }
このコードは、
sumRangesSize
を呼び出してすべての要求された範囲の合計バイト数を計算します。もしこの合計が、提供しようとしているファイル全体のサイズsize
以上である場合、その Range リクエストは「悪意のある、または愚かな(malicious or dumb)」ものと判断されます。このような場合、ranges
変数にnil
を代入することで、後続の処理で Range リクエストがなかったものとして扱われるようにします。結果として、サーバーは200 OK
ステータスコードとともにファイル全体をクライアントに返します。
このアプローチにより、サーバーは不必要なリソース消費を回避し、潜在的な DoS 攻撃から自身を保護することができます。ファイルサイズを超える範囲の合計を要求するリクエストは、通常、正当なものではなく、悪意のある意図があるか、クライアントの実装に問題があるかのいずれかであるため、これを無視することは理にかなっています。
テストファイル src/pkg/net/http/fs_test.go
にも、この変更を検証するための新しいテストケースが追加されています。
{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request
このテストケースは、ファイルサイズを超えるような多数の範囲指定(0-
はファイル全体を意味するため、それに加えて 1-
, 2-
などが続くのは無駄なリクエスト)が送られた場合に、サーバーが 200 OK
を返し、Range リクエストを無視することを確認しています。
コアとなるコードの変更箇所
src/pkg/net/http/fs.go
--- a/src/pkg/net/http/fs.go
+++ b/src/pkg/net/http/fs.go
@@ -152,6 +152,13 @@ func serveContent(w ResponseWriter, r *Request, name string, modtime time.Time,
Error(w, err.Error(), StatusRequestedRangeNotSatisfiable)
return
}
+ if sumRangesSize(ranges) >= size {
+ // The total number of bytes in all the ranges
+ // is larger the the size of the file by
+ // itself, so this is probably an attack, or a
+ // dumb client. Ignore the range request.
+ ranges = nil
+ }
switch {
case len(ranges) == 1:
// RFC 2616, Section 14.16:
@@ -446,3 +453,10 @@ func rangesMIMESize(ranges []httpRange, contentType string, contentSize int64) (
encSize += int64(w)
return
}
+
+func sumRangesSize(ranges []httpRange) (size int64) {
+ for _, ra := range ranges {
+ size += ra.length
+ }
+ return
+}
src/pkg/net/http/fs_test.go
--- a/src/pkg/net/http/fs_test.go
+++ b/src/pkg/net/http/fs_test.go
@@ -50,6 +50,7 @@ var ServeFileRangeTests = []struct {
{r: "bytes=0-0,-2", code: StatusPartialContent, ranges: []wantRange{{0, 1}, {testFileLen - 2, testFileLen}}},\n {r: "bytes=0-1,5-8", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, 9}}},\n {r: "bytes=0-1,5-", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, testFileLen}}},\n+\t{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request\n }\n \n func TestServeFile(t *testing.T) {
コアとなるコードの解説
src/pkg/net/http/fs.go
の変更点
-
serveContent
関数内の新しい条件分岐:serveContent
関数は、HTTPリクエストのRange
ヘッダーを解析し、ranges
という[]httpRange
型のスライスに有効な範囲を格納します。このコミットでは、ranges
が設定された直後に、以下の条件が追加されました。if sumRangesSize(ranges) >= size { // The total number of bytes in all the ranges // is larger the the size of the file by // itself, so this is probably an attack, or a // dumb client. Ignore the range request. ranges = nil }
ここで
sumRangesSize(ranges)
は、クライアントが要求したすべての範囲の合計バイト数を計算します。size
は、サーバーが提供しようとしているコンテンツ(ファイル)の実際の合計サイズです。 もし要求された範囲の合計サイズが実際のファイルサイズ以上である場合、これは通常、不正なリクエスト(DoS攻撃の試みなど)であるか、または単に非効率的で意味のないリクエストであると判断されます。このような場合、ranges = nil
とすることで、serveContent
関数の後続のロジックが、Range リクエストが全くなかったかのように動作するように強制します。これにより、サーバーは206 Partial Content
ではなく200 OK
ステータスコードでファイル全体を返すことになります。これは、不必要な部分コンテンツの生成処理を回避し、サーバーのリソースを保護するための重要な防御策です。 -
sumRangesSize
ヘルパー関数の追加: この新しい関数は、httpRange
構造体のスライスを受け取り、その中の各範囲の長さ(ra.length
)を合計して返します。これは、上記の条件分岐で Range リクエストの合計サイズを効率的に計算するために導入されました。func sumRangesSize(ranges []httpRange) (size int64) { for _, ra := range ranges { size += ra.length } return }
この関数はシンプルですが、Range リクエストの健全性をチェックするための基盤となります。
src/pkg/net/http/fs_test.go
の変更点
新しいテストケースが ServeFileRangeTests
スライスに追加されました。
{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request
このテストケースは、Range: bytes=0-,1-,2-,3-,4-
というヘッダーを持つリクエストをシミュレートします。0-
はファイル全体を意味するため、それに続く 1-
, 2-
などは冗長であり、このリクエストは「無駄な(wasteful)」または「愚かな(dumb)」Range リクエストと見なされます。このテストは、このようなリクエストに対してサーバーが 200 OK
ステータスコードを返し、Range リクエストを無視してファイル全体を返すことを検証します。これは、fs.go
で追加されたロジックが期待通りに機能していることを確認するためのものです。
これらの変更により、Goの net/http
パッケージは、HTTP Range リクエストの処理において、より堅牢で安全になりました。
関連リンク
- Go Issue Tracker (関連する可能性のあるIssue):
- Go CL (Change List) へのリンク:
- https://golang.org/cl/6356050 (コミットメッセージに記載されている元のCL)
- RFC 2616 (HTTP/1.1):
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 (Range ヘッダーに関するセクション)
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.7 (206 Partial Content)
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.17 (416 Requested Range Not Satisfiable)
参考にした情報源リンク
- https://github.com/golang/go/commit/f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e (本コミットのGitHubページ)
- HTTP Range Header DoS Attack (一般的な情報源、特定のURLはなし)
- Go言語の
net/http
パッケージのドキュメント (一般的な情報源、特定のURLはなし) - RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 (上記関連リンクに記載)
- Go CL 6356050 (上記関連リンクに記載)
- Goのソースコード (
src/pkg/net/http/fs.go
,src/pkg/net/http/fs_test.go
)# [インデックス 13426] ファイルの概要
このコミットは、Go言語の標準ライブラリ net/http
パッケージにおける、HTTP Range リクエストの処理に関するセキュリティおよび堅牢性の改善を目的としています。具体的には、悪意のある、または非効率な Range リクエスト(例えば、ファイルサイズを超える範囲を要求したり、非常に多数の小さな範囲を要求したりするケース)を検出し、それらを無視して通常の完全なコンテンツとして応答することで、サービス拒否(DoS)攻撃やリソースの無駄遣いを防ぐための変更が加えられています。
コミット
commit f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Sat Jun 30 12:26:06 2012 -0700
net/http: ignore malicious or dumb Range requests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6356050
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e
元コミット内容
net/http: ignore malicious or dumb Range requests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/6356050
変更の背景
HTTP Range リクエストは、クライアントがリソース全体ではなく、その一部のみを要求するために使用されます。これは、動画のストリーミング、ダウンロードの再開、または大きなファイルの並行ダウンロードなど、正当な目的で広く利用されています。しかし、この機能は悪用される可能性も秘めています。
変更の背景には、主に以下の2つの問題が考えられます。
- サービス拒否(DoS)攻撃の可能性: 悪意のあるクライアントが、非常に多数の小さな範囲指定を含む
Range
ヘッダーを送信した場合、サーバーはそれらのすべての範囲を処理し、それぞれに対して個別のチャンクを生成し、マルチパートレスポンスを構築するために大量のCPU時間とメモリを消費する可能性があります。これにより、サーバーのリソースが枯渇し、正当なリクエストに応答できなくなるサービス拒否状態に陥る可能性があります。 - 非効率なリクエストの処理: 悪意がなくとも、不適切に実装されたクライアントや、デバッグツールなどが、ファイルサイズを大幅に超える範囲を要求したり、非常に非効率な範囲指定を行ったりすることがあります。このような「愚かな(dumb)」リクエストに対しても、サーバーが不必要にリソースを消費して処理しようとすることは、パフォーマンスの低下につながります。
このコミットは、これらの問題を緩和し、net/http
パッケージがより堅牢に、そして効率的に Range リクエストを処理できるようにするために導入されました。具体的には、要求された範囲の合計サイズが元のファイルサイズを超える場合に、その Range リクエストを無視し、代わりにファイル全体を返すことで、サーバーへの負荷を軽減します。
前提知識の解説
HTTP Range リクエスト
HTTP/1.1 では、クライアントがリソースの特定の部分のみを要求するために Range
ヘッダーを使用できます。
Range
ヘッダー: クライアントが要求するバイト範囲を指定します。例:Range: bytes=0-499
(最初の500バイト)、Range: bytes=500-
(500バイト目から最後まで)、Range: bytes=-500
(最後の500バイト)。Content-Range
ヘッダー: サーバーが部分的なコンテンツを返す際に、そのコンテンツがリソース全体のどの部分であるかを示します。例:Content-Range: bytes 0-499/1234
。206 Partial Content
ステータスコード: サーバーが Range リクエストを正常に処理し、部分的なコンテンツを返した場合にこのステータスコードを返します。200 OK
ステータスコード: サーバーが Range リクエストを無視し、リソース全体を返した場合にこのステータスコードを返します。これは、Range ヘッダーが無効であるか、サーバーが部分的なコンテンツの提供をサポートしていない場合などに発生します。416 Requested Range Not Satisfiable
ステータスコード: クライアントが要求した範囲がリソースの現在のサイズと矛盾する場合(例: 存在しない範囲を要求した場合)に返されます。
マルチパートレスポンス
複数の Range が指定された場合(例: Range: bytes=0-499, 900-999
)、サーバーは multipart/byteranges
の Content-Type
を持つレスポンスを返すことがあります。この場合、レスポンスボディは各範囲のコンテンツを区切り文字で区切って含みます。このマルチパートレスポンスの生成は、サーバーにとって追加の処理オーバーヘッドを伴います。
Range Header DoS (サービス拒否) 攻撃
前述の通り、悪意のあるアクターは、非常に多数の重複しない、または非常に小さな範囲を Range
ヘッダーに含めることで、サーバーに過剰な処理を強制し、リソースを枯渇させる可能性があります。例えば、1GBのファイルに対して Range: bytes=0-0,1-1,2-2,...,1048575-1048575
のように、1バイトずつの範囲を100万個指定するようなリクエストは、サーバーに膨大な数の小さなチャンクを読み込み、結合し、マルチパートレスポンスを構築させることになり、深刻なパフォーマンス問題を引き起こします。
このコミットは、このような攻撃パターンを検出し、Range リクエストを無視することで、サーバーを保護します。
技術的詳細
このコミットは、src/pkg/net/http/fs.go
ファイル内の serveContent
関数に主要な変更を加えています。serveContent
関数は、HTTPリクエストに応じてファイルやその他のコンテンツをクライアントに提供する役割を担っています。
変更の核心は、クライアントから送られてきた Range
ヘッダーによって解析されたすべての範囲(ranges
スライス)の合計サイズを計算し、それが元のコンテンツのサイズ(size
)以上であるかどうかをチェックするロジックの追加です。
-
sumRangesSize
関数の追加:sumRangesSize
という新しいヘルパー関数が追加されました。この関数は[]httpRange
型のスライスを受け取り、その中の各httpRange
構造体のlength
フィールド(各範囲のバイト長)を合計して返します。func sumRangesSize(ranges []httpRange) (size int64) { for _, ra := range ranges { size += ra.length } return }
-
serveContent
関数内のチェック:serveContent
関数内で、Range ヘッダーが正常に解析され、ranges
スライスが生成された直後に、以下のチェックが追加されました。if sumRangesSize(ranges) >= size { // The total number of bytes in all the ranges // is larger the the size of the file by // itself, so this is probably an attack, or a // dumb client. Ignore the range request. ranges = nil }
このコードは、
sumRangesSize
を呼び出してすべての要求された範囲の合計バイト数を計算します。もしこの合計が、提供しようとしているファイル全体のサイズsize
以上である場合、その Range リクエストは「悪意のある、または愚かな(malicious or dumb)」ものと判断されます。このような場合、ranges
変数にnil
を代入することで、後続の処理で Range リクエストがなかったものとして扱われるようにします。結果として、サーバーは200 OK
ステータスコードとともにファイル全体をクライアントに返します。
このアプローチにより、サーバーは不必要なリソース消費を回避し、潜在的な DoS 攻撃から自身を保護することができます。ファイルサイズを超える範囲の合計を要求するリクエストは、通常、正当なものではなく、悪意のある意図があるか、クライアントの実装に問題があるかのいずれかであるため、これを無視することは理にかなっています。
テストファイル src/pkg/net/http/fs_test.go
にも、この変更を検証するための新しいテストケースが追加されています。
{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request
このテストケースは、ファイルサイズを超えるような多数の範囲指定(0-
はファイル全体を意味するため、それに加えて 1-
, 2-
などが続くのは無駄なリクエスト)が送られた場合に、サーバーが 200 OK
を返し、Range リクエストを無視することを確認しています。
コアとなるコードの変更箇所
src/pkg/net/http/fs.go
--- a/src/pkg/net/http/fs.go
+++ b/src/pkg/net/http/fs.go
@@ -152,6 +152,13 @@ func serveContent(w ResponseWriter, r *Request, name string, modtime time.Time,
Error(w, err.Error(), StatusRequestedRangeNotSatisfiable)
return
}
+ if sumRangesSize(ranges) >= size {
+ // The total number of bytes in all the ranges
+ // is larger the the size of the file by
+ // itself, so this is probably an attack, or a
+ // dumb client. Ignore the range request.
+ ranges = nil
+ }
switch {
case len(ranges) == 1:
// RFC 2616, Section 14.16:
@@ -446,3 +453,10 @@ func rangesMIMESize(ranges []httpRange, contentType string, contentSize int64) (\
encSize += int64(w)
return
}
+
+func sumRangesSize(ranges []httpRange) (size int64) {
+ for _, ra := range ranges {
+ size += ra.length
+ }
+ return
+}
src/pkg/net/http/fs_test.go
--- a/src/pkg/net/http/fs_test.go
+++ b/src/pkg/net/http/fs_test.go
@@ -50,6 +50,7 @@ var ServeFileRangeTests = []struct {
{r: "bytes=0-0,-2", code: StatusPartialContent, ranges: []wantRange{{0, 1}, {testFileLen - 2, testFileLen}}},\n {r: "bytes=0-1,5-8", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, 9}}},\n {r: "bytes=0-1,5-", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, testFileLen}}},\n+\t{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request\n }\n \n func TestServeFile(t *testing.T) {
コアとなるコードの解説
src/pkg/net/http/fs.go
の変更点
-
serveContent
関数内の新しい条件分岐:serveContent
関数は、HTTPリクエストのRange
ヘッダーを解析し、ranges
という[]httpRange
型のスライスに有効な範囲を格納します。このコミットでは、ranges
が設定された直後に、以下の条件が追加されました。if sumRangesSize(ranges) >= size { // The total number of bytes in all the ranges // is larger the the size of the file by // itself, so this is probably an attack, or a // dumb client. Ignore the range request. ranges = nil }
ここで
sumRangesSize(ranges)
は、クライアントが要求したすべての範囲の合計バイト数を計算します。size
は、サーバーが提供しようとしているコンテンツ(ファイル)の実際の合計サイズです。 もし要求された範囲の合計サイズが実際のファイルサイズ以上である場合、これは通常、不正なリクエスト(DoS攻撃の試みなど)であるか、または単に非効率的で意味のないリクエストであると判断されます。このような場合、ranges = nil
とすることで、serveContent
関数の後続のロジックが、Range リクエストが全くなかったかのように動作するように強制します。これにより、サーバーは206 Partial Content
ではなく200 OK
ステータスコードでファイル全体を返すことになります。これは、不必要な部分コンテンツの生成処理を回避し、サーバーのリソースを保護するための重要な防御策です。 -
sumRangesSize
ヘルパー関数の追加: この新しい関数は、httpRange
構造体のスライスを受け取り、その中の各範囲の長さ(ra.length
)を合計して返します。これは、上記の条件分岐で Range リクエストの合計サイズを効率的に計算するために導入されました。func sumRangesSize(ranges []httpRange) (size int64) { for _, ra := range ranges { size += ra.length } return }
この関数はシンプルですが、Range リクエストの健全性をチェックするための基盤となります。
src/pkg/net/http/fs_test.go
の変更点
新しいテストケースが ServeFileRangeTests
スライスに追加されました。
{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request
このテストケースは、Range: bytes=0-,1-,2-,3-,4-
というヘッダーを持つリクエストをシミュレートします。0-
はファイル全体を意味するため、それに続く 1-
, 2-
などは冗長であり、このリクエストは「無駄な(wasteful)」または「愚かな(dumb)」Range リクエストと見なされます。このテストは、このようなリクエストに対してサーバーが 200 OK
ステータスコードを返し、Range リクエストを無視してファイル全体を返すことを検証します。これは、fs.go
で追加されたロジックが期待通りに機能していることを確認するためのものです。
これらの変更により、Goの net/http
パッケージは、HTTP Range リクエストの処理において、より堅牢で安全になりました。
関連リンク
- Go Issue Tracker (関連する可能性のあるIssue):
- Go CL (Change List) へのリンク:
- https://golang.org/cl/6356050 (コミットメッセージに記載されている元のCL)
- RFC 2616 (HTTP/1.1):
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 (Range ヘッダーに関するセクション)
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.7 (206 Partial Content)
- https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.17 (416 Requested Range Not Satisfiable)
参考にした情報源リンク
- https://github.com/golang/go/commit/f06b12f0c7e0ce9435e9d8b0faf79c192c470e4e (本コミットのGitHubページ)
- HTTP Range Header DoS Attack (一般的な情報源、特定のURLはなし)
- Go言語の
net/http
パッケージのドキュメント (一般的な情報源、特定のURLはなし) - RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 (上記関連リンクに記載)
- Go CL 6356050 (上記関連リンクに記載)
- Goのソースコード (
src/pkg/net/http/fs.go
,src/pkg/net/http/fs_test.go
)