MYSQL Injection и md5 шифрование - PullRequest
1 голос
/ 12 августа 2011

Если я зашифрую инъекцию MYSQL с помощью md5, она все равно будет выполняться? Если я зашифрую инъекцию MYSQL до того, как сделаю «mysql_real_escape_string», сможет ли она обнулить инъекцию mysql? Должен ли я запустить «mysql_real_escape_string» перед шифрованием?

Ответы [ 5 ]

2 голосов
/ 12 августа 2011

Функция md5() возвращает строку, содержащую символы ASCII 0-9 и a-f. Внедрение SQL требует использования таких символов, как ' или ", поэтому хешированная строка, сгенерированная md5 (), никогда не вызовет SQL-инъекцию, учитывая, что алгоритм работает ожидаемым образом.

Таким образом, вы можете написать что-то вроде этого без беспокойства:

$username = mysql_real_escape_string( $_POST['username'] );
$password = md5( $_POST['password'] );
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'");

Но рекомендуется всегда избегать данных, которые вы передаете в свой запрос с помощью mysql_real_escape_string () .

1 голос
/ 12 августа 2011

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-инъекциями таково: не пытайтесь узнать, что безопасно, а что нет, предположите, что все небезопасно, и относитесь ко всему как к небезопасному.Если вы рассматриваете безопасное значение как небезопасное, программа все равно будет работать правильно, если вы рассматриваете небезопасное значение как безопасное, ваша программа будет содержать огромную дыру в безопасности, и достаточно одной ошибки.

1 голос
/ 12 августа 2011

MD5-хэшированные значения - это двоичные данные, которые представлены в шестнадцатеричном формате в php.Это означает, что они содержат только цифры 0..9 и буквы A..F.С этими буквами SQL-инъекции невозможны, поэтому вы в безопасности.

1 голос
/ 12 августа 2011

Если вы хэшировали значение с помощью MD5, оно больше не содержит вредоносных символов для инъекций. MySQL не будет декодировать хеш MD5 и интерпретировать / выполнять его как SQL. Фактически, хеш MD5 не может быть декодирован, так как это односторонний алгоритм.

0 голосов
/ 14 августа 2011

Хотя обычно хеш-значения md5 нельзя использовать в атаках с использованием инъекций, стоит указать, что raw хеш-значения md5 можно использовать.Необработанные хеши md5 - это хеши, сгенерированные с помощью md5($userSubmittedValue, true) - они уязвимы, потому что вывод представляет собой строку, которая может содержать не шестнадцатеричный вывод. Хотя генерация хешей в необработанном виде не распространена, важно отметить, что технически хешированные значенияможет использоваться в атаках с использованием инъекций.

Вот пример того, как это можно сделать:

http://cvk.posterous.com/sql-injection-with-raw-md5-hashes

Как уже указывалось другими, шестнадцатеричный вывод md5не уязвим для инъекционных атак.

...