表单安全的基本添加给出了错误的答案PHP


Basic addition for form security gives wrong answer PHP

我有一个基本的数学问题,用户在发送电子邮件之前必须回答:

$first_num = rand(1, 4);
$second_num = rand(1, 4);
$send = @$_POST['send'];
if($send){
    //The user's answer from the input box
    $answer = @$_POST["answerswer"];
    if($answer == $first_num + $second_num) {
        //Do stuff
    }
    else {
        $error_message = "You answered the question wrong!";
    }
}

我答对了这个问题(除非我一年级的数学不及格!)但它说我错了。我不确定问题是什么,但我想这与php在加载页面时立即执行有关,因此用户一按下提交按钮就会生成新的数字?还是我离这儿很远?如果是这样的话,我们可以做些什么来解决这个问题?

问题是每次调用脚本时都要设置值。因此,当您发布表单时,会设置两个新值,它们可能与您第一次调用脚本显示表单时的值不同。

您应该将变量存储在会话中,并在处理post请求时检索这些值。

类似于:

session_start();
if (!isset($_SESSION['numbers']))
{
  $_SESSION['numbers']['first'] = rand(1, 4);
  $_SESSION['numbers']['second'] = rand(1, 4);
}
...
   if ($answer == $_SESSION['numbers']['first'] + $_SESSION['numbers']['second']) {
     //Do stuff
     /**
       unset the variables after successfully processing the form so that
       you will get new ones next time you open the form
      */
     unset($_SESSION['numbers']);
   ...

请注意,您现在需要在使用自己的变量的任何地方使用会话变量。

您应该将这两个数字作为隐藏的表单输入包含在HTML中,然后对$_POST数组中的条目进行计算。

让你的代码像这样开始:

$first_num = $_POST["first_num"];
$second_num = $_POST["second_num"];