Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как делается SQL иньекция?
 
 автор: Lenux   (12.11.2005 в 07:25)   письмо автору
 
 

Есть скрипт:

<?php
mysql_query
('SELECT * FROM my_table WHERE t_id="'.$_GET['MY'].'"');
?>

Его как то можно ломануть? А то сколько не пролбовал, дырки залеплять получается, а ломать нет:))

   
 
 автор: Shorr Kan   (12.11.2005 в 08:54)   письмо автору
 
   для: Lenux   (12.11.2005 в 07:25)
 


<?php 
mysql_query
("SELECT * FROM my_table WHERE t_id='".mysql_escape_string($_GET['MY'])."'"); 
?> 


а лучше:


<?php 
$my
=mysql_escape_string($_GET['MY']);
mysql_query("SELECT * FROM my_table WHERE t_id='$my'"); 
?> 

   
 
 автор: инжекшэн   (12.11.2005 в 13:48)
 
   для: Shorr Kan   (12.11.2005 в 08:54)
 

Хорошо... В догонку вопрос ...
Как избавится от иньекций подобного рода и почему запрос становится уязвимым? Давайте в пример возьмем запросы которые нам предоставил: Shorr Kan

   
 
 автор: DDK   (12.11.2005 в 21:13)   письмо автору
 
   для: инжекшэн   (12.11.2005 в 13:48)
 

Прогонять все заносимые в базу переменные через функцию mysql_escape_string() (http://www.softtime.ru/dic/id_dic=96&id_group=2):

$str = mysql_escape_string($str);

   
 
 автор: cheops   (12.11.2005 в 23:29)   письмо автору
 
   для: инжекшэн   (12.11.2005 в 13:48)
 

Нужна структура таблицы чтобы это продемонстрировать - этот запрос позволяет например подставить вместо имени пользователя его пароль... Избавится можно так, как описал DDK.

   
 
 автор: Atom   (12.11.2005 в 10:40)   письмо автору
 
   для: Lenux   (12.11.2005 в 07:25)
 

А зачем ломать? ХаЦкер типа?

   
 
 автор: Lenux   (12.11.2005 в 13:32)   письмо автору
 
   для: Atom   (12.11.2005 в 10:40)
 

Нет просто лучше что бы понять как защищаться лучше на учиться и ломать:), так знать куда лучше перспективы смотреть:)

   
 
 автор: cheops   (12.11.2005 в 12:00)   письмо автору
 
   для: Lenux   (12.11.2005 в 07:25)
 

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

PS Вопросы, посвящённые MySQL лучше сразу размещать в разделе MySQL

   
 
 автор: Lenux   (13.11.2005 в 07:39)   письмо автору
 
   для: cheops   (12.11.2005 в 12:00)
 

Ладно хорошо допустим есть в таблице поля tid, t_name, надо везде сменить t_name значения t_name, допустим на "ПиВо" :)

   
 
 автор: cheops   (13.11.2005 в 14:01)   письмо автору
 
   для: Lenux   (13.11.2005 в 07:39)
 

Инъекции не всесильны, вот если у вас в таблице пароли имелись бы, которые не выводились бы - их можно было бы вывести, а заменить, что-то вряд ли получится. К инъекции в подавляющем большинстве случаев обращаются чтобы выяснить пароли. Во многих Web-приложениях пароль администратора для доступа к аккаунту является одновременно и паролем к системе администрирования, попадая в систему администрирования можно ещё что-то узнать, исследовать внутренние страницы, загружать файлы и т.п.

   
 
 автор: coloboc66   (14.11.2005 в 10:57)   письмо автору
 
   для: cheops   (13.11.2005 в 14:01)
 

А мне непонятно- как вообще можно сделать sql-запрос постороннему человеку, если эти запросы делаются с серверной стороны?

   
 
 автор: cheops   (14.11.2005 в 15:26)   письмо автору
 
   для: coloboc66   (14.11.2005 в 10:57)
 

Через строку запроса
http://www.mysite.ru/index.php?my=-1%20UNION%20SELECT%20*%20FROM%20userslist%20WHERE%20id_user%20=%202

В результате чего переменная my или элемент $_GET['my'] принимают значение
-1 UNION SELECT * FROM userslist WHERE id_user = 2

после подставновки которого в SQL-запрос смысл последнего кардинально меняется.

   
 
 автор: Tomcat   (15.11.2005 в 15:49)   письмо автору
 
   для: cheops   (14.11.2005 в 15:26)
 

Cheops, а если данные передаются методом Post, допустим - есть форма следующего вида :
<form action = handler.php method = post>
Имя поль-ля: <input type = text name = name><br>
Пароль: <input type = password name = pass><br>
<input type = submit value = Отправить>
</form>

//===== обработчик handler.php =======
<?php
include "config.php";
$query = "SELECT * FROM users WHERE name = '$_POST[name]' AND pass = '$_POST[pass]' ";
$usr = mysql_query($query);
if (!usr) exit ("Oшибка в sql-запросе");
if (mysql_num_rows ($usr) >0)
{
echo "<br>"."Вход в защищенную область";
}
?>

Что необходимо ввести в поля формы чтобы всегда входить в защищенную область ?

   
 
 автор: cheops   (15.11.2005 в 22:37)   письмо автору
 
   для: Tomcat   (15.11.2005 в 15:49)
 

А какая структура таблицы? Это зависит от того сколько полей в таблице...

   
 
 автор: coloboc66   (24.11.2005 в 12:21)   письмо автору
 
   для: cheops   (15.11.2005 в 22:37)
 

А зачем вообще используют GET, если есть POST?

   
 
 автор: Loki   (24.11.2005 в 12:25)   письмо автору
 
   для: coloboc66   (24.11.2005 в 12:21)
 

Для передачи данных от ользователя серверу.

   
 
 автор: cheops   (24.11.2005 в 13:33)   письмо автору
 
   для: coloboc66   (24.11.2005 в 12:21)
 

POST не удобно пользоваться, например если страница открывалась бы только POST данным, а все ссылки на темы выглядили бы как http://www.softtime.ru/forum/read.php - на них не возможно было бы ссылаться и переходить из поисковых систем...

   
 
 автор: Loki   (24.11.2005 в 12:28)   письмо автору
 
   для: cheops   (13.11.2005 в 14:01)
 

хм... а если, например, так:

' UNION UPDATE users SET pass='новый пароль или хэш' WHERE name='admin';

и вуаля! У вас есть пароль от админской части...

   
 
 автор: coloboc66   (24.11.2005 в 14:17)   письмо автору
 
   для: Loki   (24.11.2005 в 12:28)
 

А что такое UNION?

   
 
 автор: cheops   (25.11.2005 в 00:04)   письмо автору
 
   для: coloboc66   (24.11.2005 в 14:17)
 

Оператор SQL который объединяет результаты двух SELECT запросов в одну результирующую таблицу.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования