首页 > 解决方案 > 用 JavaScript 覆盖 HttpOnly cookie?

问题描述

根据MDN 文档

为了防止跨站点脚本 (XSS) 攻击,JavaScript 的 Document.cookie API 无法访问 HttpOnly cookie;它们只发送到服务器。

我找到了一个用 JavaScript 替换 HttpOnly cookie 的场景,这是 ASP.NET 中的 PoC:

<%@Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) 
{
    if (Request["m"] == "check") 
    {
        Response.Write("Cookie=" + Request.Cookies["C"].Value);
        Response.End();
    }
    else 
    {
        Response.AppendCookie(new HttpCookie("C") 
        {
            Value = "ByServer",
            HttpOnly = true
        });
    }
}
</script>
<html>
<body>
    <div>
        document.cookie -&gt; <span id=t></span>
    </div>
    <script>
        document.getElementById("t").innerHTML = document.cookie;
        document.cookie="C=ByClient";
    </script>
    <a href="?m=check">Check Cookie</a>
</body>
</html>

在 Chrome 的测试中,读取 document.cookie 什么都没有,证明 HttpOnly cookie 确实是 JavaScript 无法读取的。但是通过设置document.cookie = "C=ByClient",两个不同路径的cookie同时存在。

在此处输入图像描述

然后从服务器端检查 cookie,Request.Cookies["C"] 返回 JavaScript 给出的“ByClient”,而不是服务器分配的“ByServer”。HttpOnly cookie 被客户端覆盖。

如果我们设置确切的 HttpCookie.Path,结果会有所不同:

    Response.AppendCookie(new HttpCookie("C") 
    {
        Value = "ByServer",
        HttpOnly = true,
        Path = "/asp/httponlycookie"
    });

现在 document.cookie="ByClient" 添加或更改 cookie 失败,HttpOnly cookie 受到保护。

在此处输入图像描述

我能否得出一个结论:HttpOnly 属性只保证 cookie 对 JavaScript 不可读,HttpOnly cookie 仍然有可能被 JavaScript 替换或覆盖?

标签: javascriptcookieshttponly

解决方案


推荐阅读