如何阻止uniqid()在PHP表单中重新生成

7 浏览
0 Comments

如何阻止uniqid()在PHP表单中重新生成

我想为用户生成一个随机密钥,在注册过程中使用。代码将生成的密钥与用户输入进行比较,但当用户提交表单时,密钥会被重新生成,所以它们永远不会相同。我尝试通过检查生成器函数是否已经生成来保护它,但没有成功。然后,我还尝试使用会话,但也没有成功。以下代码总是生成“失败”而不是“成功”:

编辑:根据您的评论进行了一些更正。

session_start();

$_SESSION['key'] = randomKey();

$key1 = $_SESSION['key'];

error_reporting(E_ALL);

ini_set('display_errors', 1);

function randomKey() {

if (empty($_SESSION['key'])) {

$key = uniqid();

$_SESSION['key'] = $key;

return $key;

} else {

return $_SESSION['key'];

}

}

if(isset($_POST['submit']))

{

$input = $_POST['inputKey'];

if (strcmp($input,$_SESSION['key']) == 0) {

echo '成功';

} else {

echo '失败';

}

}

?>

您的密钥:

输入您的密钥:

0
0 Comments

这个问题的原因是uniqid()函数在每次调用时都会生成一个新的随机码,导致在同一个表单中重复使用uniqid()函数时会生成不同的随机码。为了解决这个问题,可以将表单提交到另一个页面,通过隐藏字段将随机码传递给第二个页面,从而避免重复生成随机码。

test1.php页面中的代码如下所示:

 0);
}
?>




Your key:
Enter your key:

test2.php页面中的代码如下所示:


通过将表单提交至randomkey2.php页面,可以在该页面中获取用户输入的key并与隐藏字段中的随机码进行比较。如果两者相匹配,则输出'success',否则输出'fail'。

这种方式不仅避免了使用会话全局变量,还解决了uniqid()函数重复生成随机码的问题。尽管这种方法看起来有点奇怪,但对我来说,将过程细分并不是一个问题,并且它能正常工作。非常抱歉如果我浪费了你的时间,我刚刚开始使用PHP。感谢您的纠正和建议。

0
0 Comments

问题原因: 代码中存在一个轻微的错误,即在成功后,重新加载页面时,代码仍会生成相同的密钥,这会导致随机性被丢弃,而随机性在使用唯一函数时是非常重要的。因此,在成功后需要销毁会话。

解决方法: 修改代码如下,并使用 session_destroy() 函数来销毁会话。

if(isset($_POST['submit']))
{   
    $input = $_POST['inputKey'];
    if (strcmp($input,$_SESSION['key']) == 0) {
        echo 'success';
        session_destroy();
    } else {
        echo 'fail';
    }
}

参考资料:

解决完headers被发送的问题后,考虑在成功后重定向到其他页面或同一页。可以使用header函数实现重定向,但不能同时使用echo和header函数,因此需要注意这一点。

参考资料:

请务必在header函数后添加exit;(如手册中所述),否则代码可能会继续执行,如果在其下方还有其他代码的话。

0