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

Php 表单安全性的基本添加给出了错误的答案,php,forms,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) { //

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

$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在页面加载时立即执行这一事实有关,因此只要用户按下submit按钮,就会生成新的数字?还是我走远了?如果是这样的话,可以做些什么来解决这个问题?

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

您应该将变量存储在会话中,并在处理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']);

   ...

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

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

您应该将变量存储在会话中,并在处理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']);

   ...

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

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

您应该将变量存储在会话中,并在处理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']);

   ...

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

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

您应该将变量存储在会话中,并在处理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中,然后对$\u POST数组中的条目进行计算

让您的代码以如下方式开始:

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

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

让您的代码以如下方式开始:

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

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

让您的代码以如下方式开始:

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

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

让您的代码以如下方式开始:

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

谢谢你的回答和解释,我正在按照你演示的那样做,但是现在两个数字之和的答案总是8。任何其他数字都不起作用,即使它是两个随机数的正确和。@Reece55确保在任何地方都使用会话变量,在生成表单时也是如此。您的会话对您来说是唯一的,但如果您希望在浏览自己时使用不同的值,则应在成功发布表单后取消设置
$\u session['numbers']
变量。这样,下次显示表单时,将在会话中生成并存储两个新值。感谢您的响应和解释,我正在按照您演示的方式进行操作,但现在两个数字之和的答案始终为8。任何其他数字都不起作用,即使它是两个随机数的正确和。@Reece55确保在任何地方都使用会话变量,在生成表单时也是如此。您的会话对您来说是唯一的,但如果您希望在浏览自己时使用不同的值,则应在成功发布表单后取消设置
$\u session['numbers']
变量。这样,下次显示表单时,将在会话中生成并存储两个新值。感谢您的响应和解释,我正在按照您演示的方式进行操作,但现在两个数字之和的答案始终为8。任何其他数字都不起作用,即使它是两个随机数的正确和。@Reece55确保在任何地方都使用会话变量,在生成表单时也是如此。您的会话对您来说是唯一的,但如果您希望在浏览自己时使用不同的值,则应在成功发布表单后取消设置
$\u session['numbers']
变量。这样,下次显示表单时,将在会话中生成并存储两个新值。感谢您的响应和解释,我正在按照您演示的方式进行操作,但现在两个数字之和的答案始终为8。任何其他数字都不起作用,即使它是两个随机数的正确和。@Reece55确保在任何地方都使用会话变量,在生成表单时也是如此。您的会话对您来说是唯一的,但如果您希望在浏览自己时使用不同的值,则应在成功发布表单后取消设置
$\u session['numbers']
变量。这样,下次显示表单时,将生成两个新值并存储在会话中。将这些值放入表单中会使表单安全性很容易被破解。同意,如果有人针对此特定网站进行攻击。我认为大多数这样的攻击都会针对安装基数较大的框架,比如Wordpress或大型应用程序