WEB хаккинг
#1
Отправлено 05 January 2009 - 17:17
Первый вопрос: может здесь есть какой спец который посоветует что мне сделать:
есть допустим такая переменная ( $_REQUEST['r'] = 'someApp/SomeAlias/Id' ) которая идет в класс маршрутизатора где эксплойдится и т.п. и т.д. Как обезапасить себя от того чтобы некая сволочь не запихнула чего в эту доступную строку чтобы у меня скажем не произошла какаянить сказлажопина)
#2
Отправлено 05 January 2009 - 17:56
есть допустим такая переменная ( $_REQUEST['r'] = 'someApp/SomeAlias/Id' ) которая идет в класс маршрутизатора где эксплойдится и т.п. и т.д. Как обезапасить себя от того чтобы некая сволочь не запихнула чего в эту доступную строку чтобы у меня скажем не произошла какаянить сказлажопина)
Все очень просто: нужно так не делать.
Любые, абсолютно любые данные, пришедшие из untrusted source, должны восприниматься, как потенциально вредоносные.
http://xkcd.com/327/
Сообщение отредактировал listener: 05 January 2009 - 17:56
#3
Отправлено 05 January 2009 - 18:17
' " `и т.п.)
#4
Отправлено 05 January 2009 - 18:24
#5
Отправлено 05 January 2009 - 18:25
#6
Отправлено 05 January 2009 - 18:57
#7
Отправлено 05 January 2009 - 19:27
Сообщение отредактировал fesor: 05 January 2009 - 19:30
#8
Отправлено 05 January 2009 - 19:58
#9
Отправлено 05 January 2009 - 20:16
$request = strip_tags( $_REQUEST['r'] ) if( isset( $_REQUEST['page'] ) AND is_numeric( $_REQUEST['page'] ) ) $page=$_REQUEST['page']; //сия функция на основе правил маршрутизации выесняет что надо запустить, проверяет данные на валидность и выдает массив переменных //вализация идет по паттернам типа [A-Za-z0-9_\-] $vars = router::match_route( $request ); //Загрузка аппликейшена self::loadApp( $vars['app'] ); //вызов функции аппликейшена self::run( $vars['method'], $vars['params'] );... чесно говоря роутер единственный компонент системы который контактирует с данными из урла, а поскольку он независит от системы и все данные парсит перед передачей - думаю трудно чего-то плохого сделать через нее.
p.s. мой способ правда небольшие ограничения дает на возможные данные пересылаемые через УРЛ но посути ничего больше чем латиница и цыферки неодлжно передаваться...
Сообщение отредактировал fesor: 05 January 2009 - 20:22
#10
Отправлено 05 January 2009 - 20:44
#11
Отправлено 07 January 2009 - 20:29
#12
Отправлено 07 January 2009 - 21:59
#13
Отправлено 08 January 2009 - 05:34
#14
Отправлено 08 January 2009 - 08:19
Для меня, например, вот такой регекс имеет среднюю сложность:
$this->LONGREGEXP = "/(". "\xa5\xa5.*?\xa5\xa5|".($this->object->GetConfigValue("allow_rawhtml")==1?"\<\#.*?\#\>|":""). "\(\?(\S+?)([ \t]+([^\n]+?))?\?\)|". ($this->object->GetConfigValue("disable_bracketslinks")==1?"": "\[\[(\S+?)([ \t]+([^\n]+?))?\]\]|\(\((\S+?)([ \t]+([^\n]+?))?\)\)|" ). "\^\^\S*?\^\^|vv\S*?vv|". "\n[ \t]*>+[^\n]*|". "<\[.*?\]>|". "\+\+\S\+\+|\+\+(\S[^\n]*?\S)\+\+|". "\b[[:alpha:]]+:\/\/\S+|mailto\:[[:alnum:]\-\_\.]+\@[[:alnum:]\-\_\.]+|\?\?\S\?\?|\?\?(\S.*?\S)\?\?|". "\\\\\\\\[".$object->language["ALPHANUM_P"]."\-\_\\\!\.]+|". "\*\*[^\n]*?\*\*|\#\#[^\n]*?\#\#|\№\№[^\n]*?\№\№|\'\'.*?\'\'|\!\!\S\!\!|\!\!(\S.*?\S)\!\!|__[^\n]*?__|". "\xA4\xA4\S\xA4\xA4|\xA3\xA3\S\xA3\xA3|\xA4\xA4(\S.*?\S)\xA4\xA4|\xA3\xA3(\S.*?\S)\xA3\xA3|". "\#\|\||\#\||\|\|\#|\|\#|\|\|.*?\|\||". "<|>|\/\/[^\n]*?(?<!http:|https:|ftp:|file:|nntp:)\/\/|". "\n[ \t]*=======.*?={2,7}|\n[ \t]*======.*?={2,7}|\n[ \t]*=====.*?={2,7}|\n[ \t]*====.*?={2,7}|\n[ \t]*===.*?={2,7}|\n[ \t]*==.*?={2,7}|". "[-]{4,}|---\n?\s*|--\S--|--(\S.*?[^- \t\n\r])--|". "\n(\t+|([ ]{2})+)((?:\[|\()([-= xX.+]|(%1?[0-9]{1,2}%))(?:\)|\]))[^\n$]*(?=\n|$)|". // |(1?[0-9]{1,2}) "\n(\t+|([ ]{2})+)(-|\*|([a-zA-Z]|([0-9]{1,3}))[\.\)](\#[0-9]{1,3})?)?|". "\b[[:alnum:]]+[:][".$object->language["ALPHANUM_P"]."\!\.][".$object->language["ALPHANUM_P"]."\-\_\.\+\&\=\#]+|". "~([^ \t\n]+)|". ($this->object->GetConfigValue("disable_tikilinks")==1? "":"\b(".$object->language["UPPER"].$object->language["LOWER"].$object->language["ALPHANUM"]."*\.".$object->language["ALPHA"].$object->language["ALPHANUM"]."+)\b|"). ($this->object->GetConfigValue("disable_wikilinks")==1? "":"(~?)(?<=[^\.".$object->language["ALPHANUM_P"]."]|^)(((\.\.|!)?\/)?".$object->language["UPPER"].$object->language["LOWER"]."+".$object->language["UPPERNUM"].$object->language["ALPHANUM"]."*)\b|"). ($this->object->GetConfigValue("disable_npjlinks")==1? "":"(~?)".$object->language["ALPHANUM"]."+\@".$object->language["ALPHA"]."*(?!".$object->language["ALPHANUM"]."*\.".$object->language["ALPHANUM"]."+)(\:".$object->language["ALPHANUM"]."*)?|".$object->language["ALPHANUM"]."+\:\:".$object->language["ALPHANUM"]."+|"). "\n)/sm";
Он большой, но в нем практически не встречаются сложные конструкции (отслеживание контекста и т.д.)
(Если интересно, это правленный мной один из трех регексов wacko-форматтера).
В твоем же случае, перемешиваются страницы, ЧПУ и действия.
Обычно делается проще: внутри системы, странице назначается ID. Снаружи, она видна под некоторым путем (и может быть видна под ID). Соответствие пути и ID хранится в базе (или в любом другом хранилище данных).
Получив путь, мы получаем из базы id (предварительно, возможно, вытащив из него какую-либо дополнительную информацию, например, действие). Все укладывается в десять строчек (с запасом), при этом половина "криминальных" действий (например, зайти "куда-то не туда") невозможна в силу организации информации. Еще процентов десять всех атак проваливаются по той причине, что URL не имеет ничего общего с реальной организацией информации.
#15
Отправлено 09 January 2009 - 19:21
p.s. единственное место в урле откуда я беру информацию - $_REQUEST['r']; Ничто больше неиспользуется.
------------------
а так вот структура приложения:
контроллер:
class PagesController { function showPage($name) { if( ($data = model::execute( 'get_page', array('name'=>$name) ) ) !==false ) { //Даем возможность шаблонизатору скомпилить кэш и указываем исключения view::setCacheable( array('views') ); //view::setCacheLifeTime( '3600' ); //Шаблонизатор парсит шаблон)) view::make( 'page', $data ); //Connect Comments core::loadAPP( 'comments' ); //Запускаем функцию для вывода комментов где надо с 1-ой страницы core::run( 'show_comments', array( 'pages', $data['id']['val'], 1 ) ); } else { view::error( 'No page found! Please, kill yourself against the wall!' ); } } }
поскольку нам ненадо ничего обрабатывать в этом приложении класса модели нету, хватит мэппера
модели или мэпперы
;get_page.ini table = pages resources = id, title, page, views, coms [id] system=true [name] system=true value=ctrl.name
Сообщение отредактировал fesor: 09 January 2009 - 21:36
#16
Отправлено 18 April 2009 - 19:18
#17
Отправлено 01 January 2010 - 13:27
#18
Отправлено 25 April 2010 - 09:29
=install§ion=install&do=acphelp?
#19
Отправлено 25 April 2010 - 18:22
case 'acphelp':
$this->_stepCount = 11;
$this->install_acphelp();
break;
case 'other':
$this->_stepCount = 12;
$this->install_other();
break;
case 'caches':
$this->_stepCount = 13;
$this->install_caches();
break;
а вообще, скорее всего у тебя криво сломанная версия просто. поищи другую что ли
Сообщение отредактировал Lego: 25 April 2010 - 18:24
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных