代码之家  ›  专栏  ›  技术社区  ›  DanDcru

如何在recaptcha认证后将POST数据传递到外部站点?

  •  1
  • DanDcru  · 技术社区  · 6 年前

    我有一个表单,其中的行动是另一个网站上的脚本,我需要过滤掉垃圾邮件。我已经设置了recaptcha v2并更改了表单操作,以指向一个本地php文件,该文件成功地从recaptcha接收响应,即“success”或“fail”。在“失败”时,我使用php头将访问者返回到他们来自的页面,但在“成功”时,我无法确定下一步。什么是最好的方式来采取我的张贴数据,并提交到外部网站的捕获.php脚本?

    2 回复  |  直到 6 年前
        1
  •  1
  •   nerdlyist    6 年前

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

    你必须像浏览器那样向该站点发出请求。大多数服务器都带有CURL来发出请求。PHP有一个名为 curl_exec() here

    如果您将严重依赖于调用站点之外的其他资源,那么让其他人为您完成繁重的工作并引入第三方供应商库会更明智。一个我已经使用过但没有经过严格审查的是GuzzleHTTP doc

        2
  •  0
  •   Exadra37    6 年前

    我怎么理解你的真正问题

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

    基于这一点,我假设我的整个回答是,你真正的问题是不允许机器人,自动脚本提交你的表格,因此我的答复没有显示你如何可以提交到另一个网站,而是向你展示了解决似乎是你的真正问题的选项。

    表单操作重定向不能解决问题

    将我的表单操作更改为指向一个本地php文件,该文件成功地从recaptcha接收响应,并将其设置为“success”或“fail”。在“失败”时,我使用php头将访问者返回到他们来自的页面,但在“成功”时,我无法确定下一步。

    这种方法很容易被任何攻击者伪造。他们只需在浏览器中点击F12,就可以看到您是如何向这个php脚本发出请求的,该脚本用于验证reCaptcha v2,然后自动执行该过程,从而轻松绕过您的保护。

    因此,你所采取的解决问题的方法,只允许一个人提交一个表格是行不通的。

    我已经设置了recaptcha v2

    我建议使用 Google reCaptcha V3

    谷歌引述:

    我们很高兴推出reCAPTCHAV3,它可以帮助您检测网站上的恶意流量,而不会出现任何用户摩擦。它根据与您的网站的交互返回一个分数,并为您提供更大的灵活性来采取适当的行动。

    重要的

    始终在后端验证reCAPTCHAV3的分数,以便知道是人类还是机器人在做这件事,并相应地阻止。您甚至可能希望将此检查添加到其他后端终结点,这些后端端点可能包含您不希望取消的敏感数据。

    googleapi对服务器端reCAPTCHAV3验证的响应示例,如 Google docs :

    {
      "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
    }
    

    进一步保护

    跨站点请求伪造,也称为CSRF

    OWASP CSRF 关于攻击和 OWASP CSRF Prevention Cheat Sheet 学会如何防御它。

    OWASP引用:

    跨站点请求伪造(Cross-Site Request Forgery,CSRF)是一种攻击,它迫使最终用户在当前经过身份验证的web应用程序上执行不需要的操作。

    跨站点脚本也称为XSS

    OWASP XSS 攻击描述,然后前往 OWASP Prevention Chaeta Sheat 看看如何防御。同样,如果您使用的是框架,它应该已经准备好了工具来帮助您防止XSS攻击。

    OWASP引用:

    继续使用reCaptcha V2

    因此,如果你想继续使用reCaptcha V2,就让它照常工作吧:

    • 阻止用户点击表单提交按钮,直到它通过所有的谷歌挑战。
    • 将表单指向处理表单提交的原始php脚本,并让它在服务器端检查reCAPTCHAV2。

    谷歌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可以绕过,只需在谷歌搜索 recaptcha v2 bypass 为了查看存在多少服务,这将允许攻击者以自动方式继续攻击脚本。