Javascript - document.cookie的安全性

3
我有一个应用程序,使用AWS CloudFront API和Lambda创建Cloud Front cookies。不幸的是,我无法使用标准的HTTP响应格式设置cookie,并且必须使用document.cookie从HTML页面向用户浏览器设置cookie。 cookie包括授权访问内容的策略,确认cookie真实性的签名以及密钥对ID。 Lambda上的后端脚本创建cookie并将其作为有效载荷发送给请求者,然后作为变量传递给document.cookie。
我已经阅读了很多关于保护cookie(HttpOnly、会话cookie、安全标志等)的文章,正在尝试理解document.cookie的安全风险。在安全上下文中,通过Http响应和document.cookie设置cookie之间有区别吗?恶意用户是否可以在客户端创建cookie时将自己的策略插入到cookie中,从而访问其他内容,尽管页面只读?
以下是一些参考代码:
payload = data["Payload"]
jsoned = JSON.parse(payload)
cookie = jsoned['cookie']
redirectUrl = jsoned['redirectUrl']

document.cookie = 'CloudFront-Policy' + "=" + cookie['CloudFront-Policy'] + "; path=/mydirectory";
document.cookie = 'CloudFront-Key-Pair-Id' + "=" + cookie['CloudFront-Key-Pair-Id'] + "; path=/mydirectory"
document.cookie = 'CloudFront-Signature' + "=" + cookie['CloudFront-Signature'] + "; path=/mydirectory"

这是我第一次发帖。提前感谢您的帮助。

-肯恩

2个回答

4
在安全方面,通过Http响应和document.cookie设置cookie有区别吗?实际上并没有。HTTP cookie可以使用httponly设置,但这只是对XSS的一种非常弱的缓解措施,本质上并不是真正的安全措施。恶意用户是否可能在客户端创建cookie时插入自己的策略? 是的,但这已经是HTTP cookie存在的问题了;它们都存储在客户端,因此容易受到不受信任的客户端的攻击。这就是签名的作用,对吗?如果正确实现,应该可以防止篡改其签名内容。

1
是的,签名用于对cookie进行签名并防止篡改。服务器会识别它是否被篡改并防止访问,这是有道理的。 - user3044005
谢谢您的帮助。 - user3044005

3

绝不能将任何“直接”有价值的内容存储在cookie中。

所有cookie值的验证/处理都应该在服务器端进行(涉及任何敏感信息),cookie应该仅包含某种guid(或者可能是一些guid)。并且所有存储在cookie中的“客户端”id都应以一种编码方式编码,以防止篡改和检测篡改。

关于评论,我坚持这个说法...

  • “赋予客户端的任何信息都应被视为已泄露。”

...并扩展我的答案...您不知道将使用哪个“客户端应用程序”,因为它不必是“浏览器”(Postman /自定义应用程序可以直接与您的网站交互,并意图直接检查您发送的所有内容),以及代理(或更糟糕的恶意中间人应用程序)、网络嗅探器等等...因此,从您不应考虑未来客户端响应的任何方面保证的角度来看,“客户端应用程序/‘加载页面’”以及任何其他数据(包括cookie)都应被视为已泄露。

即:以下是一个漏洞示例...

  • 您有一个网站,使用cookie中的值来限制(使用客户端javascript)下拉列表(或其他功能)中的选项
  • 这将是一个不好的做法,因为用户可以通过多种不同的方式攻击它...
    • “修改”cookie值
    • 以许多方式“编辑”客户端javascript
    • “手动”提交任何“响应”到您的Web应用程序端点
      • 基本上欺骗任何输入的任何值

因此,总之,任何赋予客户端的内容都应被视为“不安全”,您需要将来自客户端的任何“返回值”视为“已泄露/恶意”而处理。


我相信CloudFront签名提供了这种防篡改机制。 - user3044005
谢谢!我会再看看存储在 cookie 中的内容。 - user3044005

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接