Подтвердить что ты не робот

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

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

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

  • Заменяет escapes (\) двойными экранами (\\).
  • Заменяет одиночные кавычки (') с помощью одиночной кавычки (\').

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

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

4b9b3361

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

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