为什么我的全局变量不起作用?

时间:2016-03-16 15:36:03

标签: php hash salt

我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏,用户名和密码。有了这个密码,我想使用PHP的哈希函数和一些“盐”来使密码安全。为此,我在PHP脚本中创建了一个函数来节省冗余。为了实现这一点,我将变量$ connection,$ iniSalt和$ endSalt更改为全局变量 - 认为这将允许我在函数addUser()中使用它们。 谁能告诉我这里做错了什么?任何关于如何解决这个问题的建议将不胜感激。这是我的代码:     

global $connection;
$connection = new mysqli($db_host, $user, $pass, $db);

if ($connection->connect_error) {
    die($connection->connect_error);
}

$query = "CREATE TABLE users (
firstname VARCHAR(32) NOT NULL,
lastname VARCHAR(32) NOT NULL,
username VARCHAR(32) NOT NULL UNIQUE,
password VARCHAR(32) NOT NULL
)";

$result = $connection->query($query);
if (!$result) {
    die($connection->error);
}

global $iniSalt, $endSalt;
$iniSalt = "xb&z*";
$endSalt = "nb!@";

function addUser($conn, $firstname, $lastname, $username, $password) {
    $token = hash('ripemd128', "$iniSalt$password$endSalt");
    $query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";
    $result = $connection->query($query);
    if (!$result) {
        die($connection->error);
    }
}

addUser($connection, 'Bill', 'Murray', 'bmurray', 'mysecret');
addUser($connection, 'Jacki', 'Hughes', 'jhughes', 'somepw');

3 个答案:

答案 0 :(得分:2)

除了关于全球布局的其他答案,我在评论中也指出了它的位置:

旁注:请参阅我的脚注。

$token变量是一个字符串,也必须引用它。

$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', $token)";

当您的查询启动时,您将收到语法错误。

所以,引用变量:

$query = "INSERT INTO users VALUES('$firstname', '$lastname', '$username', '$token')";

ripemd128生成一个字符串,而不是整数

  

ripemd128 32 789d569f08ed7055e94b4289a4195012

此外,如果您计划使用此功能,最好使用password_hash()或兼容包。

它更安全。

参考文献:

如果您决定使用password_hash()或隐藏,请务必注意,如果您当前的密码列的长度低于60,则需要将其更改为(或更高)。手册建议长度为255。

您需要更改列的长度并重新开始使用新哈希才能使其生效。否则,MySQL将无声地失败。

<强>脚注:

阅读变量范围:

如果您希望防止SQL注入,这是值得做的事情,请参阅以下内容:

答案 1 :(得分:1)

您需要在函数内声明这些变量的全局范围:

function addUser($conn, $firstname, $lastname, $username, $password) {
    global $connection, $iniSalt, $endSalt;
    // Then use those global variables
    ...
}

全球关键字的文档:http://php.net/manual/en/language.variables.scope.php

答案 2 :(得分:1)

这不是全局变量的工作方式。将global $connection;放在addUser()函数的顶部,以便在函数中使用它。

function addUser($conn, $firstname, $lastname, $username, $password) {
    global $connection;
    ...
}