MD5-хэшированные значения сами по себе не могут вызвать SQL-инъекцию, но если вы пытаетесь избежать SQL-инъекции, ваш подход - очень хороший способ вызвать one.
Youособый случай - один класс переменных, которые не могут вызвать инъекцию (пароли MD5), затем вы особый случай - другой класс (например, вещи, вычисленные как целые числа), затем вы забываете, что следует экранировать, а что нет, в результате вы получите один маленькийкрошечная незначительная переменная, которую нужно экранировать, но это не так, и никто из вашей команды не замечает ее ... Ой, в вашем коде есть реальная уязвимость.
Вы избегаете экранирования одного безопасного класса, избегаете экранирования второго безопасного класса, а затем ошибочно полагаете, что третий класс также безопасен - оказывается, MD5 был в двоичной кодировке, и кому-то удалосьнайти способ создать инъекцию с его помощью ... Упс ... У вас есть еще одна реальная уязвимость в вашем коде.
Вы должны:
1) Всегда использовать параметризованные запросы.Это делает побег ненужным и избегает риска забыть что-то избежать.Используйте mysqli
и bind_param
:
$stmt = $db->prepare('insert into users (username, password) values (?, ?)');
$stmt->bind_param('ss', $name, md5($password));
$stmt->execute();
2) Если по какой-то причине вы не можете, избегайте всего.Даже если это не нужно.Вы не хотите что-то забыть.
Правило борьбы с SQL-инъекциями таково: не пытайтесь узнать, что безопасно, а что нет, предположите, что все небезопасно, и относитесь ко всему как к небезопасному.Если вы рассматриваете безопасное значение как небезопасное, программа все равно будет работать правильно, если вы рассматриваете небезопасное значение как безопасное, ваша программа будет содержать огромную дыру в безопасности, и достаточно одной ошибки.