我简直无法相信这很难确定.
即使已阅读RFC,我也不清楚subdomain.example.com上的服务器是否可以设置可由example.com读取的cookie.
subdomain.example.com可以设置其Domain属性为.example.com的cookie.RFC 2965似乎明确声明这样的cookie不会被发送到example.com,但是同样地说,如果你设置Domain = example.com,前面有一个点,就像你说的那样.example.com.总而言之,这似乎说如果example.com返回使用Domain = example.com设置一个cookie,它就不会得到那个cookie!这不可能是正确的.
任何人都可以澄清规则到底是什么吗?
在相关的域cookie的攻击(详细信息),允许在同一个DNS域中的计算机以添加也将在同一个域发送到其他计算机上的其他饼干.
这可能会导致身份验证问题,或者最糟糕的情况是混乱的副攻击中的一个组件.
题
如何保护ASP.NET或ASP.NET MVC免受此类攻击?
一种可能的攻击方案
这是一个简化的例子,但这个想法可以移植到其他类型的攻击中,我只是选择看起来并不"太糟糕"的场景.
如果这是两步攻击的第一步,那么它是如何"变坏"的一个想法.假设用户上传了一个只能在他的帐户中访问的错误文件; 然后另一个用户无意中下载该文件,运行那里的任何可执行代码.
还有很多其他场景是可能的......而不是在这里列出所有场景我试图找出如何保护我的服务器免受此类攻击.
我在www.example.com上有一个webapp,在api.example.com上有一个API.
webapp对API进行ajax调用.
在某个地方,我需要在api.example.com上放置一个cookie来保持会话跟踪.
为了跟踪我的问题,我在webapp和api的两个子域上设置了测试cookie.webapp在.exemple.com上设置了一个cookie,api在.exemple.com上设置了一个,在api.exemple.com上设置了另一个.Cookies仅使用Domain = .exemple.com设置.没有路径,没有HTTPOnly.
注意:最后我在api.exemple.com上只需要一个.但这些是用于测试的.
使用我的浏览器(Firefox 16)直接查询工作正常.查询api:设置并发送两个cookie.在www上查询:设置了cookie,并且也发送了来自api的两个.(当然我在api之后查询www).
现在,我清理浏览器cookie并仅查询www.在www上查询:工作正常,与以前一样.关于api的子查询,来自www的ajax请求:不发送cookie.Set-Cookies什么都不做.使用Firebug我在响应中看到了cookie.但是在后续请求或页面信息中没有它们的痕迹.
我事件试图在Firefox上启用cookie登录.绝对没有来自api的cookie的痕迹,甚至没有拒绝通知.
最后我只需要一种在api上存储一个cookie的方法.为此,我相当开放:)
信息:这两个服务器是NodeJS.我试图在客户端(document.cookies)设置服务器端的cookie(Set-Cookie标头),手动使用firebug.
其他帖子我已经检查过没有解决方案(以及其他许多我不记得的):
我正在使用类似于此的代码通过ASP.NET设置一个带有过期日期的cookie
System.Web.Security.FormsAuthenticationTicket ticket = new System.Web.Security.FormsAuthenticationTicket(1, uname, DateTime.UtcNow, DateTime.UtcNow.AddDays(30), bool_persist, "some custom string data here");
string encrypted_ticket = System.Web.Security.FormsAuthentication.Encrypt(ticket);
HttpCookie auth_cookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName, encrypted_ticket);
auth_cookie.HttpOnly = true;
if (persist) //passed in to method as parameter
{
auth_cookie.Expires = DateTime.UtcNow.AddDays(30);
}
auth_cookie.Domain = ".mydomainname.com";
Response.Cookies.Set(auth_cookie);
Run Code Online (Sandbox Code Playgroud)
我还在同一个请求中设置另一个cookie来保留其他一些数据,然后我重定向到另一个页面.
以下标题介绍了响应
HTTP/1.1 302 Found
Location: /redirect_to_this_page
Set-Cookie:.myAuthCookie=TRUNCATED_ENCRYPTED_DATA_FOR_READABILITY; domain=.mydomainname.com; expires=Sun, 27-Nov-2011 20:27:16 GMT; path=/; HttpOnly
Set-Cookie:__MyOtherCookie=; domain=full.mydomainname.com; expires=Thu, 28-Oct-2010 20:27:24 GMT; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)
根据请求/redirect_to_this_page,我没有看到由于某种原因发送标头.
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utma=113888769.1619895090.1322774580.1322774580.1322774580.1; __utmb=113888769.5.8.1322774827282; __utmc=113888769; …Run Code Online (Sandbox Code Playgroud)