使用 CSRF 表单令牌是不是有助于防止垃圾邮件?
Posted
技术标签:
【中文标题】使用 CSRF 表单令牌是不是有助于防止垃圾邮件?【英文标题】:Does using CSRF form tokens help spam prevention?使用 CSRF 表单令牌是否有助于防止垃圾邮件? 【发布时间】:2016-07-11 23:19:15 【问题描述】:我试图阻止机器人(可能)向我的 php 注册文件提交虚假数据。我正在创建一个使用注册/登录系统的站点,并且我想添加我能够执行的电子邮件验证。但是问题是我的虚拟主机只允许x
每分钟的电子邮件数量,如果机器人发送垃圾邮件,这不仅会填充我的数据库中的垃圾邮件帐户,而且还会因违反电子邮件限制而被暂停。
我一直在阅读有关保护表单的信息,然后出现了 CSRF,这是一个我不熟悉的术语。
这是我目前对CSRF预防的“token法”的理解;
在加载包含表单的页面时创建一个令牌。将令牌存储在 SESSION
或 cookie 中。
当处理注册的 PHP 文件运行时,它将检查令牌。如果表单中提交的请求不匹配(或者如果令牌未在SESSION
中设置),则请求是垃圾邮件。
我不明白为什么机器人不能简单地从 html 表单中获取令牌并提交它。我明白每次都在变,能不能每次都抓着呢?
我假设机器人只会使用 CurL 或类似的东西提交数据,以绕过实际提交 HTML 表单的需要,而是将数据直接发送到 PHP 文件。
我的问题本质上是,这种方法为什么以及如何防止机器人提交我的注册表单(或与此相关的任何表格)。
【问题讨论】:
垃圾邮件很常见,有很多不同的方法可以防止和保护我们的网站免受机器人攻击。在您的登录表单中使用限制等。您可以使用 Google 的 reCaptcha,这非常有用。在这里检查它。 google.com/recaptcha/intro/index.html 【参考方案1】:我的问题本质上是,这种方法为什么以及如何防止机器人提交我的注册表单(或与此相关的任何表格)。
没有。
CSRF 代表“Cross-Site Request Forgery”,此类令牌有助于防止发生这种情况 - 用户被欺骗从 另一个 站点向您的站点提交表单,这与垃圾邮件无关。
为了防止垃圾邮件,您应该使用某种形式的验证码挑战。
【讨论】:
我的印象是验证码无效。即便如此,这如何阻止机器人绕过 HTML 表单和内部的验证码直接将其提交给 PHP? CAPTCHA 很难(希望不可能)被机器读取 - 它不是一个简单的表单域,而是通常播放的图像或声音,以便人类可以理解它。算法不会。 好吧,这仍然不能解释为什么机器人必须提交包含验证码的表单而不是完全跳过它并将请求直接提交到 PHP 文件(其中不包含形式)。 很明显,因为如果提交的数据没有携带正确的 CAPTCHA 验证值,您将不会接受。【参考方案2】:CSRF 代表Cross Site Request Forgery 这是不是一种防止机器人提交表单的方法,这是一种防止其他浏览器选项卡向另一个选项卡上的现有会话提交数据的方法。
以 Facebook 为例,如果另一个选项卡可以通过向端点发送一个字符串来在您的墙上提交状态更新,那么大多数人总是会登录,您已经登录,因此它会获得授权并发布。
CSRF 会阻止标签页执行此操作,因为他们无法从现有标签页中收集您的令牌。每个会话只需要生成一次令牌,并且每个会话都是唯一的(尽管经常更改它会使其更安全)。
您需要使用CAPTCHA。
【讨论】:
【参考方案3】:使用 CSRF 表单令牌是否有助于防止垃圾邮件?
有点,是的。不是设计使然,而是因为它使编写机器人所涉及的工作量略高,而机器人编写者很懒。
我不明白为什么机器人不能简单地从 HTML 表单中获取令牌并提交它
当然,专门针对您的注册表单编写的机器人可以做到这一点。一个被实现为无头网络浏览器的机器人会自动完成它,因为这是真正的浏览器会做的事情。
拥有 CSRF 令牌会阻止您的机器人是更愚蠢的机器人,它们只是将垃圾倒入其抓取工具找到、提交并逃跑的每个表单操作 URL,甚至不看响应是什么。垃圾评论发送者通常就是这么愚蠢。
【讨论】:
以上是关于使用 CSRF 表单令牌是不是有助于防止垃圾邮件?的主要内容,如果未能解决你的问题,请参考以下文章