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

时间:2016-08-04 23:12:00

标签: php forms session random generated

我想生成一个随机密钥供用户在注册时使用。代码将生成的密钥与用户输入进行比较,但是当用户提交表单时,密钥会重新生成,因此它们永远不会相同。我试图通过检查它是否已经生成但是它不起作用来保护生成器功能。然后,我也尝试使用会话,这也不起作用。这里的代码总是产生“失败”而不是“成功”:

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

<?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 'success';
    } else {
    echo 'fail';
    }
}
?>
<html>
<head>
</head>
<body>
<form method="POST" action="">
<table border="0">
<tr>
<td>Your key:</td>
<td>
<b>
<?php echo $key1; ?></b>
</td>
</tr>
<tr>
<td>Enter your key:</td><td><input type="text" name="inputKey"></td>
</tr>
<tr>
<td><input id="button" type="submit" name="submit" value="Sign-Up"></td>
</tr>
</table>
</form>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

您在评论中表示现在有一个标题已发送警告。

以下链接将帮助您找出原因。

但是,我确实在您的代码中发现了一个小错误。

即使成功,您的代码也会在重新加载页面时生成相同的密钥; “随机性”实际上会被“抛到窗外”,因为这就是你使用独特功能的全部目的。

您需要在成功时销毁会话。

以下是您的代码应该是什么样子并使用session_destroy()

if(isset($_POST['submit']))
{   
    $input = $_POST['inputKey'];
    if (strcmp($input,$_SESSION['key']) == 0) {

    echo 'success';

    session_destroy();

    } else {
    echo 'fail';
    }
}

参考:

一旦您纠正了发送标头的问题,请考虑在继承之后重定向某处(或相同的页面)。

您可以使用标题执行此操作,但不能同时回显和使用标题,请记住。

参考:

并确保在标题后添加exit;(如手册中所述),否则您的代码可能希望继续执行,如果您的代码下面有更多代码。

答案 1 :(得分:0)

抱歉,延误。我想我找到了一个解决方法。我刚刚将表单发布到另一个抓取和控制信息的页面。这样,随机代码不会被重新生成。所以,我有两页而不是一页。

test1.php:

time1, time2, time3,time4

test2.php:

<?php

$key = randomKey();

function randomKey() {

    $i = 0;
    do {
    $key = uniqid();
        return $key;
    } while ($i > 0);
}
?>
<html>
<head>
</head>
<body>
<form method="POST" action="randomkey2.php">
<table border="0">
<tr>
<td>Your key:</td>
<td>
<b>
<?php echo $key?></b><input type="hidden" name="keyHidden" value="<?php echo $key;?>" />
</td>
</tr>
<tr>
<td>Enter your key:</td><td><input type="text" name="inputKey"></td>
</tr>
<tr>
<td><input id="button" type="submit" name="submit" value="Sign-Up"></td>
</tr>
</table>
</form>
</body>
</html>

这样,我也不必使用会话全局变量。嗯,这可能看起来有点奇怪但是这个过程通常有点复杂,需要给出一些指令。因此,细分过程对我来说不是问题,而且有效。如果我浪费你的时间,我很抱歉,我刚刚开始使用PHP。感谢您的更正和建议。