【问题标题】:Why do my global variables not work?为什么我的全局变量不起作用?
【发布时间】:2016-03-17 01:14:24
【问题描述】:

我正在尝试创建一个注册表单,允许潜在用户输入他们的名字和姓氏、用户名和密码。有了这个密码,我想使用 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');

【问题讨论】:

  • 全局属于函数内部。
  • 红旗 => password VARCHAR(32) 告诉我们您没有使用安全的哈希函数,或者您将其设置得太低。如果$token 是一个字符串,你也需要引用它,并且似乎是一个字符串。那会在那里引发语法错误,或者“一旦”该查询启动。
  • @Fred-ii- 与您的红旗声明...您是否暗示我需要使 VARCHAR 的数量远大于 32,因为哈希将返回?
  • @Fred-ii- 对不赞成票问题感到抱歉。你对我帮助很大。感谢您花时间给我详细的答复。学习这个具有大量 Java 背景的 Web 编程 - 所以让经验丰富的 PHP 程序员来找我真的很有帮助。最好的。
  • @zhughes3 谢谢,但你不需要为那个人道歉。他只是在他自己的小方面很迟钝和特别。让他投反对票,社区会看到谁对谁错。而他……嗯,他只是单纯的“不合时宜”。我们回到了很长的路lol,也不是很好。 。我很高兴“真正地”帮助了你。它是“诚实的”,它是“纯洁的”。享受编码,干杯

标签: php hash salt


【解决方案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】:

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

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

    【讨论】:

      【解决方案3】:

      除了关于全局位置的其他答案之外,我还在 cmets 中指出了它的位置:

      旁注:查阅我的脚注。

      $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() 或其兼容包。

      这样更安全。

      参考资料:

      • PHP 5.5 的 password_hash() 函数。
      • 兼容包(如果 PHP https://github.com/ircmaxell/password_compat/

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

      您需要更改列的长度并使用新的哈希重新开始以使其生效。否则,MySQL 将静默失败。


      脚注:

      阅读变量范围:

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

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 2013-07-13
        • 1970-01-01
        • 2021-11-14
        相关资源
        最近更新 更多