14

Web サイトにアクセスしてログインし、いくつかのタスクを自動的に実行するクライアントを作成していますが、最近、Cookie を更新して (何らかの理由で...) 識別 Cookie 内にコンマを含めました。

たとえば、Cookie の値は次のようになります。

a,bcdefghijklmnop

問題は、msdnによると、Cookie の値にコンマもピリオドも使用できないことです。私が探しているのは、この制限を回避する方法、.net の Cookie をカンマで適切に機能させる方法です。サーバーが「SET-COOKIE」ヘッダーをクライアントに送信することがわかりました。それが解析されていると推測していますが、それは明らかにコマンドとセミコロンにも特別な意味を与えているようです (したがって、 .NET 自体内のクラス)。

しかし、IE、FirefoxなどのブラウザはどのようにCookieを適切に処理しますか(ウェブサイトは私がテストしたすべてのブラウザで正常に動作するため、明らかにそうです)これを強制する方法はありますか? .NET での動作?

どんな助けでも感謝します、ありがとう。

- - 編集 - -

いくつかの追加情報:

私のコードは次のようになります。

request = (HttpWebRequest)WebRequest.Create(URI); 
request.CookieContainer = Program.client.cookieJar;

cookieJar は Program.client で次のように定義されています。

CookieContainer cookieJar = new CookieContainer();

CookieContainer 内のすべての Cookie をループして出力すると、次のような結果が得られます: (Cookie、形式: "name" -> "value")

"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a" 
"bcdefghijklmnop" -> "" 

// What I should get is this: 
"normal_cookie" -> "i am the value" 
"messedup_cookie" -> "a,bcdefghijklmnop" 

問題の核心は、コンマとセミコロンが SET-COOKIE ヘッダー文字列の予約文字であるように思われます...しかし、ブラウザはこれをどのように処理するのでしょうか? おそらく自分で文字列を解析できますが、次のような状況を回避する方法がわかりません:(HTTPヘッダー、形式:「名前」->「値」)

"Set-Cookie" -> "messedup_cookie=a,bcdefghijklmnop; path=/; domain=.domain.com; expires=Sat, 15-Aug-2009 09:14:24 GMT,anothervariable=i am the value;"

ご覧のとおり、expires セクションは次の変数と区別するためにセミコロンの代わりにカンマを探します。私が知る限り、それは次の形式です。

cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value

しかし、それが本当なら、値の 1 つの中で発生する可能性のあるコンマを処理するエレガントな方法はありますか?

4

2 に答える 2

8

次の記事によると、Cookie に値を格納するには UrlEncode と UrlDecode を検討する必要があります。

private void SetCookie()
{
    HttpCookie cookie = new HttpCookie("cookiename");
    cookie.Expires = DateTime.Now.AddMonths(24);
    cookie.Values.Add("name", Server.UrlEncode(txtName.Text));
    Response.Cookies.Add(cookie);
}

private void GetCookie()
{
    HttpCookie cookie = Request.Cookies["cookiename"];
    if (cookie != null)
    {
        txtName.Text = Server.UrlDecode(cookie.Values["name"]);
    }
}

ASP.NET で Cookie を HTML エンコードしないでください。その結果、黄色の死の画面が表示され、Cookie に危険な文字が含まれていることを示す例外が表示されます。

MSDN にもこの件に関する記事があります。

ASP.NET は、既定では UrlEncode 形式で Cookie をエンコードまたはエンコード解除しません。その結果、ASP.NET アプリケーションで予期しない動作が発生する場合があります。

于 2009-07-16T09:33:21.067 に答える
4

Cookie は基本的に文字列であるため、Cookie を処理するには、設定する前に Cookie の値を URL エンコードし、値を取り出すときにデコードすることをお勧めします。

すなわち:

Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue);

同様に:

string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);
于 2009-07-16T09:31:27.000 に答える