Javascript 与$\u POST[]相比,PHP随机数生成器不工作
这只是得到随机数。然后将int转换为字符串。该字符串在HTML中使用Javascript 与$\u POST[]相比,PHP随机数生成器不工作,javascript,php,html,Javascript,Php,Html,这只是得到随机数。然后将int转换为字符串。该字符串在HTML中使用 $num1=mt_rand(1,9); $num2=百万兰特(1,9); $sum=$num1+$num2; $str1=(字符串)$num1; $str2=(字符串)$num2; 本节仅获取所有POST信息和变量声明 if(设置($\u POST[“提交”])){ $name=$_POST['name']; $email=$_POST['email']; 这些只是变量的定义 $message=$\u POST['mess
$num1=mt_rand(1,9);
$num2=百万兰特(1,9);
$sum=$num1+$num2;
$str1=(字符串)$num1;
$str2=(字符串)$num2;
本节仅获取所有POST
信息和变量声明
if(设置($\u POST[“提交”])){
$name=$_POST['name'];
$email=$_POST['email'];
这些只是变量的定义
$message=$\u POST['message'];
$human=intval($_POST['human']);
$from='茎和芽接触形式';
$to$saifanchey@gmail.com';
$subject=$_POST['subject'];
$reason=$_POST['reason'];
这是代码中断的地方。它总是在正确时输出您的反垃圾邮件是不正确的。这就是错误发生的地方。$num1
和$num2
变量是我前面声明的两个随机值,当这些值相加并且用户输入正确时(理论上)应该可以工作
每次用户发送带有正确的human
值的表单时,服务器都会收到POST
请求,并为$num1
和$num2
生成新值。这就是您的条件不起作用的原因
您需要记住操作数,并将其与显示给用户的值进行比较
最简单的示例(不安全的攻击):
因此,这是您的php文件:
// init new random numbers
$num1New = mt_rand(1, 9);
$num2New = mt_rand(1, 9);
将隐藏值添加到html表单:
<input type="hidden" name="num1" value="<?php echo $num1New ?>">
<input type="hidden" name="num2" value="<?php echo $num2New ?>">
在这种情况下,您将比较显示给用户的值
另一种解决方案是将这对值存储在数据库、用户会话或其他存储中。要完成基于数学的验证码,您需要使用会话变量存储答案,并将提交的答案和该会话变量进行比较
以下内容应该有助于解决您的问题-它基于您的原始代码片段,但没有包含所有元素或变量的完整形式,但应该给出如何继续的清晰想法
<?php
session_start();
$errHuman=false;
$num1 = mt_rand(1,9);
$num2 = mt_rand(1,9);
$sum = $num1 + $num2;
if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['human'] ) && !empty( $_SESSION['math-captcha'] ) ){
$answer=filter_input( INPUT_POST, 'human', FILTER_SANITIZE_NUMBER_INT );
$errHuman = ( intval( $answer )==$_SESSION['math-captcha']->sum ) ? 'Congratulations' : 'Sorry - that is incorrect';
}
$_SESSION['math-captcha']=(object)array(
'num1' => $num1,
'num2' => $num2,
'sum' => (int)$sum
);
?>
<!DOCTYPE html>
<html>
<head>
<title>Math based captcha</title>
</head>
<body>
<form method='post'>
<!-- other form elements-->
<div class="form-group">
<label for="human" class="col-sm-2 control-label"><?php printf( '%d + %d=?', $num1, $num2 );?></label>
<div class="col-sm-10">
<input type="text" class="form-control" name="human" placeholder="Your Answer">
<?php
if( $errHuman ){
printf('<p class="text-danger">%s</p>', $errHuman );
}
?>
</div>
</div>
<input type='submit' />
</form>
</body>
</html>
基于数学的验证码
您的问题。这是一个混乱的格式错误。至于您的错误-当您按“提交”时,您的数字与上一页加载时的数字不同。如上所述,使用会话记住必须添加的值,这是因为web应用程序是无状态的。这是一个很好的概念,让您了解一下。
<?php
session_start();
$errHuman=false;
$num1 = mt_rand(1,9);
$num2 = mt_rand(1,9);
$sum = $num1 + $num2;
if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST['human'] ) && !empty( $_SESSION['math-captcha'] ) ){
$answer=filter_input( INPUT_POST, 'human', FILTER_SANITIZE_NUMBER_INT );
$errHuman = ( intval( $answer )==$_SESSION['math-captcha']->sum ) ? 'Congratulations' : 'Sorry - that is incorrect';
}
$_SESSION['math-captcha']=(object)array(
'num1' => $num1,
'num2' => $num2,
'sum' => (int)$sum
);
?>
<!DOCTYPE html>
<html>
<head>
<title>Math based captcha</title>
</head>
<body>
<form method='post'>
<!-- other form elements-->
<div class="form-group">
<label for="human" class="col-sm-2 control-label"><?php printf( '%d + %d=?', $num1, $num2 );?></label>
<div class="col-sm-10">
<input type="text" class="form-control" name="human" placeholder="Your Answer">
<?php
if( $errHuman ){
printf('<p class="text-danger">%s</p>', $errHuman );
}
?>
</div>
</div>
<input type='submit' />
</form>
</body>
</html>