2010-01-26 3 views
3

Итак, я прочитал статью о инъекции SQL и был пример:SQL Injection и два запроса

SELECT * FROM table_name WHERE smth = 'x'; 
UPDATE table_name SET smth ='[email protected]' WHERE user = 'admin'; 

Почему он не работает? Или это старая статья, и в наши дни такой же вздор? Итак, как хакеры обновляют mysql? Спасибо.

+0

Ваш вопрос не совсем ясен. Вы пытаетесь получить помощь по использованию SQL-инъекции на веб-странице? – Younes

+4

Что вы спрашиваете? – SLaks

+1

Не знаю, каков был исходный запрос, как будет работать инъекция. Посмотрите мой ответ здесь http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain/332367#332367, который, по мнению некоторых людей, является хорошим объяснением того, как это работает. Что касается вашей конкретной статьи, не могу ответить, почему она «не работает». – Will

ответ

2

Большинство сайтов в настоящее время используют параметризованный SQL - не встроенный SQL. Ситуация будет иметь место выше, если, например, там был разобран, встроенный SQL, похожее на следующее:

непараметризированным Псевдо

string sql = "SELECT * FROM table_name WHERE smth='" + UserInput + "'"; 
ExecuteSql(sql); 

... где UserInput определяет элемент на веб-сайте.

Вместо добавления действительных данных в поле UserInput, вы добавляете,

UserInput = '';DROP table_name; 

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

Параметрированные утверждения исключают возможность SQL-инъекции, поскольку вы не можете изменить структуру запроса, вставив логику в подпись.

Если вы попытались установить поле UserInput в неправильный запрос, но на сайте были использованы параметры в инструкции, вам не повезло.

Параметризованные Псевдо:

Adapter proc; 
proc.StoredProcedure = "GetUserNames" 
proc.AddParameter("@USER",UserInput); 
proc.Execute(); 

... а @USER теперь равен буквальный "'\; DROP table_name;", которым SQL будет относиться как обычный ола' параметр.

+0

Мой вопрос на самом деле: SELECT * FROM table_name WHERE smth = 'x'; UPDATE table_name SET smth ='[email protected] 'WHERE user =' admin '; Почему этот запрос не работает? –

0

Это зависит от того, как вы выполняете приведенный выше код.

Многие языки кода имеют выделенные классы связи с базой данных, которые вы можете снабжать параметрами sql вместо конкатенированных строк.

Риск в SQL-инъекции заключается в том, чтобы забыть о некотором пользовательском вводе в запросе, что позволяет выполнить неверные запросы.

0

Идея атак внедрения SQL заключается в следующем:

У меня есть сайт, который давайте пользователям поиск информации о животных. Типы пользователей в имени животного, то он работает:

select * from animals where name = '$[what the user typed in]'; 

так, если они типа овец, запрос будет выглядеть так:

select * from animals where name = 'sheep'; 

Однако, что если они введут в: `овца» ; капля животных? Если я просто скопирую то, что они набрали в запросе, и запустил его, я запустил:

select * from animals where name = 'sheep'; drop table animals; 

что было бы плохо.

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

0

DB 101 предупреждает о SQL-инъекции, поэтому большинство разработчиков в эти дни знают об этом и предотвращают его. Это чаще всего делается с помощью какого-то подготовленного оператора, где ваши параметры вводятся с помощью механизма, который предотвращает выполнение произвольного SQL. Ленивое программирование может по-прежнему приводить к уязвимостям, и они там, конечно, но слепое динамическое построение SQL реже и реже.

0

Атаки SQL-инъекций возможны, когда у вас есть запрос «шаблоны», и вам нужно ввести пользовательский ввод, чтобы заполнить часть запроса. Например, вы можете иметь PHP скрипт, который делает что-то вроде этого:

<?php 
$smth_value = $_POST["smth"]; // some form field 
$smth_user = $_POST["user"]; // some other form field 
$smth_email = $_POST["email"]; // yet another form field 

$sql1 = "SELECT * FROM table_name WHERE smth = '".$smth_value."'"; 
$sql2 = "UPDATE table_name SET smth ='".$smth_email."' WHERE user = '".$smth_user."'"; 

mysql_query($sql1); 
mysql_query($sql2);  
?> 

Если индивидуум знал структуру моего стола (или понял это как-то), они могут «впрыснуть» SQL в мои запросы посевочный SQL в поля формы, в результате чего мои строки переменных SQL выглядят как два действительных запроса, разделенных точкой с запятой. Например, кто-то может ввести в «SMTH» форма поля что-то вроде:

';DELETE FROM table_name WHERE 1=1 OR smth=' 

, а затем $ SQL1 бы в конечном итоге выглядит как:

SELECT * FROM table_name WHERE smth = '';DELETE FROM table_name WHERE 1=1 OR smth='' 

... и там идет все данные из table_name.

Вот почему в PHP есть функции, такие как mysql_escape_string, чтобы защищать строки от таких атак. Если вы знаете, что переменная должна быть числом, наведите ее на число. Если у вас есть текст, оберните его в функцию экранирования строки. Это основная идея о том, как защищаться.