将会话 cookie 设置为 HttpOnly

Posted

技术标签:

【中文标题】将会话 cookie 设置为 HttpOnly【英文标题】:Setting session cookie to HttpOnly 【发布时间】:2017-02-04 02:56:12 【问题描述】:

我正在使用 Entity Framework 6.0 开发一个 ASP.NET MVC 服务器。据我所知,它设置为与 EF 4.5 (<httpRuntime targetFramework="4.5" />) 兼容。

我想确保会话 cookie(即存储会话标识符的 cookie)是 HttpOnly,因为这是行业范围的最佳实践,有助于防止跨站点请求伪造攻击。

问题是,它是由框架自动创建的,所以我不能像所有其他 cookie 一样在调用构造函数后立即更改对象的属性。

Web.config 中,我设置了<httpCookies httpOnlyCookies="true" />,然而——当我检索会话cookie 时——它不是 HttpOnly(它的HttpCookie.HttpOnly 属性设置为false)。我不知道如何改变它。

我在 Microsoft 的文档中找不到任何关于 Web.config<sessionState> 可以改变这种情况的内容。在 Stack Overflow 上,我只找到了 a four year old question talking about how session cookie is HttpOnly by default,这对我来说是完全相反的,而 a five days old question asking why session cookie is not HttpOnly by default - 由于某种莫名其妙的原因被关闭 - 没有评论 - 作为前者的副本。

我知道I can retrieve the session cookie, check it and set HttpOnly=true on every request(或者使用稍微精致/骇人听闻的过滤器,或者在登录时手动设置它,或者......),但我不是一个血淋淋的野蛮人 必须有适当的方法来做到这一点。

那么,如何?

【问题讨论】:

我以 Duplicate 的身份关闭了 the second question。接受的answer 明确指出会话Cookie 是httponly,您不能修改它。 @Win 但问题是,在我的项目中,会话 cookie 不是 httponly,所以任何一个框架在 cookie 的默认属性上做了 4 年的 180 度翻转,或者某种方法可以改变它,而我 - 或我团队中的其他开发者 - 以某种方式改变了它。我想说的是,我的问题的现实和答案不匹配。 【参考方案1】:

会话 Cookie 将始终为 httponly。您不能修改或覆盖它。

当我检索会话 cookie 时 - 它不是 HttpOnly(它的 HttpCookie.HttpOnly 属性设置为 false)。

var cookie = Request.Cookies["ASP.Net_SessionId"];
if (cookie != null)

    var httpOnly = cookie.HttpOnly; // <-- This is always false

HttpOnly 值在服务器端始终为 false,因为客户端浏览器不会将 cookie 是否在 httponly 中发送回服务器。

如何验证

您可以使用 cookie 编辑器,例如 Chrome Plugin EditThisCookie。

【讨论】:

所以这毕竟是一个 XY 问题。这就是我正在寻找的解释。谢谢。 但我可以在 Chrome 中编辑 HttpOnly cookie -> 应用程序 -> Cookies 自从这篇文章发布以来已经有一段时间了,我想我只是要注意,如果我给会话 cookie 一个明确的名称,那么即使我像这样明确地设置它,它也不会在 Chrome 中显示 HttpOnly : ` var sessionCookie = new CookieBuilder(); sessionCookie.Name = ".MyWebSite"; sessionCookie.HttpOnly=true; sessionCookie.SecurePolicy = CookieSecurePolicy.Always; sessionCookie.SameSite = SameSiteMode.Strict; app.UseSession(new SessionOptions() Cookie = sessionCookie );` 我一定遗漏了一些关于如何让它工作的东西,但它绝对不是默认为 httponly

以上是关于将会话 cookie 设置为 HttpOnly的主要内容,如果未能解决你的问题,请参考以下文章

将cookie设置为在会话结束时过期?网

SESSION_COOKIE_SECURE 不加密会话

在java中删除会话超时的cookie

jQuery Cookie 插件行为:如果 cookie 是会话 cookie,则将域设置为“.com”

将 cookie 设置为永不过期

使会话 cookie 在 2 年内过期