2

我想运行小程序来确认安全问题:

$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 函数会运行并更改问题!有什么解决办法吗?

4

3 回答 3

5

您可以在表单中传递一个隐藏输入,并将问题 ID 作为值,这样 ID 将被重新发送。

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

然后检查表单是否提交。

<?php
if ($_POST['questionID'])
    $questionID = $_POST['questionID'];
else
    $questionID = rand(0, (count($questions)-1));

您还可以使用 base64 编码来保护所有这些

于 2013-05-17T17:21:04.813 回答
4

最好的办法:

基本上,您需要将问题 ID 保存到用户会话中。

解决方法:

如果那很复杂,请执行以下操作。

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

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

注意力

我的解决方法与将问题 ID 存储到另一个答案中的 sugegsten 之类的表单中存在相同的问题:人们可以简单地操纵问题 ID 以始终显示曾经解决的问题。会话是唯一或多或少安全的方式

最好的祝福

佐尔特

于 2013-05-17T17:19:41.970 回答
3

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

<form>
    <?php echo $questionID; ?>
    <input type="text" name="answer" />
    <input type="hidden" name="question" value="<?php echo $questionID; ?>" />
</form>

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

if (isset($_POST['answer'])) {
    $answer   = $_POST['answer'];
    $question = $_POST['question'];

    if ( $questions[ $question ] == $answer ) // you're golden
}
于 2013-05-17T17:19:25.987 回答