我正在尝试使用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);
?>
根据我的阅读,我必须将其放在我的插入查询的'value'部分: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]')";
但后来我得到了一个Parse错误(我理解为什么,但我只是在尝试) 所以我的问题是:有谁知道我如何加密$ _POST ??
答案 0 :(得分: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 injection attacks 攻击,而您需要自己defend 。
答案 1 :(得分:1)
SHA *哈希函数不适合密码,因为它们的速度太快了。您的示例中的另一个问题是,您正在生成未加盐的哈希值。看看PHP函数password_hash(),它将生成一个BCrypt哈希并负责生成安全盐。对于较旧的PHP版本,还存在compatibility pack。
// 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()。
答案 2 :(得分:0)
使用SHA2('$_POST[pwrd]',256)
代替'SHA2($_POST[pwrd])'
$ins="INSERT INTO users (uname, pwrd, bdate, mail)
VALUES
('$_POST[uname]',SHA2('$_POST[pwrd]',256),'$_POST[bdate]','$_POST[mail]')";