我使用以下代码在MySQL数据库中加密和散列密码:
<?php
function make($string, $salt = '') {
return hash('sha256', $string . $salt);
}
function salt($length) {
return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
}
$salt = salt(32);
$password = make('password', $salt);
?>
但是,当我尝试将生成的salt插入数据库时,在某些情况下会发生此错误:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ÜöOòƒ·¡]ŽÖ', 1)' at line 1
我认为这是因为生成了无法识别的字符。对此有什么解决方案?
答案 0 :(得分:3)
您正在插入原始二进制垃圾。这将自然地(和半随机地)包含SQL元标记,如'
。这意味着您的查询容易受到sql injection attacks的攻击。</ p>
您不会显示任何实际的PHP代码,但您应该使用预准备语句,或者手动转义,例如。
$stmt = mysqli_prepare($conn, "INSERT .... (password_hash) VALUES (?)");
$stmt->execute(array($raw_hash));
或
$quoted = mysql_real_escape_string($raw_hash);
$sql = "INSERT ... (password_hash) VALUES ('$quoted')";
或者,您可以编码该哈希字符串,例如使用base64,以便编码的哈希变成一个相对无害的字符串。但即使这样,你也应该使用正确的查询构造技术。