我按照this page上的说明操作 实施隐形recaptcha 。一切都很好,但我怎么知道它有效?有没有办法强迫假测试它?
此外,上面的页面上的文档不清楚,但有些地方有额外的代码来验证用户“响应”(它是不可见的,所以我不知道这里的响应是什么) - 所以我需要添加使用不可见的reCaptcha
结果令牌和我的密钥来命中this端点的附加后端逻辑?
当用户点击隐形recaptcha上的提交时会发生什么?在API中做什么来返回令牌?什么是令牌? siteverify api然后做了什么来确定它的人?当使用reCAPTCHA V2(可见点击一个)时,为什么不需要额外的验证?
答案 0 :(得分:1)
经过一些测试,看起来你可以做前端部分。数据回调函数不会被调用,直到谷歌确定你是一个人,如果谷歌不确定然后它加载“选择哪些瓷砖有一个东西”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;
}
}
答案 1 :(得分:1)
是的,你知道。 您需要了解,看不见的reCaptcha是一个包含多个步骤的过程,所有这些步骤最终都会提供有关用户人性的最终响应。
简而言之,当用户提交表单时(或者您试图通过Invisible reCaptcha使机器人远离),您将向您的后端发送公共站点密钥,这将触发验证有效载荷去谷歌。
在我最基本的示例中,这是希望人类访问者单击以在我的网站上提交表单的按钮:
<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的一部分,用户填写的表单字段之外是服务的响应(并且由于您可能会或可能不会在前端做很多事情,因此用户可以在响应之前对其进行操作发布到您的后端,Google的回应目前尚不明确)
在您的后端,您需要获取来自Google的g-recaptcha-response,然后使用您的私钥(不是表单上的私钥)将其发送到验证API。为了得到您可以采取行动的人/机器人裁决。这是一个用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完成工作,然后忽略结果