Когда вы выполняете запрос SQL, вам нужно очистить строки, иначе пользователи могут выполнить вредоносный SQL на вашем сайте.
У меня обычно просто есть функция escape_string (бла), которая:
- Заменяет escape-символы (
\
) на двойные escape-символы (\\
). - Заменяет одинарные кавычки (
'
) на экранированные одинарные кавычки (\'
).
Это адекватно? Есть ли дыра в моем коде? Есть ли библиотека, которая может сделать это быстро и надежно для меня?
Я хотел бы видеть изящные решения в Perl, Java и PHP.
Для максимальной безопасности, производительности и правильности используйте подготовленные заявления. Вот как это сделать с помощью множества примеров на разных языках, включая PHP:
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
Какой язык используете? Кажется, что почти все они имеют встроенные функции escape SQL, которые лучше использовать.
Например, PHP имеет mysql_real_escape_string и addslashes .
Я также избежал бы комментариев (двойная черта)
--
Вам лучше использовать готовые заявления с заполнителями. Используете ли вы PHP, .NET ... в любом случае, подготовленные операторы обеспечат большую безопасность, но я мог бы привести пример.
Я не уверен, поддерживает ли MySql параметризованные запросы, если это так, вы должны приложить усилия, чтобы пойти по этому пути. Это гарантирует, что пользовательский ввод не может сделать что-либо вредоносное.
В противном случае некоторые «плохие» символы в дополнение к тому, что вы упомянули, будут точкой с запятой (;) и комментариями (- и / * * /).
В 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;)
Отличная вещь для использования в PHP - это PDO . Требуется много догадок для защиты вашего SQL (и всех ваших SQL-компонентов в целом). Он поддерживает подготовленные операторы, которые имеют большое значение для предотвращения атак SQL-инъекций.
Отличный учебник по PDO включен в книгу «Дэйви Шафик, Дэйви Шафик» и др. 2-е изд . Делает обучение бризом и отлично в качестве справки. Мне даже больше не нужно думать ни о чем, кроме настоящего SQL-запроса.
Используйте подготовленные / параметризованные запросы!
MySQL C API имеет свой собственный mysql_escape_string()
. Использовать его или его эквивалент было бы лучше всего.
Используйте готовые заявления.
В запросе MySQL, при использовании LIKE, также убедитесь, что экранированы символы «_», поскольку он не экранирован mysql_real_escape_string.
Для справки, проверьте здесь
Replaces escapes () with double escapes (\).