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

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

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

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

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

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

5.08.2008 18:45:46
должно быть, что-то пошло не так в отображении обратной косой черты, в строкеReplaces escapes () with double escapes (\).
bart 14.10.2008 06:49:44
11 ОТВЕТОВ
РЕШЕНИЕ

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

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

8
23.05.2017 12:00:28

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

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

0
5.08.2008 18:46:41

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

--
2
5.08.2008 18:46:45

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

0
5.08.2008 18:48:23

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

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

-1
5.08.2008 18:49:58

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

0
5.08.2008 19:21:49

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

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

1
5.08.2008 19:28:29

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

0
5.08.2008 19:55:12

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

0
21.01.2014 06:32:58

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

0
16.09.2008 21:14:00

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

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

0
14.10.2008 04:57:04