我使用旧的random()函数为我在网上找到的AJAX评论系统创建验证码(源代码LINK)。
背后的想法非常简单:
function Random()
{
$chars = "ABCDEFGHJKLMNPQRSTUVWZYZ23456789";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= 4)
{
$num = rand() % 32;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
$random_code = Random();
然后在表单中,就在SUBMIT按钮之前:
<label for="security_code">Enter this captcha code: <b><? echo $random_code; ?></b></label>
<input type="text" name="security_code" id="security_code" />
<input name="randomness" type="hidden" id="randomness" value="<?php $random_code; ?>">
我的AJAX评论系统使用类似的东西来检查字段是否为空(即,如果有任何错误):
$errors = array();
$data= array();
[...]
if(!($data['name'] = filter_input(INPUT_POST,'name',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['name'] = 'Please enter a name.';
}
if(!empty($errors)){
[...]
}
所以我写了这个:
if(!($data['security_code'] = filter_input(INPUT_POST,'security_code',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['security_code'] = 'You did not enter the validation code.';
}
elseif(!($data['security_code'] = $randomness))
{
$errors['security_code'] = 'You entered the validation code incorrectly. Please note that it is case sensitive.';
}
但是,当我在验证码文本字段中插入随机文本后单击SUBMIT按钮(在LINK自行测试)时,我总是得到&#34;您输入的验证码不正确。 #34;消息。
print_r($ _ POST)给出一个空数组,然后在我点击提交后脚本挂起: 排列 ( )
我错过了什么?原始验证码在验证过程中的某个时刻(第3和第4个代码块)丢失。 提前致谢
答案 0 :(得分:1)
看到你的代码here后,我发现静态函数validate不知道变量$randomness
!从您的submit.php,您正在拨打以下电话:
$arr = array();
$validates = Comment::validate($arr);
函数validate
对变量$randomness
一无所知,除非你把它传递给它 - 它在不同的范围内。
尝试修改上述代码:
$arr = array(); // no change here
$randomness = isset($_POST['randomness']) ? $_POST['randomness'] : '';
// Check for empty randomness before you validate it in Comment::validate
// so that you donot verify for '' == '' there.
$validates = Comment::validate($arr, $randomness);
并按如下方式更改验证功能:
public static function validate(&$arr, $randomness)
{
我知道它不是优雅的解决方案 - 这需要你能为自己学习的更多东西,这只是为了向你展示道路......
让我知道事情的后续。
答案 1 :(得分:0)
而不是:
<input name="randomness" type="hidden" id="randomness" value="<?php $random_code; ?>">
写:
<input name="randomness" type="hidden" id="randomness" value="<?php echo $random_code; ?>">
也代替:
elseif(!($data['security_code'] = $randomness))
{
$errors['security_code'] = 'You entered the validation code incorrectly. Please note that it is case sensitive.';
}
也许这个:
elseif($data['security_code'] != $randomness) {
$errors['security_code'] = 'You entered the validation code incorrectly. Please note that it is case sensitive.';
}
同样,从$data
获取其值? $ _ POST,$ _GET ?
print_r()
它以及$_REQUEST
点亮。