【问题标题】:How to pass POST data to external site after recaptcha authentication?重新验证身份验证后如何将 POST 数据传递到外部站点?
【发布时间】:2019-01-14 12:44:21
【问题描述】:

我有一个表单,其中操作是另一个网站上的脚本,我需要过滤掉垃圾邮件。我已经设置了 recaptcha v2 并将我的表单操作更改为指向一个本地 php 文件,该文件成功接收来自 recaptcha 的响应为“成功”或“失败”。在“失败”时,我使用 php 标头将访问者送回他们来自的页面,但在“成功”时,我无法弄清楚下一步。获取我的 POST 数据并将其提交到外部网站的 capture.php 脚本的最佳方式是什么?

【问题讨论】:

  • 我仍然茫然地盯着一个空的 'if ($response->success)' 语句。我可以用 POST 数据重新填充一个新表单,并通过 javascript 自动将其提交给外部表单处理程序,但这感觉非常笨拙,我猜肯定有更好的方法,也许是 curl?
  • 您可以使用cURL 发布数据。之后你做什么取决于你发布数据后远程站点做什么。当用户停留在您的网站上时,它是否只是获取数据并给您响应?或者用户是否被重定向到外部站点?如果是后者,您必须自己解析 curl 的响应标头并重定向用户。
  • 数据发布到外部站点后,它会将访问者重定向回 _POST[$origin] 中包含的 url,并附加 ?success=true。如果 cURL 最适合这种“中间文件”场景,我会看看。谢谢!

标签: php forms recaptcha


【解决方案1】:

您并没有给我们太多的帮助,但由于现在是 2019 年,我假设您想通过 API 与其他网站交谈。至少你想调用一个特定的脚本,你知道它是否存在并且可以接收你的电话(并且希望有点安全)。

您必须“就像”浏览器一样向该站点发出请求。大多数服务器都带有 CURL 来发出请求。 PHP 有一个名为curl_exec() 的函数,请查看here

如果您将严重依赖调用您网站之外的其他资源,那么让其他人为您完成繁重的工作并使用第三方供应商库会更明智。 GuzzleHTTP doc 是我使用过但未经严格审查的一种。它们基本上为您包装 curl 并为您提供标准的请求响应结构。

【讨论】:

    【解决方案2】:

    我如何理解你真正的问题

    我有一个表单,其中操作是另一个网站上的脚本,我需要过滤掉垃圾邮件。

    基于此,我假设我的全部回复是您的真正问题是不允许机器人、自动脚本提交您的表单,因此我的回复没有显示您如何将 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 即可查看有多少服务可用于此操作,这将允许攻击者继续以自动方式攻击脚本。

    【讨论】:

    • 这一切都很好,但绝不解决 OP 的实际问题
    • 它在某种意义上解决了他不应该采用他正在采取的方法,即不安全并且最终无法解决他试图解决的问题,即确保只有人类提交表单。
    • 用户描述的问题是如何将数据从他们的站点获取到另一个站点进行处理。虽然是的,但您可能会担心您没有回答主要问题的其他问题。
    • 当前的帖子数据问题只是他在解决问题根源的错误道路上的一块石头。我的意思是,关于发布数据的 OP 问题并没有反映他的真正问题,在我看来,我们在他的问题中有足够的信息可以看出真正的问题不是将数据发布到另一个站点,而是保护表单提交被垃圾邮件发送者使用,也就是自动脚本。因此,教他如何将数据发布到另一个站点有助于他保持错误的解决方向是真正的问题。
    • 我可以将 v2 更改为 v3,但我仍然处于相同的情况。我不知道如何在将发布数据发送到在另一个网站上运行的脚本的 Web 表单上使用 recaptcha。如果我将表单操作更改为执行 recaptcha 验证的本地文件,我不知道如何将该信息从本地文件传递到远程脚本。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多