Что мне нужно избежать при отправке запроса?

Когда вы выполняете SQL-запрос, вам нужно очистить свои строки, иначе пользователи могут выполнить вредоносный SQL-запрос на вашем веб-сайте.

Обычно у меня есть функция escape_string (blah), которая:

  • Заменяет escape-символы ( \) на двойные escape-символы ( \\).
  • Заменяет одинарные кавычки ( ') на экранированную одинарную кавычку ( \').

Это адекватно? Есть ли в моем коде дыра? Есть ли библиотека, которая может сделать это быстро и надежно?

Я хотел бы видеть изящные решения на Perl, Java и PHP.

Ответов (11)

Решение

Для максимальной безопасности, производительности и правильности используйте подготовленные операторы. Вот как это сделать с множеством примеров на разных языках, включая PHP:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Я бы также избегал комментариев (двойное тире)

--

Используйте подготовленные заявления.

В запросе MySQL при использовании LIKE также убедитесь, что вы экранировали символы «_», так как mysql_real_escape_string не экранирует его.

Для справки проверьте здесь

Какой язык используете? Похоже, что почти все они имеют встроенные escape-функции SQL, которые было бы лучше использовать.

Например, PHP имеет mysql_real_escape_string и addslashes .

Лучше использовать подготовленные операторы с заполнителями. Используете ли вы PHP, .NET ... в любом случае подготовленные операторы обеспечат большую безопасность, но я мог бы предоставить образец.

Используйте подготовленные / параметризованные запросы!

Отличная вещь для использования в PHP - это PDO . При работе с безопасностью вашего SQL (и всего вашего SQL в целом) требуется много догадок. Он поддерживает подготовленные операторы, которые имеют большое значение для предотвращения атак с использованием SQL-инъекций.

Отличный учебник по PDO включен в книгу Дэйви Шафика и т . Д. « Основные советы, хитрости и хитрости PHP Антология 101», 2-е изд . Делает обучение легким и прекрасным в качестве справочного материала. Мне даже не нужно больше думать ни о чем, кроме самого SQL-запроса.

В 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;)

Я не уверен, поддерживает ли MySql параметризованные запросы, если да, вам следует приложить усилия, чтобы пойти по этому пути. Это гарантирует, что вводимые пользователем данные не могут сделать ничего вредоносного.

В противном случае некоторые «плохие» символы в дополнение к тому, что вы упомянули, были бы точкой с запятой (;) и комментариями (- и / * * /).

у MySQL C API есть свой собственный mysql_escape_string() . Лучше всего использовать его или его эквивалент.