45

HTTP Cookie は名前と値のペアで構成され、次の応答を使用してサーバーで設定できます。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

クライアントからの今後のリクエストは次のようになります。

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2

Cookie の名前は大文字と小文字が区別されますか?

たとえば、サーバーが次のような応答を送信した場合:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: Aaaa=Bbbb
Set-Cookie: aAaa=bBbb
Set-Cookie: aaAa=bbBb
Set-Cookie: aaaA=bbbB

クライアント (Chrome、FireFox、Safari、IExplorer、Opera など) がヘッダーを含む将来のリクエストを送信することを期待するのは合理的Cookie: Aaaa=Bbbb; aAaa=bBbb; aaAa=bbBb; aaaA=bbbB;ですか?

注: 質問は、JSP 固有でも、PHP 固有でも、ASP 固有でもありません。

4

5 に答える 5

44

Cookieの名前では大文字と小文字が区別されます。RFCはそれを明示的に述べていませんが、大文字と小文字を区別しない各比較はそのように明示的に述べられており、Cookieの名前に関するそのような明示的な記述はありません。ChromeとFirefoxはどちらも、Cookieを大文字と小文字を区別して扱い、すべての大文字と小文字を区別するCookieとして保持します。

テストケース(PHP):

print_r($_COOKIE);

setcookie('foo', '123');
setcookie('Foo', '456');

$_COOKIEスクリプトを2回ロードし、2回目の実行でダンプを観察します。

于 2012-07-03T13:42:49.930 に答える
5

下部には、ブラウザーと .Net フレームワークでの Cookie の大文字と小文字の区別を示すスクリプトがあります。実行されるたびに、xxxxxxxxxx という名前の Cookie がランダムな大文字/小文字で挿入されます。F5 キーを押して数回更新し、いくつかの Cookie を挿入します。

Chrome と Firefox でテストしましたが、どちらも以下のような同様の動作を示しています。

Request.Cookies["xxxxxxxxxx"].Name returns: xxxxXxXXXX
All XXXXXXXXXX Cookies:

    xxxxXxXXXX
    xXxxXxXXXx
    XxxxxXxXXx
    XXXxXxXXxX

それが示している:

  • Cookie は Chrome と Firefox で大文字と小文字が区別されます
  • .Net Framework は、大文字と小文字を区別する Cookie を処理できます (そのため、すべての Cookie をループする可能性があります)。
  • Request.Cookies["xxxxxxxxxx"] は大文字と小文字を区別しません (そのため、大文字と小文字を区別せずに名前に一致する最初の Cookie を返します)

他の回答で述べたように、新しい RFC は Cookie が大文字と小文字を区別することを示しており、Chrome と Firefox の両方がそのように処理しているようです。.Net Framework は大文字と小文字を区別する Cookie を処理できますが、実際には Cookie を大文字と小文字を区別せずに処理する必要があり、その関数の多くは Cookie をそのように処理します (Cookies[]、Cookies.Set() など)。この不一致により、追跡が困難な多くのバグが発生する可能性があります。

TestCookie.aspx:

<%@ Page language="c#" AutoEventWireup="false" validateRequest=false %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title id="title">Test Cookie Sensitivity</title>
</head>
<body>
<p>Request.Cookies["xxxxxxxxxx"].Name returns:
<%
    HttpCookie cookie2 = Request.Cookies["xxxxxxxxxx"];
    if (cookie2 == null) Response.Write("No cookie found");
    else Response.Write(cookie2.Name);
%>
</p>
<h3>All XXXXXXXXXX Cookies:</h3>
<ul>
<%
    foreach (string key in Request.Cookies.Keys)
        if (key.ToLower() == "xxxxxxxxxx") Response.Write("<li>" + key + "</li>");
    Random rand = new Random();
    StringBuilder name = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        if (rand.Next(2) == 0) name.Append('x');
        else name.Append('X');
    }
    HttpCookie cookie = new HttpCookie(name.ToString());
    cookie.HttpOnly = true;
    cookie.Expires = DateTime.Now.AddMonths(1);
    Response.Cookies.Add(cookie);
%>
</ul>
</body>
</html>
于 2014-06-25T14:16:49.750 に答える
3

Cookie は実際には大文字と小文字を区別しているようです。これにはいくつかの混乱があります。MSDN が別のことを言っているのは興味深いことです。

Cookie 名は大文字と小文字を区別しません

出典: http://msdn.microsoft.com/en-us/library/ms970178.aspx記事の下部にある©2002ため、古い可能性があります。

また、asp.net フォーラムでも質問されています: http://forums.asp.net/t/1170326.aspx?Are+cookie+names+case+sensitive+答えは大文字と小文字が区別されるようです.

どうしたの?MSDN はノーと言いますが、他のテクノロジはイエスと言っています。確かに、ASP クラシックを使用してこれをテストしました。

コード

hashUCASE = Request.Cookies("data")("Hash")
hashLCASE = Request.Cookies("data")("hash")

Response.Write "<p> hashUCASE = " & hashUCASE
Response.Write "<br> hashLCASE = " & hashLCASE


cookieNameUCASE = Request.Cookies("Data")
cookieNameLCASE = Request.Cookies("data")

Response.Write "<p> cookieNameUCASE = " & cookieNameUCASE
Response.Write "<br> cookieNameLCASE = " & cookieNameLCASE

Response.End

結果

hashUCASE: EE3305C0DAADAAAA221BD5ACF6996AAA
hashLCASE: EE3305C0DAADAAAA221BD5ACF6996AAA

cookieNameUCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA
cookieNameLCASE: name=1&Hash=EE3305C0DAADAAAA221BD5ACF6996AAA

結果からわかるように、値「Hash」は大文字で作成されており、小文字でリクエストしても同じ値が返されるため、大文字と小文字は区別されません。このMS技術では、そうではありません。

結論

したがって、ASP クラシックで Request.Cookies() を使用すると、マイクロソフトが言うように大文字と小文字が区別されません。でも待ってください、また大文字と小文字が区別されませんか? これは、機密かどうかがブラウザにリクエストを行うサーバー側の技術に依存することを意味する場合があります。これは、リクエストを行うために Cookie 名を正規化し、大文字と小文字を区別しないようにする可能性があります。しかし、それは検証のためにテストする必要がある別のものです.

私のアドバイスは、使用しているテクノロジーでテストを行い、コードベースで標準を確立し、チームと合意することです。つまり、Cookie を使用する場合は、コードで使用するときはいつでも小文字または大文字で記述するかどうかを決定します。そうすれば、コードでは常に同じケースで宣言されるため、大文字と小文字の区別の問題は発生しません。

tl;dr

Cookie 名の規則を守っている限り、大文字と小文字の区別の問題はありません。

于 2014-04-11T20:37:27.260 に答える
2

RFC 2109 - HTTP State Management Mechanism Cookie 名 (別名属性名) によると、大文字と小文字は区別されません。

4.1 構文: 一般

Set-Cookie と Cookie の 2 つの状態管理ヘッダーには、属性と値のペアを含む共通の構文プロパティがあります。次の文法では、HTTP/1.1 仕様 [RFC 2068] の表記法、およびトークン DIGIT (10 進数) とトークン (非公式には、非特殊文字、非空白文字のシーケンス) を使用して、それらの構文を記述します。

av-pairs        =       av-pair *(";" av-pair)
av-pair         =       attr ["=" value]        ; optional value
attr            =       token
value           =       word
word            =       token | quoted-string

属性 (名前) (attr) は大文字と小文字を区別しません。 トークン間には空白を入れることができます。上記の構文の説明では value をオプションとして示していますが、ほとんどの attrs では必須であることに注意してください。

于 2013-03-04T19:42:49.843 に答える
1

MSDNによると、Cookieの名前では大文字と小文字は区別されません。ただし、それがASPX/IIS固有の実装であるかどうかはわかりません。Webサーバーや言語にもよると思います。

「UserID」という名前のCookieを送信すると、ブラウザは「userid」ではなく「UserID」としてCookieを送信するようにします。

于 2012-07-03T13:26:53.820 に答える