Cookies 如何保护web应用程序免受cookie窃取攻击?

Cookies 如何保护web应用程序免受cookie窃取攻击?,cookies,local-storage,session-cookies,csrf-protection,angular-cookies,Cookies,Local Storage,Session Cookies,Csrf Protection,Angular Cookies,我的web应用程序的身份验证机制目前非常简单 当用户登录时,网站发回一个会话cookie,该cookie存储在用户浏览器上(使用localStorage) 但是,此cookie很容易被盗,并用于从另一台计算机重播会话。我注意到其他网站,比如Gmail,有更强大的机制来确保仅仅复制cookie不会允许你访问该会话 这些机制是什么?小公司或单个开发人员是否也可以使用它们?我们遇到了类似的问题。如何安全地存储客户端数据 我们最终使用了包含UUID和该UUID的附加副本(存储在localStorage中

我的web应用程序的身份验证机制目前非常简单

当用户登录时,网站发回一个会话cookie,该cookie存储在用户浏览器上(使用
localStorage

但是,此cookie很容易被盗,并用于从另一台计算机重播会话。我注意到其他网站,比如Gmail,有更强大的机制来确保仅仅复制cookie不会允许你访问该会话


这些机制是什么?小公司或单个开发人员是否也可以使用它们?

我们遇到了类似的问题。如何安全地存储客户端数据

我们最终使用了包含UUID和该UUID的附加副本(存储在localStorage中)的cookie。每个请求,用户都必须将UUID和cookie发送回服务器,服务器将验证UUID是否匹配。我想这就是工作原理

本质上,攻击者需要访问cookie和本地存储。

以下是一些想法:

始终使用https和仅https cookies

将cookie保存在存储系统(nosql/cache system/db)中,并将其设置为TTL(到期)

永远不要将收到的cookie保存到存储器中,而是在保存或检查cookie之前添加盐并将其散列,就像使用密码一样

始终从应用商店清除过期会话

保存发布IP和IP2位置区域。因此,您可以检查IP是否更改

独占会话,一个用户一个会话

检测到会话冲突(另一个ip)kick用户,对于下一个登录请求,进行双向身份验证,例如,向注册的电话号码发送SMS,以便他可以在登录中输入该号码

在任何情况下都不能加载不受信任的库。更好的做法是将您使用的所有库托管在您自己的服务器/cdn上

检查是否存在注入漏洞。像配置文件之类的东西,或者通常以某种方式将用户输入的内容发回给用户的东西,都必须经过严格的消毒,因为它们是妥协的主要载体。通过任何方式发送到服务器的数据也是如此:cookie、get、post、header您可能从客户端使用或不使用的所有内容都必须经过消毒

我应该提到注射吗

使用url会话或在本地存储中存储加密会话id的双重会话都很好,但它们最终都是无用的,因为这两种会话都可以访问已包含在站点中的恶意代码,例如从某个域加载的库,该域以某种方式被劫持(dns毒药、复杂的服务器、代理、拦截器等)。这种努力是勇敢的,但最终是徒劳的

还有一些其他选项会进一步增加获取和有效使用会话的难度。例如,您可以重新发布会话id,如果会话id超过1分钟,则经常会说重新发布会话id,即使您让用户登录,他也会获得一个新的会话id,因此可能的攻击者只有1分钟的时间来执行操作这是一个被劫持的会话id

即使您应用了所有这些,也不能保证您的会话不会以这种或那种方式被高举,您只会使这样做变得难以置信的困难,以至于不切实际,但毫无疑问,使其100%安全是不可能的

<> P>有很多其他安全特性需要考虑在服务器级,比如执行隔离、数据隔离等。这是一个非常大的讨论。安全不是应用于系统的东西。它必须是系统从地面上建立的。 确保你绝对不会受到的攻击,如果你受到攻击,下面的一切都是无用的!

显然,你混合了两种东西:本地存储和cookie

它们绝对是两种不同的存储机制:

  • Cookies是一个数据字符串,随发送到服务器的每个请求一起发送。Cookies作为HTTP头发送,如果未设置
    HttpOnly
    ,则可以使用JavaScript读取
  • 另一方面,LocalStorage是一种由浏览器提供的键/值存储机制。数据存储在那里,本地存储在浏览器上,数据不会发送到任何地方。访问此数据的唯一方法是使用JavaScript

现在我假设您使用令牌(可能是JWT?)来验证用户

如果您将令牌存储在LocalStorage中,那么只需确保当您将其发送到服务器时,将其作为HTTP头发送,您就可以完成所有操作,实际上不会受到任何攻击。这种存储/身份验证技术非常适合单页应用程序(VUEJ、ReactJS等)。

但是,如果您使用cookies存储令牌,那么问题就来了:令牌可以不被其他网站窃取,但可以被其他网站使用。这称为

这种攻击基本上是通过添加以下内容来工作的:

<img src="https://yourdomain.com/account/delete">

当你的浏览器加载他们的页面时,它会尝试加载图像,同时也会发送身份验证cookie,最终会删除用户的帐户

现在有一个很棒的网站列出了绕过这种攻击的可能方法

一个非常好的方法是使用它,它基本上是通过在服务器端生成一个令牌,然后将其作为隐藏字段添加到您试图保护的表单中。然后在提交表单时,您只需在应用更改之前验证该令牌。此技术适用于使用简单表单模板引擎的网站。(不是AJAX)


HttpOnly
标志也为cookie增加了更多的安全性。

您可以通过电话号码或电子邮件使用两步身份验证。Steam也是一个很好的例子。每次从新计算机登录时,您都必须对其进行标记