Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 17:55   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию SQL-инъекция

Разбираю SQL-инъекции и защиты от них. Подключился к БД:
Код:
<?php
	//Адрес сервера MySQL
	$dblocation = 'localhost';
	//Имя базы на хостигше или локальной машине
	$dbname = 'wet';
	//имя пользователя базы данных
	$dbuser = 'root';
	//и его пароль
	$dbpassword = "";
	
	//Устанавливаем соединение с базой нанных
	$dbcnx = @mysql_connect($dblocation, $dbuser, $dbpassword);
	if(! $dbcnx)
		exit("<P>В настоящий момент сервер базы данных недоступен, 
		поэтому корректное отображение страницы невозможно</P>");		
	echo "1";
	//Выбираем базу данных
	if(! @mysql_select_db($dbname, $dbcnx))
		exit("<P>В настоящий момент сервер базы данных недоступен, 
		поэтому корректное отображение страницы невозможно</P>");
	echo "1";
	/*Устанавливаем кодировку соединения. Следует выбрать
	ту кодировку, в которой данные будут отправляться MySQL-серверу*/
	mysql_query("SET NAMES 'cp1251'");
	echo "1";
?>
этот код находится на http://localhost/config.php/
Потом дописываю до:
http://localhost/config.php/'SELECT * FROM userlist'
после нажатия Entr просто происходит преобразование:
http://localhost/config.php/'SELECT%...ROM%20userlist'
Пробелы меняются на %20 и ничё не отображается(((
Просто хотелось бы понять как эти инъекции-таки делаются (походу я что-то не так сделал) и как от них кроме mysql_real_escape_string() и ей подобных защищаться
Dimarik вне форума Ответить с цитированием
Старый 17.07.2010, 18:01   #2
spein
Программист
Форумчанин
 
Аватар для spein
 
Регистрация: 27.02.2009
Сообщений: 505
По умолчанию

Обучать инъкциям никто не будет. Принцип таков: при помощи дыры (недостаточной фильтрации данных) в получении запроса сервером происходит ошибка, которую злоумишленник использует по своему желанию.

PHP код:
...
mysql_query("SELECT * FROM users WHERE id='".$_GET[id]."'");
... 
Тоесть если мы передаем цифровой ид - все отображается отлично (SELECT * FROM users WHERE id='2'), в случае передачи продолжения запроса, например передадим "' UNION SELECT * FROM secrets", то получится строка "SELECT * FROM users WHERE id='' UNION SELECT * FROM secrets" при помощи чего мы получим все значения из таблицы secrets

Тоесть для защиты, например цифрового параметра, мы должны на сервере сказать, что данная переменная есть формата int.
PHP код:
...
$id intval($_GET[id]);
... 
there are no limits when you're software engineer
spein вне форума Ответить с цитированием
Старый 17.07.2010, 18:02   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Причём результат отображения страниц http://localhost/config.php/ и http://localhost/config.php/'SELECT * FROM userlist' одинаков.
Ради эксперимента написал
http://vkontakte.ru/'SELECT%20*%20FROM%20users'. В результате было написано NOT FOUND (я канеш не пытался ломануть дурова а просто проверял как это дело работает=))
Возникают следующие вопросы:
1. Правильно ли я делаю SQL-инъекцию
2. Почему на локальном хосте после такой же неудачной инъекции всё0таки что-то отобразилось (то же самое что и на странице до инъекции) и контакт выдал NOT FOUND
3. Экранирование защищает от инъекций, который вводятся в поля ввода. например в имя пользователя и пароль. А ведь инхекции ещё могут и в строку ввода url вводиться, как от них защититься?
Dimarik вне форума Ответить с цитированием
Старый 17.07.2010, 18:05   #4
SOKOJI
Новичок
Джуниор
 
Регистрация: 17.07.2010
Сообщений: 1
По умолчанию

На счет преобразования - используй urldecode().

На счет инъекций - они используются в том случае, когда в твой скрипт поступают данные из форм, или же из адресной строки, и КОГДА эти данные в нем ИСПОЛЬЗУЮТСЯ. Т.е. если ты не используешь в скрипте $_GET или $_POST, например, (к ним же относятся и куки, и некоторые переменные из $_SERVER), то ничего фильтровать не надо.

Главное, чтобы у тебя не было "голых" конструкций:
Код:
$str = $_GET['query'];
UPD:
По 3му вопросу - экранируй все полученные данные, не важно откуда они пришли. Из форм - это POST, из адресной строки - GET. Тут уже надо лучше понимать принцип работы серверных языков.

Последний раз редактировалось SOKOJI; 17.07.2010 в 18:07.
SOKOJI вне форума Ответить с цитированием
Старый 17.07.2010, 19:29   #5
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Это вообще не инъекция.
Инъекция - это когда мы подменяем передаваемые на сервер опасными окончаниями SQL-запросов. У вас нет передаваемых параметров и запрос полный.
Если Вам интересен вопрос по sql-инъекциям и вообще безопасности, то советую прочитать книгу Кузнецова М. "Головоломки на php для хакеров".
Защита от инъекций простая - фильтрация на запрещенные символы и экронирование при помощи mysql_real_escape_string.
Виталий Желтяков вне форума Ответить с цитированием
Старый 17.07.2010, 20:39   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ну я прочитал пол-книги Флёнова "PHP глазами хакера", дошёл до инъекций - он БД хреново описал, начал Кузнецова "Практика создания web-сайтов" вот уже 5ю главу про безопасность читаю=)
Dimarik вне форума Ответить с цитированием
Старый 17.07.2010, 22:44   #7
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Флёнов "PHP глазами хакера" - книга хорошая в плане описания общей защиты сервера, про скрипты там довольно плохо описано.
Кузнецов "Практика создания web-сайтов" - безопасность он там поверхностно просматривает.
Лучше возьмите Кузнецова М. "Головоломки на php для хакеров" - там про безопасность скриптов достаточно подробно написано, много примеров, книга достаточно новая.
Виталий Желтяков вне форума Ответить с цитированием
Старый 19.07.2010, 23:57   #8
MrJenika
Форумчанин
 
Аватар для MrJenika
 
Регистрация: 07.09.2009
Сообщений: 361
По умолчанию

Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
Лучше возьмите Кузнецова М. "Головоломки на php для хакеров" - там про безопасность скриптов достаточно подробно написано, много примеров, книга достаточно новая.
Хотел спросить тех кто читал эту книгу : она подойдёт для новичка?
( т.е. есть только базовые знания и понятия синтаксиса)
А то куплю,а потом придётся держать её на полке до поры до времени,а там авось и что-то лучше выйдет.
Хотелось бы именно книгу основанную на примерах, а не сухую теорию.
MrJenika вне форума Ответить с цитированием
Старый 20.07.2010, 08:42   #9
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Хотел спросить тех кто читал эту книгу : она подойдёт для новичка?
Для новичка, который знает базовый синтаксис, она подойдет. Книга в общем построена на простых примерах объясняющих сложные понятия. Хорошо рассмотрены вопросы безопасности и ряд прикладных задач.
Виталий Желтяков вне форума Ответить с цитированием
Старый 20.07.2010, 16:06   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

MrJenika, лучше покупай Кузнецова ПРАКТИКА СОЗДАНИЯ WEB-САЙТОВ. всё очень подробно и понятно описано.
Dimarik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
sql или не sql Diamand SQL, базы данных 9 18.09.2008 17:17
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15