我正在使用以下代码对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);
?>


但是,当我尝试将生成的盐插入数据库时​​,在某些情况下会发生此错误:

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


我认为这是因为生成了无法识别的字符。有什么解决方案?

最佳答案

您正在插入原始二进制垃圾。这自然会(半随机)包含SQL元字符,例如'。这意味着您的查询容易受到sql injection attacks的攻击。

您没有显示任何实际的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,这样编码后的散列就变成相对无害的字符串。但是即使那样,您也应该使用适当的查询构造技术。

关于php - SHA256盐与PHP和MySQL-插入错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27193461/

10-11 12:43
查看更多