Сведения о вопросе

Solllo

16:03, 1st July, 2020

Теги

mysql   oracle   security    

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

Просмотров: 542   Ответов: 11

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

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

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

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

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



  Сведения об ответе

PIRLO

18:03, 1st July, 2020

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

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


  Сведения об ответе

padenie

18:03, 1st July, 2020

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

--


  Сведения об ответе

P_S_S

18:03, 1st July, 2020

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

Отличный букварь по PDO включен в книгу The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2-е изд . Делает обучение легким ветерком и отлично подходит в качестве эталона. Мне даже не нужно больше думать ни о чем, кроме собственно запроса SQL.


  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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


  Сведения об ответе

piter

18:03, 1st July, 2020

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

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


  Сведения об ответе

LIZA

18:03, 1st July, 2020

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


  Сведения об ответе

9090

18:03, 1st July, 2020

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


  Сведения об ответе

crush

18:03, 1st July, 2020

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


  Сведения об ответе

padenie

18:03, 1st July, 2020

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


  Сведения об ответе

Chhiki

18:03, 1st July, 2020

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

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


  Сведения об ответе

SKY

18:03, 1st July, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться