【问题标题】:How to stop uniqid() from regenerating in a PHP form如何阻止 uniqid() 以 PHP 形式重新生成
【发布时间】:2016-12-11 06:02:30
【问题描述】:

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

编辑:我根据你的 cmets 做了一些更正。

<?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>

【问题讨论】:

标签: php forms session random generated


【解决方案1】:

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

test1.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>

test2.php:

<?php

$input = $_POST['inputKey'];
$key = $_POST['keyHidden'];

$control = strpos($key, $input);

if($control !== false)
{   
echo 'success';
} else {
echo 'fail';
}

?>

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

【讨论】:

    【解决方案2】:

    您在 cmets 中声明现在有一个标头已发送警告。

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

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

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

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

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

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

    参考:

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

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

    参考:

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

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多