如果我将会话存储在localStorage而不是cookie中,我的网站会更安全吗?

时间:2014-03-08 13:04:57

标签: http session authentication cookies

据我所知,大多数具有身份验证的网站都以这种方式工作:

  1. 用户使用POST表单发送用户名 - 密码对。
  2. 服务器使用HTTP响应标头识别用户并在其cookie中存储会话密钥。
  3. 当用户点击网页上的任何链接时,浏览器会发送一个GET请求以及我们刚设置的会话密钥。
  4. 服务器通过cookie中的会话密钥识别用户。
  5. 它会导致一些问题,例如CSRF。我知道它们都不是无法解决的,但请考虑这种方法:

    1. 用户通过Ajax发送带有POST的用户名 - 密码对。
    2. 服务器响应HTTP响应正文中的会话密钥。
    3. 客户端javascript将会话密钥存储在localStorage / DOM中。
    4. 当用户点击网页上的任何链接时,javascript会阻止浏览器的默认行为,并通过Ajax发送GET请求,并使用我们刚刚设置的会话密钥。(例如http://www.myapp.com/articles?session_key=af18db9c10a916ec12
    5. 服务器通过GET参数识别用户。
    6. 这种方法在安全性方面是否更好?它的缺点是什么?

1 个答案:

答案 0 :(得分:0)

这是一个很好的主意。两个快速的事情浮现在脑海中(虽然我确信还有更多要说的):

  1. 最后,您仍在从浏览器向服务器发送会话密钥,您只是使用GET ...标题行而不是Cookie: ...行。黑客仍然可以通过欺骗整个请求来打破这一点。但是,特别是对于黑客欺骗用户无意中在可信站点上提交表单的XSRF攻击,您的方案可能通过仅为正在运行的应用程序中的链接提供会话密钥来降低风险(而不是在每个页面加载时)用饼干)。太酷了!

  2. 出于安全原因,某些浏览器(特别是在企业界)完全禁用了javascript。它占整个网络使用人口的一小部分,但您必须考虑到您的受众。通常,更改默认浏览器行为是一种风险。

  3. <强>附录:

    阻止XSRF攻击的一种“标准”方法是在提供包含表单的任何页面时随机生成令牌。令牌存储在服务器上的会话中,并存储在正在提供的表单中的隐藏字段中。提交表单时,检查它是否包含与服务器会话中的标记匹配的标记。这与您的解决方案基本相同(它保证表单是从您的应用程序提供的页面提交的),但不需要更改默认的浏览器行为。