0

我正在尝试使用 SHA2 加密我的“密码”列。问题是注入 MYSQL 是通过 $_POST 变量,所以我不明白我应该把 SHA2() 放在哪里。

这是我的“插入”页面(inscreate.php):

  <?php
    include 'header.php';
    $ins="INSERT INTO users (uname, pwrd, bdate, mail)
        VALUES ('$_POST[uname]','$_POST[pwrd]','$_POST[bdate]','$_POST[mail]')";
if (!mysqli_query($con,$ins))
      {
      die('Error: ' . mysqli_error($con));
      }
    echo "User added! You will be returned to the index page!";

    mysqli_close($con);
    ?>  

根据我的阅读,我必须将其放在插入查询的“值”部分:http: //coderlearner.com/MySQL_Encryption-Decryption_Example_SHA2

所以我尝试了这些组合:

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
            VALUES ('$_POST[uname]','SHA2($_POST[pwrd])','$_POST[bdate]','$_POST[mail]')";

但是如果密码是例如:mypass,我的数据库中的输出是这样的:SHA2(mypass)

我试过这个:

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
    VALUES ('$_POST[uname]',$_POST[SHA2(pwrd)]','$_POST[bdate]','$_POST[mail]')";

但后来我得到一个解析错误(我明白为什么,但我仍然只是在尝试)所以我的问题是:有谁知道我如何加密 $_POST?

4

3 回答 3

2

再看看例子。

mysql> INSERT INTO userpassword(id, username,password)
    -> VALUES(null,'Lili',SHA2('mypassword1',256));

引号围绕字符串。SHA2()函数调用围绕引号。

SHA2()需要两个参数。

'SHA2($_POST[pwrd])'

应该:

SHA2('$_POST[pwrd]', 256)

…但不要将 POST 数据直接粘贴到您的 SQL 中。它使您容易受到需要防御的SQL 注入攻击

于 2014-04-24T09:03:50.107 回答
1

SHA* 散列函数不适用于密码,因为它们的速度太快了。您的示例中的另一个问题是,您正在生成未加盐的哈希值。查看 PHP 函数password_hash(),它将生成 BCrypt 哈希并负责生成安全盐。还存在一个适用于旧 PHP 版本的兼容性包

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

这也意味着您不能直接在 SQL 语句中验证密码,而是从数据库中读取哈希(通过用户名),然后使用此哈希调用 password_verify()。

于 2014-04-24T09:34:33.367 回答
0

使用SHA2('$_POST[pwrd]',256)insted of'SHA2($_POST[pwrd])'

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
       VALUES 
('$_POST[uname]',SHA2('$_POST[pwrd]',256),'$_POST[bdate]','$_POST[mail]')";
于 2014-04-24T09:02:33.533 回答