2011-08-12 3 views
1

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

+1

Что вы подразумеваете под шифрованием инъекции? У вас есть пример? – Vache

+1

Следует, вероятно, упомянуть, что вы явно рассматриваете PHP-решение, как тег или сам вопрос. – bdares

ответ

2

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

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

$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().

+0

См. Обычно я делаю это, используя «sprintf()», а затем mysql_real_escape_string в качестве второго параметра запроса. Не знал, могу ли я избежать поддержки md5, но, похоже, мне не нужно беспокоиться об этом, если они не могут использовать его злонамеренно, когда он закодирован. –

+0

«Хорошая практика» заключается в том, чтобы избежать всех непроверенных данных. Возврату MD5 можно доверять. Избегание всех данных без дискриминации приводит к двум проблемам: 1. экранирование - это не всегда способ дезинфекции данных (мыслить числа) 2. Не обычная вещь, но вы можете столкнуться с проблемой «двойного выхода». – Mchl

+0

@Mchl: ** Все ** данные ненадежны, потому что они обрабатываются самой ненадежной сущностью - программистом. Вот почему это хорошая практика, чтобы избежать всех данных, которые вы передаете в ваш SQL-запрос. – Dor

1

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

+0

Так оно и было спроектировано, но оно не так сильно, как предполагалось. – bdares

1

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

1

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

В специальном случае один класс переменных, который не может вызвать инъекцию (MD5'd пароли), тогда у вас особый случай другой (например, вещи, оцененные целыми числами), тогда вы забудете, что должно быть экранировано, а какие нет, вы в конечном итоге с одной маленькой незначительной незначительной переменной, которую следует избегать, но это не так, и никто из вашей команды не видит этого. К сожалению, в вашем коде есть реальная уязвимость.

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

0

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

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

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

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