Долго думал где лучше разметить эту тему. Полностью подходящего форума нет, а этот подходит только отчасти, хотелось бы кончено, чтобы тебя была в максимально посещаемом форуме, но что есть то и съедим . Я планирую в ближайшее время выпустить релиз данного программного продукта, и посмотреть что из этого выйдет. Соответственно есть желание провести максимально полное тестирование функциональных возможностей и безопасности проекта. Конечно же платить за каждый выявленный баг я не в состоянии, но отлично понимаю, что финансовая стимуляция необходима . Вобщем я гарантирую (в пределах бюджета тестирования) оплату всех ошибок влияющих на безопасность проекта. Бюджет тестирования 1000 баксов (больше не готов, к тому-же если будет больше то это плохой знак). Тестирование будет проводиться в течении месяца, с момента создания ЭТОЙ темы. Подробности и условия оплаты здесь: http://ccsis.com/ru/topic9.htm Спасибо всем, кто примет участия в тестировании!
dark-demon, реврайты вроде примитивные, возможно директиву RewriteEngine стоит убрать, если включено по умолчанию. Или просто отключить оптимизацию в админцентре.
вообще, очень сыро... если я не авторизован и пытаюсь создать тему - вываливается форма логина, которая не работает. если нажать на "войти", то логинишься нормально. где там у тебя включается вывод ошибок php? Код (Text): $SQL = "SELECT a.mod_id,a.parent_id,a.mod_name,a.mod_data,a.description,a.is_hidden,a.is_semi_hidden,b.mod_id,b.parent_id,b.mod_name,b.description,b.is_hidden,b.is_semi_hidden,a.req_page_lib,a.req_authorisation,a.is_guest_allow,b.is_activ FROM `%1\$s_modules` a LEFT JOIN `%1\$s_modules` b ON(b.mod_id = a.parent_id) WHERE a.is_activ = 1"; думаю тут не помешало бы разбить строку на несколько... Код (Text): $aTree = array(array($row[0],$row[1],$row[2],$row[4],$row[5],$row[6],1),array($row[7],$row[8],$row[9],$row[10],$row[11],$row[12],$row[16])); magic numbers?
dark-demon 1. По поводу оптимизации ссылок, я бы разобрался в причине, но не имею возможности, т.к. проблеме на твоей машине а не на моей. Вот если бы ты докапался до причины и дал рекомендации по устранению -), вот это было бы здорово. У меня никаких проблем с модреврайтом нету. Может он у тебя отключен? В стандартном дистрибутиве по умолчанию оптимизация ссылок отключена (я исхожу что у клиента нет модреврайта). Просто дистрибутив демоверсии собран для работы на сервере с известными настройками и свойствами, соответственно я могу на них рассчитывать и использовать. 2. Сыро и должно быть Можно подробнее про форму логина при создании темы? У меня подозрения, что ты пытаешся наделить процедуру создания темя функциональностью, которой она не обладает. При создании темы не авторизованным пользователем, просто появляется дополнительное поле для ввода имени пользователя. Причём, в случае совпадения (или высокой степени "похожести") имени пользователя с именем одного из зарегистрированных пользователей должна выводиться ошибка. Так задумано, может быть даже работает. -) 3. Конфигурационная переменная номер 105, раздел конфигурирования админцентра. Но она должна быть включена, так как дистрибутив демоверсии сгенерирован с включённым режимом отладки (на сервере демоверсий автоматически собираются журналы ошибок). Есть одно но, варнинги пишутся в журнал ошибок без вывода на экран. На экран выводится подробная информация о критических ошибках. Поищи в корне файлы с именем *error.txt 4. В этом SQL запросе объединены всего 2 таблицы. Он простой и понятный, не вижу смысла разбивать его на строки. Я обычно разбиваю на строки запросы из 4-х и более объединений или со сложной логикой. 5. Ну это маленький хак в построении дерева Если кратко, это не для того чтобы читали, это для того чтобы работало
1. да, похоже у меня реально реврайт отвалился... 2. не знаю что там задумано, но происходит описанное выше. 3. опция включена, файл с ошибками не появляется. я так понял ты по любому варнингу показываешь белую страницу? 4. sql - это недоязык? почему ты не пишешь, например, Код (Text): class Timer{function Timer(){$this->start = explode("",microtime());}function current_time(){$curr = explode(" ",microtime());return $curr[1] - $this->start[0] - this->start[1] + $curr[0];}} - тоже ведь всё просто и понятно... 5. дык так и появляются магические числа потому, что тому, кто их пишет очень хочется соптимизировать, но совершенно наплевать, что кому-то потом в этом копаться...
dark-demon 2. сейчас проверю. 3. белого экрана не должно быть вообще, я не понимаю в чём дело, может у тебя ПХП сконфигурирован не отображать Fatal error-ы? В данный момент найдена она критическая ошибка (опечатка в имени функции). 4. я вынужден признать, что делаю така как удобно мне, не подумав о тех кто будет читать мой код. - 5. это ядро движка, оно должно быть оптимизировано (в данном случае сэкономлен 1 SQL запрос). В модулях администрирования и не очень активно используемых компонентах код без подобных хаков. 6. не понял шутки. Данная конструкция работает корректно. Ты мог столкнуться с тем, что подобный адрес не работает в
Провёл проверки по второму пункту. Ничего похожего на описанное не нашёл. Обнаружил несколько ошибок, сейчас буду обновлять дистрибутивы.
бугога ничего не делал, но сейчас фильтр урлов совсем отвалился - пропускает даже с протоколом javascript... ps: а ты в пятом пхп тестировал? pps: я не говорил, что ошибки ко мне просто липнут? ppps: ща попробую последнюю версию...
видимо что-то у тебя не так с регуляркой в check_is_url - так всегда бывает, когда пишешь сложные вещи в одну строку например, такой код проходит: Код (Text): [url=javascript]click me[/url] а такой - нет: Код (Text): [url="http://localhost.ru/testo/ccsis/phorum/index.php?action=topic_page&mid=1506#m1506"]click me[/url]
dark-demon покажи код check_is_url Дело в том что такая уязвимость была в одной из предыдущих версий, и она была исправлена. У меня впечатление, что я залил не тот дистрибутив.
Код (Text): function check_is_url($data){ $sProtocol = '((ht|f)tp(s?))://'; $sIp = '((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])'; $sDomain = '([a-zA-Z0-9].)[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,6}'; $sPort = ':[0-9]{1,5}'; $sPath = '[\\.\\\/\-\w]{1,}([\w-]{0,32}.[\w]{1,12})?'; $sParameters = '[?]{1}([\w%+=&;]{0,250})'; return (boolean) !empty($data) && preg_match('!^(('.$sProtocol.')?(('.$sDomain.')|('.$sIp.'))?('.$sPort.')?)?('.$sPath.'('.$sParameters.')?)?$!si',$data); } особо не вникал, но есть подозрение, что двойные слэши тут излишни... update: поковырялся в комоде - у тебя точка в пути не экранирована. ps: кстати, тире можно не экранировать, если его написать в начале или в конце: Код (Text): [-./\\\w]{1,}
dark-demon, ну что-же 80 баксов твои Напиши мне в приват моего форума wm реквизиты, и огромное спасибо! Оплачу после 20-го. да, я знаю. ([\w-]{0,32})
dark-demon, поигрался я с этой багой/уязвимостью. пока не могу понять, как её можно использовать, и есть ли уязвимость вообще . Можеш привести пример хоть сколько бы то нибыло опасного действия?
dark-demon По поводу слэшей ты прав, подправил, теперь выглядит проще. PHP: function check_is_url($data){ $sProtocol = '((ht|f)tp(s?))://'; $sIp = '((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])'; $sDomain = '([a-zA-Z0-9].)[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,6}'; $sPort = ':[0-9]{1,5}'; $sPath = '[.\\/\w-]{1,}([\w-]{0,32}\.[\w]{1,12})?'; $sParameters = '[?]{1}([\w%+=#&;]{0,250})'; return (boolean) !empty($data) && preg_match('!^(('.$sProtocol.')?(('.$sDomain.')|('.$sIp.'))?('.$sPort.')?)?('.$sPath.'('.$sParameters.')?)?$!si',$data); }
её там и нет кстати, какой смысл в этом обороте? Код (Text): (boolean) !empty разве восклицательный знак может возвращать что-то отличное от boolean?
Смысл очевиден, я подумал, что найдена уязвимость, причём судя по приведённому коду в последней версии, я даже озвучил цену . А когда занялся изучением, понял, что уязвимостью это назвать очень трудно. Вот кстати дырявый код из предыдущей версии: PHP: function check_is_url($data){ return (boolean) preg_match('!^((((ht|f)tp(s?))://)?(([a-zA-Z0-9].)[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,6}|((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9]))(:[0-9]+[\\\\/]{1})*([\\\\/]{1,1){0,1}){0,1}([\\.\\\\/\w]{1,})([?]{1}([\w%+=&]{0,})){0,1}$!si',$data); } Именно про него я подумал, прочитав фразу про одну строку -) Этот код пропускал javascript:arelt('xss') Приведение к логическому значению осталось как раз от этой процедуры (как известно preg_match возвращает результат целочисленного типа). И вообще придираться к таким мелочам не красиво )) В коде есть куча более смешных мест.
Попробовал зарегистрироваться на сайте. Выдали форму, нажал Отправить. Далее оно мне выдало список ошибок, я их не успел прочитать, и далее меня перекинуло на главную страницу форума. Помоему сдесь что то не то