Я использую следующий код для соли и хэширования паролей в базе данных 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 инъекций.
Вы не показываете свой настоящий 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, чтобы закодированный хеш стал относительно безвредной строкой. Но даже тогда вы должны использовать правильные методы построения запросов.
Других решений пока нет …