没有CSRF令牌的表格:有什么风险

时间:2011-01-19 05:28:09

标签: php security forms csrf

如果我不在表单中使用csrf令牌,我将面临的风险究竟是什么?我不是在寻找简单的标签或风险名称,因为这些可能令人困惑。我需要了解攻击者究竟能做什么,只有在什么情况下他们才能做到这一点,用简单的英语。

2 个答案:

答案 0 :(得分:9)

CSRF漏洞允许恶意用户(或网站)让不知情的用户在您的网站上执行他们不希望发生的操作。

如果您允许用户通过GET而不是POST删除帐户,某些现实世界的示例就是这样的,有人可以在您的网站上发布以下评论(假设该网站有某种方式发布评论或其他输入,等等。)

  

我以为我会对您的网站发表评论。看看这个很酷的形象!
  < img src ='http://example.com/delete_my_account.php“/>

现在,只要登录用户加载该页面,他们的帐户就会被删除。如果它是通过POST而不是GET完成的,那么有人可以制作一个表单并诱骗用户提交它并且会发生相同的结果。如果你使用了CSRF令牌,那就不可能了。

另一个例子是外部网站可以制作一个POST到您的网站的表单,并执行不良操作。因此,假设您的网站有一个不使用CSRF令牌的购物车。恶意网站可以使用“点击此处注册”按钮创建一个表单,但实际上从您的网站订购了1000个。如果您站点中的登录用户访问此恶意站点并单击该按钮,他们将在邮件中获得惊喜。

显然还有其他情况,这些仅仅是几个例子。 Google搜索应该会显示大量的文章和教程,其中许多可能会有其他一些示例。 Wikipedia page也有一些您可能感兴趣的例子。

这些示例的主要思想是,有人可以欺骗您的网站执行操作,就好像它来自用户,当用户真的不知道它发生了或者不希望它发生时。如果您的网站上有任何类型的破坏行为(即可以从用户帐户中删除内容,退出用户等)或严重(即处理金钱),您应该使用CSRF令牌。如果您的网站只是朋友的相册等,那么您可能不需要使用CSRF令牌(尽管在您构建需要它们的网站时练习总是很好)。

除非您添加令牌以确保请求来自您的网站有意提供给用户的表单,否则您无法确定用户是否打算执行此操作。

因此,您始终希望在生成POST的每个表单上使用唯一标记,并验证发布到您站点的任何请求是否具有当前用户的有效标记。还要确保在一段时间后使令牌过期,这样它们就不会永远持续下去。

答案 1 :(得分:1)

我建议你阅读这篇优秀的文章,解释CSRF是什么,以及如何最好地保护自己免受反对。