Php 表单验证失败时仅输入一次recaptcha?
我有一个表单,它有几个字段,最后有一个recaptcha代码 当用户提交表单时,将验证recaptcha字段以及服务器端(PHP)上的其他字段。如果任何字段无效,则会将用户重定向到同一表单,并出现错误 然而,问题是:用户必须再次输入recatpchaPhp 表单验证失败时仅输入一次recaptcha?,php,captcha,recaptcha,Php,Captcha,Recaptcha,我有一个表单,它有几个字段,最后有一个recaptcha代码 当用户提交表单时,将验证recaptcha字段以及服务器端(PHP)上的其他字段。如果任何字段无效,则会将用户重定向到同一表单,并出现错误 然而,问题是:用户必须再次输入recatpcha 如果表单验证失败但验证码验证成功,是否有任何方法不能要求用户再次输入recaptcha?是-设置成功输入验证码的会话变量,不显示recaptcha表单。是-设置成功输入验证码的会话变量,不显示recaptcha表单回顾一下表单。没有看到您的代码或它
如果表单验证失败但验证码验证成功,是否有任何方法不能要求用户再次输入recaptcha?是-设置成功输入验证码的会话变量,不显示recaptcha表单。是-设置成功输入验证码的会话变量,不显示recaptcha表单回顾一下表单。没有看到您的代码或它的设置方式。我能想到的最简单的事情就是使用PHP会话:
<?php
if (!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){ ?>
<label class="control-label">CAPTCHA</label>
<script type="text/javascript"> var RecaptchaOptions = {theme : 'white' }; </script>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=your key"></script>
<noscript>
<iframe src="http://www.google.com/recaptcha/api/noscript?k=your key"
height="300" width="500" frameborder="0"></iframe><br>
<textarea name="recaptcha_challenge_field" rows="3" cols="40">
</textarea>
<input type="hidden" name="recaptcha_response_field"
value="manual_challenge">
</noscript>
<? } ?>
接收表单数据的文件(假定为POST)
包含表单的文件
session_start();
echo "<form method='yourphpfile.php' method='post'>"
if(!isset($_SESSION['captcha_valid']) || $_SESSION['captcha_valid'] != 1)
{
//add captcha code
}
</form>
session_start();
回声“”
如果(!isset($_会话['captcha_valid'])|$_会话['captcha_valid']!=1)
{
//添加验证码
}
在看不到您的代码或如何设置代码的情况下,我能想到的最简单的事情就是使用PHP会话:
接收表单数据的文件(假定为POST)
包含表单的文件
session_start();
echo "<form method='yourphpfile.php' method='post'>"
if(!isset($_SESSION['captcha_valid']) || $_SESSION['captcha_valid'] != 1)
{
//add captcha code
}
</form>
session_start();
回声“”
如果(!isset($_会话['captcha_valid'])|$_会话['captcha_valid']!=1)
{
//添加验证码
}
当然有。您可以将recaptcha的验证成功存储到会话(或cookie或数据库)中,然后在有指示的情况下隐藏recaptcha。在服务器端,您只需检查recaptcha是否正确或指示是否有效
您还必须确保有效的recaptcha cookie只能使用一次,因为如果不能使用,垃圾邮件发送者只需反复发送cookie信息,并处理recaptcha
我的想法是将时间戳存储在会话中的“recaptcha_success”这样的键下,然后检查时间戳是否不超过几分钟(根据您的需要)。如果不是,则通过不再验证来解决recaptcha。如果表单有效,请删除该键,以便用户下次要使用表单时必须再次输入recaptcha。确实有。您可以将recaptcha的验证成功存储到会话(或cookie或数据库)中,然后在有指示的情况下隐藏recaptcha。在服务器端,您只需检查recaptcha是否正确或指示是否有效 您还必须确保有效的recaptcha cookie只能使用一次,因为如果不能使用,垃圾邮件发送者只需反复发送cookie信息,并处理recaptcha
我的想法是将时间戳存储在会话中的“recaptcha_success”这样的键下,然后检查时间戳是否不超过几分钟(根据您的需要)。如果不是,则通过不再验证来解决recaptcha。如果表单有效,请删除该键,以便用户下次要使用表单时必须再次输入recaptcha。您可以通过如下设置会话变量进行验证
<?php
// captcha is already submitted so no need to verify again,
if(!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){
require_once('admin/recaptcha/recaptchalib.php');
// Get a key from https://www.google.com/recaptcha/admin/create
$publickey = 'your publickey';
$privatekey = 'your privatekey';
# the response from reCAPTCHA
$resp = null;
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
$errors[] = 'The CAPTCHA wasn\'t entered correctly, please try again';
}else{
$_SESSION['human_signup'] = time();
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
}
验证码
var RecaptchaOptions={theme:'white'};
确保用户注册完成后删除会话。像这样
<?php
//insert registration data in db i.e. registration is complete.
//unset the session used to hide the captcha.
unset($_SESSION['human_signup']);
?>
一个不太重要的功能是阻止用户手动输入验证码,然后使用一些脚本自动创建帐户
/* if user tries to register automatically by manually entering captcha and using scrpt to create accoutns */
<?php
if(isset($_SESSION['human_signup']) && ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'])) {
unset($_SESSION['human_signup']);
unset($_SESSION['user_agent']);
@session_destroy();
@session_unset();
}
?>
/*如果用户试图通过手动输入验证码并使用scrpt创建帐户来自动注册*/
希望这有帮助。如果我遗漏了什么,请随意编辑答案。您可以通过这样设置会话变量进行验证
<?php
// captcha is already submitted so no need to verify again,
if(!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){
require_once('admin/recaptcha/recaptchalib.php');
// Get a key from https://www.google.com/recaptcha/admin/create
$publickey = 'your publickey';
$privatekey = 'your privatekey';
# the response from reCAPTCHA
$resp = null;
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
$errors[] = 'The CAPTCHA wasn\'t entered correctly, please try again';
}else{
$_SESSION['human_signup'] = time();
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
}
验证码
var RecaptchaOptions={theme:'white'};
确保用户注册完成后删除会话。像这样
<?php
//insert registration data in db i.e. registration is complete.
//unset the session used to hide the captcha.
unset($_SESSION['human_signup']);
?>
一个不太重要的功能是阻止用户手动输入验证码,然后使用一些脚本自动创建帐户
/* if user tries to register automatically by manually entering captcha and using scrpt to create accoutns */
<?php
if(isset($_SESSION['human_signup']) && ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'])) {
unset($_SESSION['human_signup']);
unset($_SESSION['user_agent']);
@session_destroy();
@session_unset();
}
?>
/*如果用户试图通过手动输入验证码并使用scrpt创建帐户来自动注册*/
希望这有帮助。如果我遗漏了什么,请随意编辑答案。在您的PHP中,您还必须检查是否设置了captcha\u valid(验证码有效或$\u会话['captcha\u valid')==1)。还要确保检查验证码是否是他们的,或者验证码是否有效设置为1,否则如果没有发送验证码,表单将被视为有效。如果$\u会话['captcha\u valid']==1,则表单将不显示验证码字段,因此在POST vars中将没有“验证码”所以如果我从请求中手动删除验证码,php代码会认为我之前输入的验证码是正确的?因为我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,但是如果他们这样做,你的实现将使验证码无效。啊,我明白你的意思了ing-是的,需要进行该检查才能添加安全性。我将编辑帖子以反映这一点。在PHP中,您还必须检查是否设置了验证码有效,因此如果(验证码有效或$会话['captcha\u有效'),它将是
if(验证码有效)==1)
。还要确保检查验证码是否是他们的,或者验证码是否有效设置为1,否则如果没有发送验证码,表单将被视为有效。如果$\u会话['captcha\u valid']==1,则表单将不显示验证码字段,因此在POST vars中将没有“验证码”因此,如果我手动从请求中删除验证码,php代码将假定我之前输入的验证码是正确的?因为我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,但不是