2015-06-23 3 views
2

Это просто любопытство. Если вы зашифруете пароль (используя sha1 или другие методы), прежде чем вставлять его в запрос, его все равно нужно очистить? Или результат хэша всегда безопасен?Хешированный пароль должен быть дезинфицирован?

Этот простой код безопасен?

$salt = "123xcv"; 
$password = $_POST['password']; 
$password = sha1($password+$salt); 

$query = "select * from user where password='$password'"; 
+1

Вывод команды 'sha1' не выполняется непосредственно в любом месте, так как это всего лишь строка шестнадцатеричных цифр. Актом использования функции «sha1» является «дезинфекция». –

+3

Используйте функцию [password_hash()] (http://www.php.net/manual/en/function.password-hash.php), алгоритмы SHA * слишком быстр для хэш-паролей и поэтому могут быть слишком грубыми. Функция password_hash() вернет кодированный хеш и не сможет использоваться для SQL-инъекции. – martinstoeckli

ответ

1

Если вы не подтвердили ввод как-то, вы не должны предполагать, что он будет всегда возвращает безопасный вывод, потому что функции, такие как SHA1, могут возвращать значения ошибок, если заданы неожиданные ввод. Например:

echo '<?php echo sha1(''); ?>' | php 
Warning: sha1() expects at least 1 parameter, 0 given in - on line 1 

И этот выход явно нарушает предположение, что «это всегда шестнадцатеричная строка». Другие функции хеширования на других языках могут представлять еще одно поведение.

Кроме того, схема выше пароля код хэширования ($password = sha1($password+$salt);) является очень слабо (see why), и я бы настоятельно рекомендуем не использовать его даже в качестве примера, как кто-то в конце концов гарантированно найти его на StackOverflow и использовать в производство.

Кроме того, как уже отмечалось выше, построение SQL-запросов путем объединения строк также является плохой практикой и может привести к проблемам безопасности в будущем: сегодня единственным параметром в запросе будет пароль, завтра кто-то решит добавить другое вариант, и я уверен, что они не будут переписывать запрос, а просто используют шаблон, который уже существует ...

0

От the documentation:

Значение возвращается в виде строки из 40 шестнадцатеричных цифр, или NULL, если аргумент был равен NULL.

Предполагая, что у вас есть достаточно большая колонка varchar, у вас нет никакой санитарии.

Это, как говорится, всегда полезно использовать prepared statements, нет причин просто конкат строк для создания запросов.

2

Этот вопрос с вопросом о вводе в sql задан из общего заблуждения.

На самом деле нет такой вещи, как «санитария» вообще или какая-либо функция для выполнения такой несуществующей задачи. Также нет «безопасных» или «небезопасных» данных. Все данные являются «безопасными», если вы выполняете простые правила.

Не говоря уже о том, что у программиста есть гораздо более важные вещи, о которых следует помнить, кроме случаев, когда какой-либо конкретный фрагмент данных «безопасен» в определенном контексте.

Что вам нужно, заключается в том, чтобы избежать необработанного SQL для таких глупых запросов на всех, используя ORM для запуска SQL для вас. Хотя в таких редких случаях, когда вам действительно нужно запускать сложный запрос, вы должны использовать заполнители, чтобы заменить каждой переменной в вашем запросе.

Смежные вопросы