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

sam*_*quo 9 php forms security csrf

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

Ric*_*ams 9

CSRF漏洞允许恶意用户(或网站)让毫无戒心的用户在您的网站上执行他们不希望发生的操作.

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

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

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

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

显然还有其他情况,这些仅仅是几个例子.Google搜索应该会显示大量的文章和教程,其中许多可能会有其他一些示例.在维基百科页面也有一些例子,你可能会感兴趣.

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

除非您添加令牌以确保请求来自您的网站有意提供给用户的表单,否则您实际上无法知道用户是否打算执行该操作.

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