在 Magento 中防止垃圾邮件直接 POST 请求客户注册
Posted
技术标签:
【中文标题】在 Magento 中防止垃圾邮件直接 POST 请求客户注册【英文标题】:Preventing spam direct POST request customer registrations in Magento 【发布时间】:2018-04-19 00:59:33 【问题描述】:我已经开始在 Magento 网站上遇到一些垃圾邮件 POST 请求的问题,其中机器人正在制造垃圾邮件用户(即使删除了操作属性、验证码等),因为我相信这些机器人只是直接向标准 Magento 帐户 url 发送 POST 请求。
以下是我在日志中看到的 3 个有效 POST 请求示例:
x.x.x.x - - [06/Nov/2017:13:54:47 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/create/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/62.0.3202.75 Safari/537.36"
x.x.x.x - - [05/Nov/2017:11:34:42 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/create/" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
x.x.x.x - - [05/Nov/2017:19:33:15 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/create/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
我在一开始就匿名了 IP 地址以及 url。但是,请注意第二个 url 是 /customer/account/create/
而第一个 url 是 /customer/account/createpost/
以下是 3 个垃圾邮件 POST 请求示例:
112.96.164.18 - - [05/Nov/2017:11:43:43 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/createpost/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
112.96.164.18 - - [05/Nov/2017:12:03:17 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/createpost/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
112.96.100.2 - - [05/Nov/2017:13:53:45 -0500] "POST /customer/account/createpost/ HTTP/1.1" 302 - "https://www.example.com/customer/account/createpost/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
据我所知,每个垃圾邮件请求的第一个和第二个网址都是/customer/account/createpost/
与第一个相比,这里的第二个 url 是什么?一个请求是从哪里发送的,另一个是从哪里来的?
/customer/account/createpost/
可能永远不应该是来源,因为那是表单实际发送的地方,并且直接访问它重定向 /customer/account/create/
我的主要问题是,如何可靠地阻止第二组 POST 请求?
【问题讨论】:
@McNab,刚刚发布了一个解决方案。请让我知道您对此的反馈 this post 可能会有所帮助。 @Piyush - 我读过那篇文章,Ben 知道他的东西,这是最近的一篇文章,但实际上对这个问题并没有多大帮助。这是直接发布的,所以验证码没有用,而且 IP、用户代理和国家一直在变化。唯一有用的部分是清理脚本。 @Piyush 我遇到此问题的许多安装也已完全修补。机器人似乎背靠背发出 2 个请求,在第一个请求中,我猜它记录了在第二个请求中使用的 formkey 输入值。我可以毫无问题地使用 Postman 轻松批量创建垃圾邮件客户。 @McNab 完成! 【参考方案1】:终于找到了一种方法来防止在最新版本的 Magento 中创建所有形式的垃圾邮件客户帐户。
我们最初在包括客户创建表单在内的所有表单上都添加了 Google 验证码,所以当我们突然被大量垃圾邮件帐户击中时,我们感到很惊讶。
我们尝试的第一种方法是验证引荐来源网址标头是否显示正确的 URL,这会阻止机器人几天,直到它们开始欺骗引荐来源网址。
事实证明,这些机器人只是直接向 /customer/account/createpost/ 发送请求,而没有直接访问该网站。每个垃圾邮件客户总是有 2 个请求,一个 GET 请求(我假设它正在记录 formkey 字段是什么),然后是一个 POST 请求。由于没有运行任何 javascript,它只是绕过了我们对 recaptcha 是否已正确验证的检查并仍然发送请求。
实际上最终解决的问题并不像隐形的 recaptcha 那样干净,但已经阻止了机器人一个多星期了......
启用 Magento 默认验证码。
系统 -> 配置 -> 客户配置 -> 验证码
将其设置为“是”以启用,并仅选择“创建用户”表单,然后您必须将“显示模式”设置为“始终”。最后一部分非常重要,因为这是唯一会阻止所有不包含正确验证码响应的 /customer/account/createpost/ 的直接 POST 请求。如果您不将显示模式设置为始终,那么机器人仍然能够大量吸引客户。因为任何不是机器人的人都不应该在不使用表单的情况下直接提交请求,这不会阻止任何合法的注册。
除了“创建用户”之外,我们将其从所有表单中删除,因为这是唯一真正收到垃圾邮件的表单选项。没有理由在结账时在创建用户时添加验证码,因为他们正在花钱。
很遗憾我们不能使用 Google 的 Invisible reCaptcha,但内置的 Magento 是唯一一个集成到足以阻止所有直接 POST 请求的功能。
【讨论】:
非常有用的信息,我认为您对与表单键相关的第一个请求的评论也很有意义。我能问一下,您的任何受影响的网站都是 v 1.9.3.x 吗? @McNab 是的,它们都是 1.9.3.x,这似乎阻止了我们在大约 10 多个客户网站上收到的所有垃圾邮件。 感谢 Octoxan,很高兴知道这一点。很好的努力,看来这毕竟是答案:) 谢谢!我激活了 CAPTCH,但并没有始终使用显示模式,并且一直在使用大量俄语垃圾邮件。会试试这个并报告。【参考方案2】:所以我创建了一个带有 echo 语句的简单 php 文件。然后添加了.htaccess
,内容如下
RewriteEngine On
RewriteBase /
RewriteCond %REQUEST_METHOD POST
RewriteCond %REQUEST_URI ^/customer/account/createpost/$
RewriteCond %HTTP_REFERER !^http://dev\.tarunlalwani\.com:8088/customer/account/create/$
RewriteRule ^.* - [F,L]
现在进行一些测试
推荐人错误
$ curl -X POST -H "Referer: http://dev.tarunlalwani.com:8088/customer/account/creates/" dev.tarunlalwani.com:8088/customer/account/createpost/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /customer/account/createpost/
on this server.<br />
</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at dev.tarunlalwani.com Port 8088</address>
</body></html>
正确的推荐人
$ curl -X POST -H "Referer: http://dev.tarunlalwani.com:8088/customer/account/create/" dev.tarunlalwani.com:8088/customer/account/createpost/
Tarun here
您可以在任何时候引用不完全是 http://dev.tarunlalwani.com:8088/customer/account/create/
的 POST 请求被拒绝。我认为同样应该为你工作。只需记住更新域名并删除端口即可。如果需要,将 http
更改为 https
【讨论】:
【参考方案3】:您的第一个问题,是的,日志中的两个 URL 是被请求的 URL,如果浏览器提供了它,则是该请求的引用 URL。按照惯例,它们是按这个顺序排列的;其他信息是 HTTP 返回码、用户代理字符串等。
如果您当前的垃圾邮件请求如此可预测,那么您可能只想根据它们的用户代理和/或原始 IP 范围来阻止它们,因为这两者在您的示例中看起来是一致的。例如使用用户代理:
# in .htaccess
RewriteCond %USER_AGENT ^Mozilla/5.0.+WOW64.+Gecko/20100101$
RewriteRule ^.* - [G,L]
显然这不是万无一失的,但可能很有用。
或者,选择性地阻止来自该特定脚本的垃圾邮件发送者,除非他们来自正确的地方,依靠该引用字段(客户端提供)是另一条路线和另一解决方案。如果可能的话,我的偏好是完全抛弃小丑,除非有充分的理由让他们进入您的网站。
【讨论】:
【参考方案4】:我发现本指南https://perishablepress.com/protect-post-requests/ 非常有用。 虽然没有特别关注 Magento,但它显示了多种合理的防御方法。 不幸的是,mod_rewrite 仅限于相对简单的规则。
如果问题仍然存在,您可以考虑使用 mod_security(或其他应用程序防火墙),在 owasp-crs https://github.com/SpiderLabs/owasp-modsecurity-crs 中有一个很好的通用规则集。 当然,这必须部署在服务器端,并且需要进行一些调整才能使其正常工作,但这是一个非常好的保护步骤,值得。
【讨论】:
以上是关于在 Magento 中防止垃圾邮件直接 POST 请求客户注册的主要内容,如果未能解决你的问题,请参考以下文章