我需要验证 Google Invisible reCaptcha 的结果吗
Do I need to verify the result for Google Invisible reCaptcha
我正在按照 this page 上的说明进行操作
实施 不可见的 recaptcha。一切都很好,但我怎么知道它在工作?有没有办法强制false来测试呢?
此外,上面页面上的文档不清楚,但有些地方有额外的代码来验证用户"response"(它是不可见的,所以我不确定这里的响应是什么)- 所以这样做我需要添加额外的后端逻辑来使用不可见的 reCaptcha
结果令牌和我的密钥命中 this 端点?
当用户在不可见的 recaptcha 上点击提交时会发生什么? API to return token 中做了什么?什么是令牌? siteverify api 然后做什么来确定它是一个人?为什么在使用 reCAPTCHA V2(可见点击一次)时不需要额外验证?
经过一些测试,您似乎可以只做前端部分。在 google 确定您是一个人之前不会调用数据回调函数,如果 google 不确定然后它加载 "select which tiles have a thing in them" reCaptcha 以确保。一旦 reCaptcha api 确定它是一个人,数据回调函数就会被触发 - 那时你可以做进一步的验证以确保你在回调期间收到的令牌是 google实际上已发送,而不是机器人试图通过点击回调函数来愚弄您 - 因此您可以从那里进行服务器端处理以进行进一步验证。下面是 C# ashx 处理程序的示例 - 和 ajax 用于验证
function onTestSubmit(token) {
$.ajax({
type: "POST",
url: "testHandler.ashx",
data: { token: token },
success: function (response) {
if (response == "True") {
//do stuff to submit form
}
}
});
}
还有 ashx
public class testHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string token = context.Request.Form["token"];
bool isCaptchaValid = ReCaptcha.Validate(token);
context.Response.Write(isCaptchaValid.ToString());
}
public bool IsReusable {
get {
return false;
}
}
}
public class ReCaptcha
{
private static string URL =
"https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}";
private static string SECRET = "shhhhhhhhhhhhhhSecretTOken";
public bool Success { get; set; }
public List<string> ErrorCodes { get; set; }
public static bool Validate(string encodedResponse)
{
if (string.IsNullOrEmpty(encodedResponse)) return false;
var client = new System.Net.WebClient();
var googleReply = client.DownloadString(string.Format(URL, SECRET, encodedResponse));
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var reCaptcha = serializer.Deserialize<ReCaptcha>(googleReply);
return reCaptcha.Success;
}
}
是的,你知道。
您需要了解,不可见的 reCaptcha 是一个包含多个步骤的过程,所有这些步骤最终都会提供有关用户人性的最终响应。
简而言之,当用户提交表单(或做任何您试图使用 Invisible reCaptcha 使机器人远离的事情)时,您会将 public 站点密钥发送到您的后端,这将启动一个验证负载到 Google。
在我最基本的示例中,这是希望人类访问者单击以在我的网站上提交表单的按钮:
<button type="submit" class="g-recaptcha" data-sitekey="xxxxxxxx_obscured_xxxxxxxx" data-callback="onSubmit">Submit Form</button>
请注意按钮如何具有数据回调 "onSubmit",在提交时运行这个小脚本:
<script type="text/javascript">
var onSubmit = function(response) {
document.getElementById("simpleForm").submit(); // send response to your backend service
};
</script>
我的示例中的后端服务是一个普通的 PHP 脚本,用于处理表单输入并将其存储在数据库中,这里是棘手的部分。作为后端 POST 的一部分,除了用户填写的表单字段外,还有来自服务的响应(并且由于您可能会或可能不会在用户可以操作的前端做很多事情post 发送到后端之前的响应,Google 的响应此时不明确)
在您的后端,您需要使用您的 将来自 google 和 post 的 g-recaptcha-response 用于验证 API private key(不是表格上的那个)以获得您可以采取行动的 human/robot 判决。这是一个用 PHP 编写并使用 cURL 命中 API 的简单示例:
$recaptcha_response = $_POST["g-recaptcha-response"];
$api_url = 'https://www.google.com/recaptcha/api/siteverify';
$api_secret = 'zzzzzzz_OBSCURED_SECRET_KEY_zzzzzzzzzzz';
$remoteip = '';
$data = array('secret' => $api_secret, 'response' => $recaptcha_response);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($api_url, false, $context);
$captcha_response = json_decode($result, true);
// at this point I have the definite verdict from google. Should I keep processing the form?.
if ($captcha_response['success'] == true) {
// I heart you, human. Keep going
$captcha_error = 0;
}
else {
// Damn robot, die a slow and painful death
$captcha_error = 1;
}
我根据$captcha_error做最后的决定(基本上1表示停止,0表示继续处理)
如果您完全依赖于获得 g-recaptcha-response,那么您会 Google 完成工作然后忽略结果
我正在按照 this page 上的说明进行操作 实施 不可见的 recaptcha。一切都很好,但我怎么知道它在工作?有没有办法强制false来测试呢?
此外,上面页面上的文档不清楚,但有些地方有额外的代码来验证用户"response"(它是不可见的,所以我不确定这里的响应是什么)- 所以这样做我需要添加额外的后端逻辑来使用不可见的 reCaptcha
结果令牌和我的密钥命中 this 端点?
当用户在不可见的 recaptcha 上点击提交时会发生什么? API to return token 中做了什么?什么是令牌? siteverify api 然后做什么来确定它是一个人?为什么在使用 reCAPTCHA V2(可见点击一次)时不需要额外验证?
经过一些测试,您似乎可以只做前端部分。在 google 确定您是一个人之前不会调用数据回调函数,如果 google 不确定然后它加载 "select which tiles have a thing in them" reCaptcha 以确保。一旦 reCaptcha api 确定它是一个人,数据回调函数就会被触发 - 那时你可以做进一步的验证以确保你在回调期间收到的令牌是 google实际上已发送,而不是机器人试图通过点击回调函数来愚弄您 - 因此您可以从那里进行服务器端处理以进行进一步验证。下面是 C# ashx 处理程序的示例 - 和 ajax 用于验证
function onTestSubmit(token) {
$.ajax({
type: "POST",
url: "testHandler.ashx",
data: { token: token },
success: function (response) {
if (response == "True") {
//do stuff to submit form
}
}
});
}
还有 ashx
public class testHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string token = context.Request.Form["token"];
bool isCaptchaValid = ReCaptcha.Validate(token);
context.Response.Write(isCaptchaValid.ToString());
}
public bool IsReusable {
get {
return false;
}
}
}
public class ReCaptcha
{
private static string URL =
"https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}";
private static string SECRET = "shhhhhhhhhhhhhhSecretTOken";
public bool Success { get; set; }
public List<string> ErrorCodes { get; set; }
public static bool Validate(string encodedResponse)
{
if (string.IsNullOrEmpty(encodedResponse)) return false;
var client = new System.Net.WebClient();
var googleReply = client.DownloadString(string.Format(URL, SECRET, encodedResponse));
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var reCaptcha = serializer.Deserialize<ReCaptcha>(googleReply);
return reCaptcha.Success;
}
}
是的,你知道。 您需要了解,不可见的 reCaptcha 是一个包含多个步骤的过程,所有这些步骤最终都会提供有关用户人性的最终响应。
简而言之,当用户提交表单(或做任何您试图使用 Invisible reCaptcha 使机器人远离的事情)时,您会将 public 站点密钥发送到您的后端,这将启动一个验证负载到 Google。
在我最基本的示例中,这是希望人类访问者单击以在我的网站上提交表单的按钮:
<button type="submit" class="g-recaptcha" data-sitekey="xxxxxxxx_obscured_xxxxxxxx" data-callback="onSubmit">Submit Form</button>
请注意按钮如何具有数据回调 "onSubmit",在提交时运行这个小脚本:
<script type="text/javascript">
var onSubmit = function(response) {
document.getElementById("simpleForm").submit(); // send response to your backend service
};
</script>
我的示例中的后端服务是一个普通的 PHP 脚本,用于处理表单输入并将其存储在数据库中,这里是棘手的部分。作为后端 POST 的一部分,除了用户填写的表单字段外,还有来自服务的响应(并且由于您可能会或可能不会在用户可以操作的前端做很多事情post 发送到后端之前的响应,Google 的响应此时不明确)
在您的后端,您需要使用您的 将来自 google 和 post 的 g-recaptcha-response 用于验证 API private key(不是表格上的那个)以获得您可以采取行动的 human/robot 判决。这是一个用 PHP 编写并使用 cURL 命中 API 的简单示例:
$recaptcha_response = $_POST["g-recaptcha-response"];
$api_url = 'https://www.google.com/recaptcha/api/siteverify';
$api_secret = 'zzzzzzz_OBSCURED_SECRET_KEY_zzzzzzzzzzz';
$remoteip = '';
$data = array('secret' => $api_secret, 'response' => $recaptcha_response);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($api_url, false, $context);
$captcha_response = json_decode($result, true);
// at this point I have the definite verdict from google. Should I keep processing the form?.
if ($captcha_response['success'] == true) {
// I heart you, human. Keep going
$captcha_error = 0;
}
else {
// Damn robot, die a slow and painful death
$captcha_error = 1;
}
我根据$captcha_error做最后的决定(基本上1表示停止,0表示继续处理)
如果您完全依赖于获得 g-recaptcha-response,那么您会 Google 完成工作然后忽略结果