Сегодня зашел на freelance-сайт. Было задание, перенести сайт c bbPress на IPB. Стало интересно, что это за зверь такой, bbPress... Вошел на сайт, где стоит этот форум (исходников еще не качал). Насторожило, что когда нажал на "Зарегестрироваться" в строке браузера появилось: Ага. Добавил в user значение Admin - принял, отобразил в качестве value для текстового поля. Идем дальше. Далее ввел в качестве имя такого зверя HTML: " onmouseover = "alert('Hi');" Самое удивительное - он его принял. Теперь при наводе на поле мне вылезает окошко с алертом И еще вылезла ошибка: Т.е что мы идеем: а) XSS (межсайтовый скриптинг) б) SQL-инъекцию И это только через 40 секунд просмотра... Еще я узнал название таблицы и поле логина. Вроде бы разработкой занималась достаточно раскрученная команда - WordPress. А оказалось решето... Разочарован. Ощущение, что разработкой занимались люди, абсолютно не знающие основы веб-безопасности...
Как ни странно, некоторые популярные проекты на самом деле решето... Например, PHP-Nuke... Хотя вроде и живут уже достаточно времени, но дыры латаются абы как...
Clone Сейчас, если не ошибаюсь, PHP-Nuke не так популярен. На постсоветском пространстве наиболее распространены DLE (нуленная ), Drupal, Joomla, самописные. А в качестве движка блога каждый 3-ий использует WordPress... )
Меня прикалывает, что куча питонистов использует ненавидимый вордпресс, написанный на ненавистном пхп, что бы писать в блоге, какой питон хороший а пхп плохой )
Elkaz Тоже ковырялся там . Даже ифреймы принимает на ура. Только не верится мне что так оно в самом движке. Скорее всего чудо-программисты "протюнинговали".
Чему вы удивляетесь ? Это жизнь, такие проекты всегда будут делать ламеры, так как чем больше денег есть на раскрутку тем меньше остаётся на программистов.
Установил исходный движок. Там всё тип топ. Владельцы наняли программиста из разряда "Начал изучать РНР. Прикольно". Дали задание ему добавить к стандартным несколько полей при регистрации. Тот, не мудрствуя лукаво, сделал как в примере в той книге, не копаясь в исходниках ББпреса и не используя его средства. Интересно, сколько запалатили ему.
А сами как программируете? Просто у меня с давних времен привычка осталась - при получении данных, записывать их в отдельную переменную, потом работать только с ней. Напрямую с REQUEST никогда не работал А у вас есть какие-то наработки, которые вы используете всегда при разработке приложений? Имеется ввиду именно наработки, касаемые обработки данных, пришедших от пользователя З.ы И отключаете ли вы при релизе сайта дебаггинг? Т.е or die (mysql_error()) - присутствует или нет?
1. Фильтрация POST, GET переменных только при работе, то есть нафиг фильтровать POST, если с ним не работаешь. Значения POST тож не меняю, а выглядит это у меня вроде mysql_escape_string($_POST['name']) 2. QuickForm, класс для работы с бд, сами всё фильтруют. 3. Отключаю показ ошибок, а строк or die (mysql_error()) у меня и в помине нет. Они убираются сразу же после того, как проверено, что вызов запроса будет происходить корректно.
Clone А поля, где не должно быть html/js кода как обрабатываешь? )) Дай глянуть что-нибудь из проектов
Раньше был специальный класс, который с бб-кодами и прочим работал, но перестал нравиться, так что в неторопливом поиске замены.
Я когда учился программировать, работал только с REQUEST, а точнее c extract() и регистр_глобалс вкл. - потому что движок к которому писал дополнения (сиречь, на нём учился) был так построен. Сейчас все GET фильтруются, все HTTP_* у SERVER фильтруются. Все данные заносятся только через POST на котором стоит чекер форм. А к базе я через DbSimple он в основном и фильтрует. Ну GET это GET, а POST это POST - никаких REQUEST (но ещё и потому что у меня на неймспейсы фетиш ). Код (Text): or die (mysql_error()) Подобного никогда, слава богу, не было. Все ошибки, данные дебага и т.д. собираются в кучку и выводяться только при желании и только Тем, Кто Знает Как Вывести.
lexa Как в IPB? =) В строку браузера выводится debug=1? =) Под REQUEST я подразумевал любые данные от юзверя (cookie, post, get). Сейчас надеюсь с выключенными globals Можно глянуть пример? Всегда интересно узнать что-то новое
Не, указывается в настройках и для групп пользователей с абсолютными правами. Я так и понял. Просто охватить весь список суперглобальных лениво. Session туда же. Фетишировать на неймспейс нельзя, когда $var это и $_POST['var'], и $_GET['var'], и т.д. Я потом сюда выложу линк (в "Решения, алгоритмы"). Пока неудобно как-то. Хочется доделать движок и сайтов на нём поклепать. В движке есть Идея, ради которой всё и затевалось, но как на практике будет работать и будет ли - вопрос. Нужно самому увериться, Эго простимулировать.
+1 Редко когда возникают ситуации, когда один и тот же ключ находится в POST и GET вообще стараюсь везде префиксы указывать register_name register_email ... login_name login_password Так удобнее. lexa Движком поделишься?)))))) Поковыряться)