javascript - 用 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 -> <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 替换或覆盖?
解决方案
推荐阅读
- c - 如何在其他 C 文件中定义的用 C 编写的 Ruby 扩展中使用类?
- ruby-on-rails - 与 Ruby 2.5.8 和 Rails 5.2.4 不兼容的库版本
- php - 如何在 MySQL 中使用 Flutter 和 php 上传图片
- javascript - 使用 querySelectorAll 选择后提取单个数据
- r - 谁能解释一下这个 R 语言 ts 函数
- c# - 实体框架从非抽象类继承表结构,但创建所有字段
- javascript - 在 Chrome 和 Safari 上运行的 jQuery,不在 Firefox、Edge 和 Brave 上运行
- html - 搜索、输入、按钮边距和填充
- cs50 - 程序继续打印多行然后用户输入的内容
- c++ - Windows下所有类别的过滤器和硬件设备列表