[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Защита гостевой книги
Sopromatenot
Всем привет. Начал переделывать гостевую книгу с файлов на SQL и задался вопросами безопасности.

За основу файловой гостевухи было взято: http://irbis-team.com/15/5

Проблема в том что я сам не могу понять как надо составить текст в полях формы, чтоб моя гостевая книга рухнула. Ктонибудь может показать "плохой" запрос чтоб сработал? <_<

Вот так выглядит кусок отправки в базу:


...
$m_dt = date('Y.m.d [H:i:s]');
$m_ip = $_SERVER["REMOTE_ADDR"];
$sql = "INSERT INTO gb(username, dt, message, user_ip) VALUES ('$username', '$m_dt', '$message', '$m_ip')";
$r = mysql_query($sql);
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
...



Вот так выглядит кусок вывода из базы:


...
$name = htmlspecialchars($row['username']);
$message = bb_tags($row['message'], 'normal');
$date = $row['dt'];
...



----------------

Я уже прочитал креплёную тему в этой ветке про безопасность и поюзал чутка функцию mysql_real_escape_string. Мне неочень нравится что она мне напихивает слешов в текст, но если это даёт защиту, то бог с ним.

А вот так планирую защитится:

$m_username = mysql_real_escape_string($username);
$m_message = mysql_real_escape_string($message);
$m_dt = mysql_real_escape_string(date('Y.m.d [H:i:s]'));
$m_ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]);
$sql = "INSERT INTO gb(username, dt, message, user_ip) VALUES ('$m_username', '$m_dt', '$m_message', '$m_ip')";




Спустя 8 минут, 10 секунд (16.03.2012 - 13:10) m4a1fox написал(а):
Ну так вроде все нормально.... делайте дальше. smile.gif

Спустя 6 минут, 26 секунд (16.03.2012 - 13:16) Sopromatenot написал(а):
Эт то понятно. Просто по сути этот код:


...
$m_dt = date('Y.m.d [H:i:s]');
$m_ip = $_SERVER["REMOTE_ADDR"];
$sql = "INSERT INTO gb(username, dt, message, user_ip) VALUES ('$username', '$m_dt', '$message', '$m_ip')";
$r = mysql_query($sql);
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
...



подвержен SQL-inj, и мне чисто ради расширения кругозора интересно как имено его можно атаковать. Сам я попытался, но ничего не вышло. Тоесть либо гдето идёт защита (хотя я смотрел, ненашёл), либо у меня руки крюки, что тоже не исключено )

Или если же он защищен то применять mysql_real_escape_string уже вроде и не к чему... что с трудом верится.

Спустя 1 минута, 7 секунд (16.03.2012 - 13:17) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 12:02)
Мне неочень нравится что она мне напихивает слешов в текст, но если это даёт защиту, то бог с ним.

В базу слеши не попадают, экранирование нужно для формирования корректной строки sql запроса. Причем нужно это не только для безопасности, но и вообще для нормальной работы с БД. Если у тебя в базу пихаются слеши, значит включен magic qutes pgc, их как раз и нужно отключить.

Спустя 22 минуты, 4 секунды (16.03.2012 - 13:39) Sopromatenot написал(а):
В htaccess выставлено php_flag magic_quotes_gpc Off.

Как раз после использования защиты в виде обработки фун-й mysql_real_escape_string слеши заносятся в базу. Мне казалось что так и должно происходить... покрайней мере мой код делает имено так.

Спустя 15 минут, 12 секунд (16.03.2012 - 13:55) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 12:39)
В htaccess выставлено php_flag magic_quotes_gpc Off.

Как раз после использования защиты в виде обработки фун-й mysql_real_escape_string слеши заносятся в базу.

значит htaccess не отрабатывает, убедись что они отключены
echo get_magic_quotes_gpc() ? 'magic quotes влючены' : 'magic quotes вылючены';

Спустя 7 минут, 51 секунда (16.03.2012 - 14:02) Sopromatenot написал(а):
Ой, точно. У меня Денвер и в винде не разрешают делать файл без имени в проводнике.
Передалал тоталом.

Да, теперь не заносятся smile.gif

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

Спустя 14 минут, 12 секунд (16.03.2012 - 14:17) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 13:02)
А что с запросом? Как будет выглядить запрос чтоб моя гостевая книга (без защиты, первоначальная версия кода) повела себя не так как должна?

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

Спустя 9 минут, 47 секунд (16.03.2012 - 14:26) Sopromatenot написал(а):
А, удалось испортить запрос вписав ', 'k
Но мне кажется нереально в даном случае сделать чтото с базой не видя код. Максимум это будет ошибка в запросе и в базу ничего не пойдёт.

Всем спасибо, разобрался болеменее smile.gif

Спустя 2 минуты (16.03.2012 - 14:28) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 13:26)
Но мне кажется нереально в даном случае сделать чтото с базой не видя код. Максимум это будет ошибка в запросе и в базу ничего не пойдёт.

ошибаешься, еще как можно smile.gif

Спустя 36 минут, 34 секунды (16.03.2012 - 15:05) johniek_comp написал(а):
Sopromatenot
а ты выложи, мы поломаем, и увидишь что можно сделать не видя кода smile.gif

Спустя 12 минут, 48 секунд (16.03.2012 - 15:18) Sopromatenot написал(а):
Я верю )

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

Вот например я предполагал что достаточно в поле вставить:

inj','1','2','3')";//

и тогда выполнится запрос:

$sql = "INSERT INTO gb(username, dt, message, user_ip) VALUES ('inj','1','2','3')";//$username', '$m_dt', '$message', '$m_ip')";


Но ничего не выполняется. Запись не происходит. Хотя если написать так в файле php то работает.

Спустя 1 минута, 39 секунд (16.03.2012 - 15:19) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 14:18)
Но ничего не выполняется. Запись не происходит. Хотя если написать так в файле php то работает.

нужно обрезку делать sql, а не php комментарием (--)



Спустя 10 минут, 5 секунд killer8080 написал(а):
Вот например, как может выглядеть атака на твой код. Здесь мы крадем пароль админа, или его хеш user posted image
$message = "',NULL),(NULL, NULL, (SELECT password FROM users WHERE login='admin'), NULL)-- ";
$sql = "INSERT INTO gb(username, dt, message, user_ip) VALUES ('$username', '$m_dt', '$message', '$m_ip')";


UPD запятую пропустил

Спустя 27 минут, 25 секунд (16.03.2012 - 15:47) Sopromatenot написал(а):
У меня там нет паролей, всего 4 поля )

Всёравно чтото не проходит. (--) тож чтото не пашет, хот так, хоть сяк ph34r.gif

Спустя 14 минут, 43 секунды (16.03.2012 - 16:02) killer8080 написал(а):
Цитата (Sopromatenot @ 16.03.2012 - 14:47)
У меня там нет паролей, всего 4 поля )

это я для примера привел
Цитата (Sopromatenot @ 16.03.2012 - 14:47)
Всёравно чтото не проходит. (--) тож чтото не пашет, хот так, хоть сяк

должен быть пробел после --

Спустя 16 минут, 36 секунд (16.03.2012 - 16:18) Sopromatenot написал(а):
О, теперь работает. Спасибо smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.