|
|
|
| Есть почти доделанный каталог на PHP+MySQL
Хотелось бы услышать несколько авторитетных мнений насчет уязвимости скрипта, да и любая конструктивная критика только приветствуется.
Адрес http://vladik.info/autocatalog/
Логин и пароль для входа в секцию продавцов - test
Можно ломать все, что сломается, только с условием - скажете, где дырка.
Заранее спасибо всем за участие, а авторам - еще разок за учебные пособия
(поскольку первый мой опыт по переделке PHP-скриптов).
Особенно интересует момент по импорту CSV-файлов. Нельзя ли их подменять чем-нибудь пакостным? | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 20:13)
| | Есть маленький баг :-)
На ScreenShort-е видно, что можно сделать с сайтом :-)
Я перешел в меню "Поиск товаров" и набрал
"><script>alert(document.cookie)</script>
и получил нужный мне результат. Представьте вместо этой строки можно написать целый JavaScript :-) Вы забыли проверять на наличие спец символов, думаю будет уместно посоветовать прочесть статью:
http://www.softtime.ru/info/articlephp.php?id_article=35 | |
|
|
|
|
|
|
|
для: Flash5
(13.05.2005 в 20:48)
| | Только в поиске? Или больше не проверяли? | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 21:01)
| | Не только в поиске, я попытался сделать и в названиях товаров но там все чисто, на данный момент больше ничего подозрительного не заметил :-) | |
|
|
|
|
|
|
|
для: Flash5
(13.05.2005 в 21:07)
| | Вот поиск-то я и переделывал конкретно, видно, пропустил где-то обработать... | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 21:01)
| | Если не секрет, а как нтм код скрывал? | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 20:13)
| | 1) Зря на видном месте логин и пароль для входа продавцов, пользователь видит это и в отчаянье уходит с сайта, так как у него нет логина и пароля (я чуть не ушёл), кнопка вход в каталог совсем не воспринимается так как для входа в каталог обычно не требуется ничего нажимать, ты просто приходишь и тебе сразу предоставляется топ-лист из 10 наиболее популярных товаров и ссылки на катологи - ничего нажимать не нужно и дополнительных услий не требуется. В общем вход отпугивает людей, особенно если им не очень нужно входить и они могут обратиться к дургому сайту.
2) Никто на совесть вас ломать не будет, так как стимула нет, вот если вы структуру базы данных предоставите, тогда можно будет порыться и попробовать поискать дырки. Только вы сами прекрасно понимаете, пока структуру никто не знает ваше Web-приложение находится в относительной безопасности, так как структура открыта - его следует чистить на совесть, поэтому я не призываю вас выкладывать структуру :))) | |
|
|
|
|
|
|
|
для: cheops
(13.05.2005 в 21:19)
| | 1. Рассчитано на тех, кому будет нужно входить, я сам такой, и началось все с того, что я потерял два часа времени, сидя на телефоне и обзванивая все разборки насчет того самого бампера, чуть кони не бросил. Хотя, конечно, надо будет вход как guest сделать автоматом, а для продавцов перенести на отдельную страничку.
Тут я, пожалуй согласен. Просто переделываю же не свое :)
2. Тут, конечно, ничего толком не понял, видно, Вы несколько завысили для себя мои способности PHP программиста - очень лестно :), но общий смысл ясен.
И еще все-таки, вот сижу пробую обработать переменную с помощью регулярных выражений прямо из статьи по безопасности, пока не выходит что-то. | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 21:43)
| | 1. Тогда можно вот как поступить, поставить редирект
<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='15; URL=catalog.php'>
</HEAD></HTML>
|
Этот HTML-код переправит посетителя на страницу catalog.php через 15 секунд после загрузки. Таким образом, тому кому необходима кнопка нажмут её, а те, кто к кнопке не привык будут перенесены автоматически. | |
|
|
|
|
|
|
|
для: cheops
(13.05.2005 в 21:57)
| | Так ведь а сессия же, при нажатии ж переменные отправляются...
Тут не, видно надо будет автоматом сессию открывать всем как для guest, а потом дать возможность пройти по ссылке на страничку входа для продавцов (попутно закрыв сессию), и пусть уже там по-новой логинятся.
Однако ж, что-то я уже в другую степь подался. Хотя тоже нужно дорабатывать. | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 22:11)
| | Сессия может передавать через сессионные куки - тут всё нормально. К тому же вы можете и параметры указать в данной конструкции
<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='15; URL=catalog.php?SID=<?= SID ?>'>
</HEAD></HTML>
|
| |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 21:43)
| | 2) Здесь я имел ввиду, что взлом Web-приложений написанных с использованием MySQL начинается с определения структуры базы данных: сколько таблиц, как они называются, какие в них поля, затем следует второй этап - непосредственно взлом. Первый этап очень трудоёмок и длителен, к тому же он может привести к тому, что код окажется очень крепким и структура ничего не даст. Эту трудоёмкую работу делать никто не будет, так как долго, да и мозги и большинства присутствующих в другую сторону повёрнуты - на созидание. Если вы описываете названия таблиц, полей можно непосредственно переходить ко второму этапу тестирования - что будет, если злоумышленник получит структуру база данных - какие у него появляются возможности по взлому вашего Web-приложения. С одной стороны заманчиво открыть структуру, но тогда и злоумышленику ничего делать не понадобится так как структура будет известна, а дыры мы можем найти не все.
PS А что за переменная и как обрабатываете - давайте вместе составим регулярное выражение? | |
|
|
|
|
|
|
|
для: cheops
(13.05.2005 в 22:04)
| | 2. Да мне бы не жалко хоть весь дамп базы, да это уж сильно круто, не казино, в самом деле.
ЗЫ. Да запрос этот поисковый. Я пока тупо взял с вашей статьи вот это
$username = preg_replace("/[a-z0-9]/i", "", $_GET['username']);
(только у меня $title) и даже не разбирался
Значит, по-порядку(поправьте меня, если что)
1)отправляется запрос - имеем $HTTP_VARS['title'], по крайней мере скрипт не с $_GET работает (в чем, кстати, разница?)
2)имеется extract($HTTP_VARS) - если правильно понял, то получаем на выходе $title ?
3)надо $title обработать | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 22:19)
| |
<?
if(!(preg_match("/^([a-z0-9]*)$/i", trim($title))))
{
exit("вы использовали запрещенные символы");
}
?>
|
| |
|
|
|
|
|
|
|
для: JIEXA
(13.05.2005 в 22:43)
| | Если форма отправляетя методом пост, то данные нужно извлекать из суперглобального массива $_POST если методом гет, то из суперглобального массива $_GET | |
|
|
|
|
|
|
|
для: JIEXA
(13.05.2005 в 22:45)
| | Так вот и интересно, если из HTTP_VARS, то это что, ошибка? или просто устаревшее, но еще рабочее? | |
|
|
|
|
|
|
|
|
для: JIEXA
(13.05.2005 в 22:43)
| | Ага, сработало, только надо ж еще добавить и для них, для русских... | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 22:48)
| | вот так:
<?
if(!(preg_match("/^([а-яa-z0-9]*)$/i", trim($title))))
{
exit("вы использовали запрещенные символы");
}
?>
|
| |
|
|
|
|
|
|
|
для: JIEXA
(13.05.2005 в 22:51)
| | спасибо, и как бы еще пробел добавить туда... | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 23:02)
| | Попробуйте так:
<?
if(!(preg_match("/^([а-яa-z0-9 ]*)$/i", trim($title))))
{
exit("вы использовали запрещенные символы");
}
?>
|
| |
|
|
|
|
|
|
|
для: JIEXA
(13.05.2005 в 23:06)
| | Ok, на первый взгляд работает, еще одно спасибо :)
Ну, пора баиньки, у нас 6.30 утра, однако :) | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 23:11)
| | А насчет импорта нехороших файлов кто что может сказать? | |
|
|
|
|
|
|
|
для: Ivan
(14.05.2005 в 06:40)
| | Нужно проверить, чтобы скрипт не засобачили, если через него загрузят скрипт - с системой всё что угодно можно делать - обычно именно так и получают информацию о структуре базы и содержимом PHP-файлов.
<?
// Проверяем, не является ли файл скриптом PHP или Perl, html, если это так
// преобразуем его в формат .txt
$extentions = array(".php",".phtml",".php3",".html",".htm",".pl");
// Извлекаем из имени файла расширение
$ext = strrchr($_FILES['attach']['name'], ".");
// Формируем путь к файлу
if(in_array($ext, $extentions))
{
// Если расширение запрещено, изменяем его на txt
// чтобы нельзя было выполнить
$path="files/$id_theme-".date("YmdHis",time()).".txt";
}
else
$path="files/$id_theme-".date("YmdHis",time()).$ext;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(14.05.2005 в 13:01)
| | 1. Ну, расширения-то можно ставить только CSV (и DIF, кажется), но вот если за них спрятать что-нибудь этакое... Я потому, собственно, и спрашивал, нет ли у кого такого скриптика на примете, чтоб попробовать его просунуть под CSV-расширением, и что из этого выйдет.
2. Насчет redirect проблема решается легко, все равно у меня идет перенаправление с index на login.php, так что могу подставить туда любую страницу или тот же login.php, но уже как авторизованный guest. Это снимается. | |
|
|
|
|
|
|
|
для: Ivan
(14.05.2005 в 16:57)
| | Ну по идее, сервер настроен так, что не должен исполнять текстовые файлы (скармливать их интерпретатору). Можете сами попробовать загрузить любой скрипт. Если у него будет расширение txt, то просто отобразится его текст. | |
|
|
|
|
|
|
|
для: Ivan
(14.05.2005 в 16:57)
| | Ну тогда можно строго проверять, чтобы расширение было csv, опасность существует только если происходит автоматическая интерпретация файла как скрипта. | |
|
|
|
|
|
|
|
для: cheops
(14.05.2005 в 23:11)
| | Значит, в этом месте можно быть относительно спокойным. Не думаю, что на сервере CSV забили как расширение для скрипта.
PS Кстати, последовав совету, переправил немного скрипт, теперь никаких паролей и кнопок на первой странице, а посетитель сразу авторизован как guest.
И уж затем, идя по ссылке для продавцов (автоматом закрывая сессию), можно снова авторизоваться как продавец.
Вот интересно, скрипт себе голову не свернет, если сразу несколько посетителей войдут как guest, потом кто туда, кто сюда... | |
|
|
|
|
|
|
|
для: Ivan
(13.05.2005 в 20:13)
| | Неплохо :)
Я тоже думал над такой штукой, но потом отказался - времени нет потянуть.
Для удобства неплохо- сразу при входе дать разбивку по городам и маркам-моделям (бампер-то нужен от Короллы и во Владике, к примеру - зачем все-то копать).
Потом можно фишку сделать - уведомление зарегистрированного юзера о появлении в каталоге нужной детали. (я не смотрел подробно, может и есть она где-то) | |
|
|
|
|
|
|
|
для: denvor
(16.05.2005 в 12:45)
| | Насчет моделей, это сильно, знаете скока их, родимых. Я вот когда в выпадающем меню страну родную ищу (среди всех ихних штатов :)) - очень сильно матерюсь.
Насчет городов - проблемов нет, но каталог пока что задумывался именно для Владика, если уже раскрутится, то будем подумать.
Насчет уведомления - мысль понравилась, не знаю, будет ли востребована (в смысле, полезна юзерам), и пока не думал как осуществлять такой наворот.
Если есть бесплатные идеи - буду весьма обязан. | |
|
|
|