Что мне нужно избежать при отправке запроса?
Когда вы выполняете SQL-запрос, вам нужно очистить строки, или пользователи могут запускать вредоносный SQL на вашем веб-сайте.
У меня обычно есть функция escape_string (blah), которая:
- Заменяет escapes (
\
) двойными экранами (\\
).
- Заменяет одиночные кавычки (
'
) с помощью одиночной кавычки (\'
).
Это адекватно? В моем коде есть дыра? Есть ли библиотека, которая может сделать это быстро и надежно для меня?
Я хотел бы видеть изящные решения в Perl, Java и PHP.
Ответы
Ответ 1
Для обеспечения максимальной безопасности, производительности и правильности используйте подготовленные операторы.
Вот как это сделать с большим количеством примеров на разных языках, включая PHP:
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
Ответ 2
Я бы тоже избежал комментариев (двойная тире)
--
Ответ 3
В PHP очень полезно использовать PDO. Требуется много догадок, связанных с защитой вашего SQL (и всего вашего SQL-материала в целом). Он поддерживает подготовленные заявления, которые в значительной степени способствуют пресечению вторжений SQL Injection.
В книгу включен большой праймер на PDO Антология PHP 101 Основные советы, хитрости и хаки от Дейви Шафика и т.д. 2-й редактор, Делает учебу ветерок и отлично подходит для справки. Мне даже больше не нужно думать ни о чем другом, кроме фактического SQL-запроса.
Ответ 4
Какой язык используется? Похоже, что почти все они имеют встроенные функции escape-выхода SQL, которые лучше использовать.
Например, PHP mysql_real_escape_string и addslashes.
Ответ 5
Вам лучше использовать подготовленные заявления с заполнителями. Вы используете PHP,.NET... в любом случае, подготовленные операторы будут обеспечивать большую безопасность, но я мог бы предоставить образец.
Ответ 6
В PHP я использую этот, и я буду благодарен за каждый комментарий:
function quote_smart($valeur)
{
if (get_magic_quotes_gpc())
$valeur = stripslashes($valeur);
if (!is_numeric($valeur))
$valeur = mysql_real_escape_string($valeur);
return $valeur;
}
$IdS = quote_smart($_POST['theID']);
$sql = "
SELECT * FROM Students
WHERE IdStudent={$IdS};
";
Требуется еще одно подтверждение, если поле может быть NULL:
$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';
if(is_null($picture))
$p = 'NULL';
else
$p = "'".quote_smart($picture)."'";
$IdS = quote_smart($theidyouwant);
$requete = "SELECT * FROM Students
WHERE IdStudent={$IdS} AND
PictureStudent={$p} AND
NameStudent='{$Name}';
";
Это ему нравится!
(надеюсь, что почта будет правильно отправлять символы подчеркивания, а не # 95;)
Ответ 7
Используйте подготовленные/параметризованные запросы!
Ответ 8
API MySQL C имеет собственный mysql_escape_string()
. Использовать его или его эквивалент было бы лучше.
Ответ 9
Используйте подготовленные операторы.
Ответ 10
В запросе MySQL при использовании LIKE также избегайте символа "_", поскольку он не экранируется mysql_real_escape_string.
Для справки, здесь
Ответ 11
Я не уверен, поддерживает ли MySql параметризованные запросы, если это так, вы должны приложить усилия, чтобы пройти этот маршрут. Это гарантирует, что пользовательский ввод не сможет сделать ничего злонамеренного.
В противном случае некоторые "плохие" символы в дополнение к тому, что вы упомянули, будут точкой с запятой (;) и комментариями (- и /* */).