我如何理解你真正的问题
我有一个表单,其中操作是另一个网站上的脚本,我需要过滤掉垃圾邮件。
基于此,我假设我的全部回复是您的真正问题是不允许机器人、自动脚本提交您的表单,因此我的回复没有显示您如何将 POST 数据提交到另一个网站,而是向您显示解决似乎是您真正问题的选项。
表单动作重定向不能解决问题
将我的表单操作更改为指向本地 php 文件,该文件成功接收来自 recaptcha 的响应为“成功”或“失败”。在“失败”时,我使用 php 标头将访问者返回到他们来自的页面,但在“成功”时,我无法弄清楚下一步。
这种方法很容易被任何攻击者伪造。他们只需在浏览器中按 F12 即可查看您如何向用于验证 reCaptcha v2 的该 php 脚本发出请求,然后自动执行该过程,从而轻松绕过您的保护。
因此,您为解决仅允许人类提交表单的问题而采取的方法将行不通。
推荐使用reCaptcha V3
我已经设置了recaptcha v2
我建议使用Google reCaptcha V3,它将在后台运行而无需任何用户交互,并将返回一个从 0 到 1 的分数,其中接近 1 表示这是一个人在使用该页面,否则是一个自动化工具.
谷歌报价:
我们很高兴推出 reCAPTCHA v3,它可以帮助您检测网站上的滥用流量,而不会产生任何用户摩擦。它会根据与您的网站的互动返回一个分数,并让您更灵活地采取适当的行动。
重要
在您网站的所有页面中包含 reCaptcha V3,以便 Google 可以了解用户及其行为,从而让您更自信地判断用户是人类还是机器人。请记住,一旦它不提示用户进行交互,它就不会影响您网站任何页面的用户体验。
始终在后端验证 reCaptcha V3 分数,以便了解是人类还是机器人执行此操作并相应地阻止。您甚至可能希望将此检查添加到其他可能包含您不想被抓取的敏感数据的后端端点。
根据Google docs,来自 Google API 的服务器端 reCaptcha V3 验证响应示例:
{
"success": true|false, // whether this request was a valid reCAPTCHA token for your site
"score": number // the score for this request (0.0 - 1.0)
"action": string // the action name for this request (important to verify)
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
进一步保护
Cross-Site Request Forgery 也称为 CSRF
如果您使用的是框架,它应该已经为此提供了内置保护,只需阅读他们在表单上的文档即可。否则请阅读关于攻击的OWASP CSRF 描述和OWASP CSRF Prevention Cheat Sheet 以了解如何防御它。
OWASP 报价:
Cross-Site Request Forgery (CSRF) 是一种攻击,它会强制最终用户在当前已通过身份验证的 Web 应用程序上执行不需要的操作。
跨站脚本也称为 XSS
有关攻击的描述,请阅读OWASP XSS 攻击描述,然后前往OWASP Prevention Chaeta Sheat 了解如何防御它。如果你使用一个框架,它应该已经有工具来帮助你防止 XSS 攻击。
OWASP 报价:
Cross-Site Scripting (XSS) 攻击是一种注入类型,其中恶意脚本被注入到其他良性且受信任的网站中。当攻击者使用 Web 应用程序将恶意代码(通常以浏览器端脚本的形式)发送给不同的最终用户时,就会发生 XSS 攻击。
继续使用 reCaptcha V2
所以如果你想继续使用reCaptcha V2,就让它照常工作吧:
- 阻止用户点击表单提交按钮,直到它通过所有 Google 挑战。
- 将表单指向处理表单提交的原始 php 脚本并让它检查服务器端的 reCaptcha V2。
来自 Google API 的示例验证响应,根据 Google docs:
{
"success": true|false,
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
请记住,reCaptcha V2 可以被绕过,只需在 Google 上搜索 recaptcha v2 bypass 即可查看有多少服务可用于此操作,这将允许攻击者继续以自动方式攻击脚本。