如何在客户端和服务器端(php)中集成Google reCAPTCHA版本3.以下代码用于显示recaptcha,但它不能正常工作.如何进行这种集成.
<html>
<head>
<script src='https://www.google.com/recaptcha/api.js?render=XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'></script>
</head>
<body>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', {
action: 'action_name'
});
});
</script>
<form action="verify.php" method="post">
<input type="text" name="name" placeholder="Your name" required>
<input type="email" name="email" placeholder="Your email address" required>
<textarea name="message" placeholder="Type your message here...." required></textarea>
<input type="submit" name="submit" value="SUBMIT">
</form>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
Verify.php
<?php
if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])) {
//your site secret key
$secret = 'XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
//get verify response data
$verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
$responseData = json_decode($verifyResponse);
if($responseData->success):
print_r("Working Fine"); exit;
else:
print_r("No valid Key"); exit; …Run Code Online (Sandbox Code Playgroud) 我们在我们的一个网站上整合了隐形的recaptcha.每当我们提交表格时,它会自动提交.
我在一些谷歌小组中读到,当我们在边缘浏览器上访问时,我们会遇到挑战.但对我们来说,它会自动提交.
测试隐形recaptcha的任何具体步骤?
谷歌推出了reCAPTCHA v3.它消除了所有用户的摩擦.我希望用它来保护我的网站.但是,我不确定这将如何保护我的网站.如果黑客在没有使用我提供的界面的情况下使用外部工具对我的网站上的URL进行垃圾邮件怎么办?reCAPTCHA v3将如何阻止它?
javascript verification spam-prevention recaptcha invisible-recaptcha
我们正在使用隐形reCaptcha,偶尔,谷歌的Javascript代码向Google的服务器发出请求,接收响应状态410,而不是200.
我们无法控制它,因为Google的reCaptcha Javascript代码提出了请求.
如果已向用户呈现挑战,则以下是失败请求的示例:
GET https://www.google.com/recaptcha/api2/payload?c=03AOPBWq_EYB...
Run Code Online (Sandbox Code Playgroud)
响应是:
HTTP/1.1 410 Gone
<HTML>
<HEAD>
<TITLE>Gone</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Gone</H1>
<H2>Error 410</H2>
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)
它失败了大约10%的时间.以下是HTTP请求的"历史记录":
请求#1
POST https://www.google.com/recaptcha/api2/reload?k=6LcqZCEU...
v:r20170515161201
reason:fi
bcr:[1943341955,-150...
...
HTTP/1.1 200 OK
content-type: application/json
...
)]}'
["rresp","03AOPBWq_EYBOYkGkn-1S...",null,600,["pmeta",null,null,null,
null,[[["TileSelectionStreetSign",null,3,4,4,null,null,[]
]
,["dress",null,3,4,4,null,null,[]
]
]
,[]
]
]
,"multicaptcha",null,
["bgdata","Ly93d3cuWk5rOHFMZDlvNDZFa..."]
]
Run Code Online (Sandbox Code Playgroud)
上面的响应看起来像无效的JSON,但预计详见此处
请求#2
GET https://www.google.com/recaptcha/api2/payload?c=03AOPBWq_EYBOYk...
...
HTTP/1.1 200 OK
content-type: image/jpeg
content-length: 50528
...
<JPEG>
Run Code Online (Sandbox Code Playgroud)
请求#3
POST https://www.google.com/recaptcha/api2/replaceimage?k=6LcqZCEUAA...
v:r20170515161201
c:03AOPBWq_EYBOYkGkn-1SplFL...
ds:[[5,6,9,10,13,14]]
HTTP/1.1 200 OK
content-type: application/json
...
)]}'
["dresp","03AOPBWq-Iyck5GCpx86hk57XSxF-9b4GMaDeujP...",[]
,null,[]
] …Run Code Online (Sandbox Code Playgroud) 我们有一个 PHP 表单,它在 reCaptcha 上有几个选项卡和超时。一切都在一页中完成,如果表格在 <3 分钟内完成,它就可以正常工作。
一个解决方案的想法是将表单处理和 reCaptcha 移动到辅助页面进行处理。
问题是表单页面轮询谷歌服务以获取 reCaptcha 并将令牌值收集到隐藏字段。
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
Run Code Online (Sandbox Code Playgroud)
问题是如何在服务端处理页面请求这个token?这是客户端表单页面上使用的代码。我需要以某种方式重新生成要应用的令牌值:
$recaptcha_response
这是表单页面上的工作版本。从表单页面删除对发布令牌的要求很容易,只是不确定如何重新生成令牌以在服务器端页面上使用。
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['recaptcha_response'])) {
// Build POST request:
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = RECAPTCHA_SECRET_KEY;
$recaptcha_response = $_POST['recaptcha_response'];
$remoteip = $_SERVER['REMOTE_ADDR'];
// Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response. '&remoteip='.$remoteip);
$recaptcha = json_decode($recaptcha);
// Take action based on the score returned:
if ($recaptcha->score >= 0.5) {
Run Code Online (Sandbox Code Playgroud)
编辑添加:将重新验证码的初始化直到提交延迟计时问题,因为这似乎是一个选项:
https://developers.google.com/recaptcha/docs/v3
“2. …
我最近开始使用Google的新方法Recaptcha - 他们的新Invisible Recaptcha.我意识到这个版本的实现有点不同,因为你将recaptcha属性直接附加到你的提交按钮,然后调用google的recaptcha api并开始验证过程.我已经完成了所有这些工作,但我遇到的一个主要问题是"受重新保护的徽章"定位.
将recaptcha配置添加到我的提交按钮后,我开始看到屏幕右侧的徽章.根据其他网站,这个徽章应该只是一个方形的recaptcha徽标,直到它徘徊,然后它应该滑出来,我最初在我的网站上看到的大矩形.
这是我在实现隐形recaptcha后在我的网站上看到的图像.
这是包含recaptcha属性的提交按钮代码:
<button class="btn btn-primary btn-block g-recaptcha" data-sitekey="key"
data-callback="submitsecure" data-badge="bottomright" type="submit">Get Started</button>
Run Code Online (Sandbox Code Playgroud)
注意:其他data-badge选项如inline和bottomleft导致相同的定位问题.
包含按钮的表单的代码:
<form action="processjoin.php" method="post" id="signupform" style="padding-top:10px;padding-bottom:10px;max-width:50%;">
<h2 class="sr-only">Login Form</h2>
<div></div>
<div class="illustration"><i class="icon ion-ios-pulse-strong"></i>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input type="text" name="name" placeholder="Your Name" class="form-control" id="name" />
</div>
<div class="form-group">
<input type="text" name="username" placeholder="Username" class="form-control" id="username" />
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<input type="email" name="email" placeholder="Email" class="form-control" id="email" />
</div>
<div class="form-group">
<input …Run Code Online (Sandbox Code Playgroud) 我添加了两个不可见的recaptcha div,但是当我在inspect元素中看到代码时,我的单页中只添加了一个不可见的recaptcha.我的代码是:
<div id="captcha1" class="g-recaptcha"
data-sitekey="your_site_key"
data-callback="onSubmit"
data-size="invisible"></div>
<div id="captcha2" class="g-recaptcha"
data-sitekey="your_site_key"
data-callback="onSubmit"
></div>
Run Code Online (Sandbox Code Playgroud)
从Programmatically调用recaptcha获取参考
你能帮我解决我做错的事吗?
我正在使用Google隐形recaptcha.有没有办法检测挑战窗口什么时候关闭?通过挑战窗口,我指的是您必须选择一些图像进行验证的窗口.
一旦按下按钮,我现在在按钮上放置一个微调器,该按钮呈现recaptcha挑战.无法通过另一个挑战窗口提示用户.
我以编程方式调用render函数:
grecaptcha.render(htmlElement, { callback: this.verified, expiredCallback: this.resetRecaptcha, sitekey: this.siteKey, theme: "light", size: "invisible" });
Run Code Online (Sandbox Code Playgroud)
我有2个回调函数连接验证和resetRecaptcha函数,如下所示:
function resetRecaptcha() {
grecaptcha.reset();
}
function verified(recaptchaResponse)
{
/*
which calls the server to validate
*/
}
Run Code Online (Sandbox Code Playgroud)
我原以为grecaptcha.render有另一个回调,当挑战屏幕关闭而没有用户通过选择图像验证自己时调用.
我正在尝试在Wordpress网站上以HTML格式实施Google的Invisible reCAPTCHA.
head首先,我有一个脚本来设置回调并将表单的提交事件绑定到验证:
jQuery(document).ready(function() {
var valid = false;
window.recaptchaOkay = function(token) {
valid = true;
jQuery('#cadastro').submit();
};
document.getElementById('cadastro').addEventListener('submit', function validate(event) {
if (valid) {
return true;
}
var cap = document
.getElementById('cadastro')
.querySelector('.g-recaptcha');
grecaptcha.execute(cap);
event.preventDefault();
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
然后,我加载reCAPTCHA脚本,正如文档中所示:
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
Run Code Online (Sandbox Code Playgroud)
body这是我正在使用的形式:
<form action="https://example.com/" method="post" id="cadastro">
<div
class="g-recaptcha"
data-sitekey="6Lc0jC4UAAAAANlXbqGWNlwyW_e1kEB89zLTfMer"
data-callback="recaptchaOkay"
data-size="invisible"
id="cadastro-captcha">
</div>
<button type="submit" id="cadastro-submit">Enviar</button>
</form>
Run Code Online (Sandbox Code Playgroud)
我填写表单,提交它,并抛出以下错误(在行中grecaptcha.execute):
Error: Invalid ReCAPTCHA client id: [object HTMLDivElement]
Run Code Online (Sandbox Code Playgroud)
还尝试将cadastro-captchaID直接传递给该函数作为字符串(例如grecaptcha.execute("cadastro-captcha") …
我在IE 11中收到以下错误:
SCRIPT5007:无法获取未定义或空引用的属性"toString"recaptcha__iw.js(451,41)
脚本中是否可能出错?
在Safari,Chrome和Firefox上工作.
recaptcha ×9
javascript ×4
php ×2
recaptcha-v3 ×2
callback ×1
html ×1
invisible ×1
jquery ×1
verification ×1
wordpress ×1