使用 Google 的 reCaptcha 保护下载 link 免遭机器人攻击

Using Google's reCaptcha to protect download link from bots

我试图将下载 link 插入到带有 reCaptcha 的表单中(按照 Google 的说明),但是提交按钮打开了 link 即使你没有通过验证码挑战。

代码很简单:

<head>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body>
<form action="download link">
    <input type="submit" value="download">
    <div class="g-recaptcha" data-sitekey="xxx"></div>
</form>
</body>

JSFiddle

有谁知道为什么这不起作用?谢谢!

对此有多种解决方案,主要问题是表单操作是下载 link,因此根本不需要验证表单。

您可以编写 PHP 代码来验证然后启动下载,如果您希望通过 Google 验证 [=],则可以使用作为表单操作放置的页面20=]重新验证码验证。

或者,您可以创建 javascript,它使用数据回调 g-recaptcha 标记属性更改表单操作,以便在 recaptcha 之前表单操作不是 link。这不会通过外部服务器验证客户的响应并且可以被欺骗,但它仍然会阻止 link 成为表单操作,直到按下 recaptcha 之后。

有关可用于附加 javascript 操作的标签属性的更多信息,请参见此处:https://developers.google.com/recaptcha/docs/display

我认为您对 Google reCaptcha 的工作原理有点困惑——它不会阻止 POST(用户可以轻松绕过这种东西),它用于允许服务器端代码检查用户不是机器人。

这意味着您还必须在服务器端有一些东西来检查提交的内容。你不能只在客户端做这一切。 (尽管看起来 Google 正在客户端执行所有操作,但 reCaptcha 按钮实际上位于另一台服务器上的 iframe 中。)

例如。在此处查看 Google 的演示:https://www.google.com/recaptcha/api2/demo

请注意,当您单击“提交”时,它仍然 POST 将数据传回服务器——服务器会响应您是否是人类。

正如 Google 的文档所述:

When your users submit the form where you integrated reCAPTCHA, you'll get as part of the payload a string with the name "g-recaptcha-response". In order to check whether Google has verified that user, send a POST request with these parameters:

URL: https://www.google.com/recaptcha/api/siteverify

secret (required) xxx
response (required) The value of 'g-recaptcha-response'.
remoteip The end user's ip address.

您基本上需要检查 POST 请求 secret 是否与您的 Recaptcha 帐户中的密钥匹配。如果是,那么你应该给用户一个下载link,如果不是,return一个错误信息。

您可以在 reCaptcha 文档中了解有关此过程的更多信息:https://developers.google.com/recaptcha/docs/verify


更新: 如果你不关心有人能够伪造结果,你可以像这样使用 JavaScript 来做到这一点:JSFiddle