Что мне нужно уйти при отправке запроса? - PullRequest
19 голосов
/ 05 августа 2008

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

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

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

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

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

Ответы [ 11 ]

8 голосов
/ 05 августа 2008

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

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

2 голосов
/ 05 августа 2008

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

--
1 голос
/ 05 августа 2008

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

Отличный учебник по PDO включен в книгу Основные советы, уловки и хаки PHP Anthology 101 от Davey Shafik и др. 2nd Ed . Делает обучение бризом и отлично в качестве справки. Мне даже больше не нужно думать ни о чем, кроме настоящего SQL-запроса.

0 голосов
/ 14 октября 2008

В запросе MySQL при использовании LIKE также обязательно экранируйте символы "_", поскольку он не экранирован mysql_real_escape_string.

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 14 августа 2008

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

0 голосов
/ 05 августа 2008

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

0 голосов
/ 05 августа 2008

В 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 голосов
/ 05 августа 2008

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

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

0 голосов
/ 05 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...