漏洞:
我有一个 ASP.NET Web 应用程序,它偶尔会为“.www.mydomain.com”和“www.mydomain.com”设置相同的 cookie 键。我试图弄清楚 ASP.NET 设置的默认 cookie 域,以及我如何不小心将站点编码为有时会在前面加上“。” 到 cookie 域。
当 2 个 cookie 具有相同的密钥并从浏览器向上发送时,ASP.NET Web 应用程序无法区分两者,因为域值未在标头中发送。(见我之前的问题)
证据:
我已经在 Web 服务器上启用了 W3C 日志记录,并验证了这两个 cookie 都是从客户端发送的。这是日志文件中的一个示例(为简洁起见,已配对)。
80 GET /default.aspx page= 200 0 0 - - - - - +MyCookie2=sessionID=559ddb9b-0f38-4878-bb07-834c2ca9caae;+MyCookie2=sessionID=e13d83cd-eac2-46fc-b39d-01826b91cb2c;
可能的因素:
我正在使用启用子域的表单身份验证。
这是我的 web.config 设置:
<authentication mode="Forms">
<forms domain="mydomain.com" enableCrossAppRedirects="true" loginUrl="/login" requireSSL="false" timeout="5259600" />
</authentication>
以下是设置自定义 cookie 的示例:
HttpCookie cookie1 = new HttpCookie("MyCookie1") {HttpOnly = true, Expires = expiration};
logosCookie["email"] = user.Email;
logosCookie["keycode"] = user.PasswordHash;
logosCookie["version"] = currentCookieVersion;
context.Response.Cookies.Remove("cookie1");
context.Response.Cookies.Add(cookie1);
// set FormsAuth cookie manually so we can add the UserId to the ticket UserData
var userData = "UserId=" + user.UserID;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, user.Email, now, expiration, true, userData);
string str = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str)
{
HttpOnly = true,
Path = FormsAuthentication.FormsCookiePath,
Secure = FormsAuthentication.RequireSSL,
Expires = ticket.Expiration
};
if (FormsAuthentication.CookieDomain != null)
{
cookie.Domain = FormsAuthentication.CookieDomain;
}
context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
context.Response.Cookies.Add(cookie1 );
这是另一个设置 cookie 的示例。
var cookie2 = new HttpCookie("MyCookie2");
cookie2[CookieSessionIdKey] = Guid.NewGuid();
cookie2.Expires = DateTime.Now.AddYears(10);
HttpContext.Current.Response.Cookies.Set(cookie2);
不良分辨率:
我可以手动强制 cookie 域为特定值,但我想避免明确声明域。我更喜欢使用默认的框架行为并更改我对 ASP.NET 的使用以避免在“。”之前添加。到自定义 cookie 的 cookie 域。