在 cookie 中使用单个令牌进行身份验证是否安全?
某种程度上,如果该 cookie 仅限 HTTP(这有助于防止 XSS)和 SSL,那么您网站之外的任何人都无法读取该 cookie。
但是,用户的浏览器可以保留该 cookie,并在其浏览器再次从您的应用程序请求页面时自动发送该 cookie。当用户浏览您的网站时,这是需要的,而且也是可能发生 CSRF 攻击的原因。
为什么攻击者无法获取隐藏字段中的表单令牌?
在 CSRF 攻击中,黑客实际上无法读取您的网站或 cookie,因为它应该受到 SSL/HTTPS 的保护。 CSRF 的工作原理是欺骗您的浏览器将其数据与您的安全数据一起发送到您的站点。
因此,隐藏字段中的值是针对 CSRF 的默认防御的一部分 - 它们在 cookie 中有一个秘密值(黑客可以欺骗浏览器重新发送,但无法查看或编辑),并且在加密页面中的隐藏输入字段(黑客无法访问)。如果 cookie 和隐藏值不匹配,那么您就遭受了 CSRF 攻击。
攻击者如何通过POST请求进行CSRF攻击?
好的,假设您有一个安全的网站。您可以使用 SSL 登录此站点,然后您将获得一个仅 HTTP SSL 身份验证 cookie,使您保持登录状态。
现在我在一个完全不同的网站上有了一个新页面。如果我从我的网站链接到您的网站,那么当您单击该链接时,它将离开我的网站并转到您的网站,并传递您的 cookie。
如果我添加一个 HTML<form>
在我的发布回您网站的页面上,也会发生同样的事情:浏览器返回您的网站并发送表单中的所有数据以及您的 cookie。
请注意,我没有读取您的 cookie 或您网站上的任何页面,因为两者都受到 SSL 加密的保护。
为了获得完整的效果,我可以在页面上隐藏该表单,以便用户甚至不会意识到他们正在发回您的网站。
一个简单的例子是 Facebook 上的“点赞”功能 - 我想他们现在已经修补了这个功能,但有一段时间我可以欺骗您的浏览器(无需访问您的详细信息)将您的身份验证 cookie 发送到表示您的 Facebook 操作就像我想让你做的事情一样。