使用CSRF表单令牌有助于防止垃圾邮件吗?

9
我正在尝试防止机器人向我的PHP注册文件提交虚假数据。我正在创建一个使用注册/登录系统的网站,我想添加电子邮件验证,这是我能力范围内的。然而问题在于我的Web主机每分钟只允许发送x封电子邮件,如果机器人垃圾邮件攻击,我的数据库不仅会充满垃圾账户,我还会因为超过电子邮件限制而被暂停。
我一直在阅读有关保护表单的信息,其中提到了CSRF,这是一个我不熟悉的术语。
这是我对CSRF预防中“令牌方法”的理解:
- 当包含表单的页面加载时,创建一个令牌。将令牌存储在SESSION或cookie中。 - 运行处理注册的PHP文件时,它将检查令牌。如果表单中提交的令牌不匹配(或者SESSION中没有设置令牌),则该请求就是垃圾请求。
我不明白为什么机器人不能简单地从HTML表单中获取令牌并进行提交。我知道令牌每次都会更改,但它不能每次都获取吗?
我假设机器人会使用CurL或类似工具来提交数据,以绕过实际提交HTML表单的要求,并直接将数据发送到PHP文件。
我的问题本质上是,为什么和如何使用这种方法可以防止机器人提交我的注册表单(或任何其他表单)。

垃圾邮件很普遍,有许多不同的方法可以防止和保护我们的网站免受机器人攻击。在登录表单中使用限流等措施。您可以使用谷歌的reCaptcha,非常实用。在这里检查它 https://www.google.com/recaptcha/intro/index.html - Christian Gerdes
3个回答

17
使用CSRF表单令牌对于防止垃圾邮件有所帮助,但并非出于设计,而是因为这使得编写机器人所需的工作量稍微增加了一些,而机器人编写者往往比较懒。
当然,一个专门针对您的注册表单编写的机器人可以获取表单中的令牌并提交它。而实现为无头Web浏览器的机器人会自动执行此操作,因为这就是真实浏览器的操作方式。使用CSRF令牌可以阻止的机器人是那些更愚蠢的机器人,它们只是向其爬虫发现的每个表单动作URL中添加垃圾信息,提交并立即离开,甚至不查看响应内容。评论垃圾邮件发送者通常就是这样的。

5
我的问题本质上是,这种方法如何以及为什么能防止机器人提交我的注册表单(或任何表单)。

它并不能。

CSRF代表“跨站点请求伪造”,这些令牌可以帮助防止用户被骗提交来自另一个网站的表单到您的网站,这与垃圾邮件无关。

对于防垃圾邮件,您应该使用某种CAPTCHA挑战。


我曾经认为验证码并不是很有效。即便如此,这又如何阻止机器人直接绕过HTML表单和验证码代码,直接将其提交到PHP呢? - Harry
CAPTCHAs的工作原理是通过设计成机器难以识别(希望是不可能的)来防止机器自动化操作 - 它不仅仅是一个简单的表单字段,而通常是一张图片或者播放的声音,以便人类可以理解,而算法则无法识别。 - Narf
好的,这仍然没有解释为什么机器人必须提交包含验证码的表单,而不是完全跳过它并直接提交请求到不包含表单的PHP文件。 - Harry
2
显然,因为如果提交的数据没有正确的CAPTCHA验证值,您将不会接受它。 - Narf

1
CSRF代表跨站请求伪造,这不是一种防止机器人提交表单的方法,而是一种防止其他浏览器标签向另一个标签页上的现有会话提交数据的手段。
以Facebook为例,如果另一个标签可以通过向端点发送字符串来提交状态更新到您的墙上,则已经登录,因此它会被授权并发布。
而CSRF可以防止标签页这样做,因为它们无法从现有标签页中收集您的令牌。令牌每个会话只需要生成一次,并且对于每个会话都必须是唯一的(尽管频繁更改可以使其更安全)。
您需要使用验证码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接