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

时间:2014-10-01 22:04:00

标签: php forms

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

$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["answer"];

    if($answer == $first_num + $second_num) {
        //Do stuff
    }
    else {
        $error_message = "You answered the question wrong!";
    }
}

我正确地回答了这个问题(除非我的一年级数学已经关闭!)但它说我的问题是错误的。我不确定问题是什么,但我想这与php在页面加载时立即执行的事实有关,所以一旦用户按下提交按钮就会生成新的数字?还是我离开了?如果是这种情况,可以采取哪些措施来解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

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

类似的东西:

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']);

   ...

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

答案 1 :(得分:0)

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

让代码以这样的方式开始:

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