Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么每次我刷新页面时都要使用rand()?_Php - Fatal编程技术网

Php 为什么每次我刷新页面时都要使用rand()?

Php 为什么每次我刷新页面时都要使用rand()?,php,Php,我想运行确认安全问题的迷你程序: $questions = array('dog legs','car legs','the best country in the world'); $answers = array(4,4,'USA'); $questionId = rand(0, (count($questions)-1)); 然后 $ans = $_POST['answer']; if($ans == $answers[$questionId]){echo 'Confirmed !';}

我想运行确认安全问题的迷你程序:

$questions = array('dog legs','car legs','the best country in the world');
$answers = array(4,4,'USA');
$questionId = rand(0, (count($questions)-1));
然后

$ans = $_POST['answer'];
if($ans == $answers[$questionId]){echo 'Confirmed !';}

所以问题是,不是每次我回答的答案都是正确的,因为在发送表单后,rand函数运行并更改问题!有什么解决办法吗?

您还需要知道最初的问题是什么。最简单的方法是将问题作为隐藏输入发布在表单中:

<form>
    <?php echo $questionID; ?>
    <input type="text" name="answer" />
    <input type="hidden" name="question" value="<?php echo $questionID; ?>" />
</form>
最佳方式: 基本上,您需要将问题id保存到用户会话中

解决方法: 如果这太复杂,请执行以下操作

创建一个秘密字符串。 从秘密字符串+正确答案创建md5。 将md5写入表单隐藏字段。 在提交表单时,检查机密字符串+给定答案是否从表单返回md5

除非有人知道你的秘密字符串,否则即使没有会话,你也是安全的

敬告 我的解决方法与将问题ID存储到另一个答案中的sugegsten那样的表单中有相同的问题:可以简单地操纵问题ID以始终显示一个已解决的问题。会话是唯一或多或少安全的方式

致意


Zsolt

您可以以隐藏输入的形式传递问题ID值,这样ID将重新发送

<input type="hidden" name="questionId" value="<?php echo $questionId; ?>"></input>

刷新并重新运行脚本时发送新请求。。。这是预期的行为。嗯,主观安全问题。您可以将问题ID添加到帖子中或使用会话存储它。编辑隐藏字段,用户可以“决定”他们想要的问题ID。我们不应该在客户端上存储问题idside@DanielAranda-这怎么会是一个安全风险,不管你知道答案还是不知道答案,问题已经发布在页面上了?@adeneo在这种情况下不是一个安全风险。我认为只有那个会话会更好,因为我们不共享问题id。但是在这个用例中,共享问题id不会像您所说的那样产生任何风险。只是我一直都是最佳实践,由于可能的操作,我尽量不在客户端存储“服务器端”值。@DanielAranda-这是在会话中存储它没有意义的情况之一,因为它不是真正的会话数据,它只是一个已知的值,用于与答案进行比较,你说得对@DanielAranda,用户确实可以这样做,但正如adeneo所说,这不是安全风险。此外,我认为用户也可以编辑您的会话值,如果他真的想要的话,对吗?对于base64编码,顺便说一句,它也可以被任何其他“模糊化”算法所取代,我们可以说这个选项是非常安全的。
<input type="hidden" name="questionId" value="<?php echo $questionId; ?>"></input>
<?php
if ($_POST['questionID'])
    $questionID = $_POST['questionID'];
else
    $questionID = rand(0, (count($questions)-1));