Предварительная фильтрация PHP кода - как разрешить только алгоритмические команды?

xintrea

Новичок
Автор оригинала: Angerslave
Поднимку-ка тему...
Вариант - заменять все функции в коде на функции с тем же именем, но, например, префиксом sandbox_, то есть функция fopen станет sandbox_fopen и т.д. Ну а в управляющем скрипте просто определяем доступные функции.
Вариант с префиксом не подходит, так как "разрешенный" код должен работать на чистом PHP без всяких надстроек.

В принципе я считаю проект завершенным, потому что за восемь месяцев после первых трех удачных взломов, больше взломов небыло. Конечно хостер мой тот еще перец, вот опять третий день хост xi.net.ru недоступен, так что возможно потенциальный кулхацкер который действительно может обойти систему просто не увидел ее в работе и больше не возвращался. А вообще атаки идут с завидной постоянностью, фантазия у некоторых авторов работает замечательно. Таких извратов в коде я нигде больше не видел.
 

dark-demon

d(^-^)b
я, наверно, лезу не в своё дело, но на мой взгляд использование яваскрипта и безопасней, и быстрее, и удобней (не нужно этих жудких ограничений + ООП).

а можно пример извратов? :)

ps: сделай зеркало на другом хостинге. заодно, проверишь так ли оно у тебя независит от настроек сервера, как ты о нём думаешь :)
 

xintrea

Новичок
Автор оригинала: Alexandre
я бы все пропустил через фильтр а потом eval()
фильтр отсеивает все тексты, как запрещенные где есть строки с любыми функциями, кроме имен, указанных в хешмассиве.
Думаю, их перечень автор уже определил

да и еще отслеживание строк $$var ,eval и $_var
Нужно не строки отслеживать, а лексемы. Если бы я изначально на строки ориентировался, система бы такой дырявой получилась что каждый пионер бы ее заламывал, а я б тока дыры латал. Поэтому и используется токенайзер.

А проверка строк идет только на недопустимые символы или на недопустимые неразрывные последовательности символов. $$var - это разрывная последовательность, ибо с тем же результатом можно написать $/*preved*/$var.
 

Drkwv

Новичок
xintrea
Получается, что единственный способ ограничить eval - это выискивать в передаваемом ему коде лексемы?

Как много на это уходит времени?

И такой вопрос - что если отловив вызов определенной функции, вставить перед её вызовом код проверки содержимого переменных, передающихся этой функции? Я вопрос задаю из-за этого :). Там у меня стоит задача ограничить доступ к одному-единственному файлу, не ограничивая при этом пользователя в наличии самих функций. Хотя, наверное, в этом случае проще заменить имя вызываемой функции на её безопасный вариант... Спасибо :) Когда сервис заработает?
 

xintrea

Новичок
Автор оригинала: Drkwv
xintrea
Получается, что единственный способ ограничить eval - это выискивать в передаваемом ему коде лексемы?
Как много на это уходит времени?
Все достаточно быстро. Когда заработает, я вставлю замер времени выполнения проверки.


И такой вопрос - что если отловив вызов определенной функции, вставить перед её вызовом код проверки содержимого переменных, передающихся этой функции?
Как вы себе представляете отлов вызова функции в PHP? Кроме того, одно и то же действие можно сделать разными функциями. Получить содержимое файла можно и через file() и через fopen() и через file_get_contents() и еще как нибудь... И это для каждой функции делать проверку? Лучше уж если вы знаете как отловить вызов функции, для опасных функций сразу делать return.


Я вопрос задаю из-за этого :). Там у меня стоит задача ограничить доступ к одному-единственному файлу, не ограничивая при этом пользователя в наличии самих функций. Хотя, наверное, в этом случае проще заменить имя вызываемой функции на её безопасный вариант... Спасибо :) Когда сервис заработает?
> Здравствуйте.
> Три дня не работает xi.net.ru
> Когда заработает?
> Пользователи ропщут.

Да есть проблема, исправляем.
Или сегодня, или завтра в первой половине.
С уважением, группа поддержки.

-~{}~ 06.04.07 01:11:

Автор оригинала: dark-demon
я, наверно, лезу не в своё дело, но на мой взгляд использование яваскрипта и безопасней, и быстрее, и удобней (не нужно этих жудких ограничений + ООП).
Предполагалось что эта система будет использоваться в онлайн-игре где пользователи программлят ботов. Язык должен быть предельно популярный, простой и всем известный. А чтобы небыло накруток, поединки ботов должы проходить на сервере. Тогда все по-честному. В этом смысле PHP подходит как нельзя лучше.


а можно пример извратов? :)

ps: сделай зеркало на другом хостинге. заодно, проверишь так ли оно у тебя независит от настроек сервера, как ты о нём думаешь :)
Каг заработает хостер, позырю логи. Извраты обычно идут одной строкой, всячески пытаясь замаскировать вызов функции через переменную. На другом хостинге сделать зеркало смогу только тогда, когда надежный товарищ согласится разместить такую шнягу у себя, и при этом код не утечет налево.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
imho наоборот было бы познавательно такой код открыть :)
может кто еще чего придумает
 

xintrea

Новичок
Хост заработал. Кто еще не видел это чудо, тому сюда

Описание http://xi.net.ru/webcodepage.php
Сам сервис http://xi.net.ru/sandbox/webcode.php


grigori
imho наоборот было бы познавательно такой код открыть
может кто еще чего придумает
Тут есть несколько моментов.

Первый - код я открою, но только если срублю за него хотябы 50 гринов. Как срублю, так и открою.

Второй - пока я код не открыл, коду помогает "защита на неизвестности", то есть повышение сложности взлома за счет неизвестности для взломщика подробностей как работает защита. Это конечно сомнительное "усиление" защиты, и может быть для надежной защиты стоит вести разработку открыто, но во-первых я рискую данными на своем сервере, а во-вторых при открытой разработке "не стоит переоценивать роль сообщества". То есть возможна ситуация, что после открытия кода, дырявость будет обнаружена людьми, которые ничего про баг не сообщат.

Третий - код настолько некрасивый что после открытия на меня будет навешан ярлык ламера. Я и так знаю что я ламер, но вот наличие ярлыка будет неприятно. А пока код не открыт - я загадочный никем не сломимый суперпрогер.

Четвертый - вытекает из первого. Если в результате открытия кода произойдут неприятности воторого и третьего момента, то должно быть хоть какое-то утешение. Утешение в 50$ поможет слабо, но это будет именно хоть какое утешение. Вот так дешево я себя ценю быгыгы.


Так что пока узнать код может только достойный - а именно тот, кто сможет сломать существующую защиту.
 

dark-demon

d(^-^)b
xintrea, чур каждому взломавшему равную долю с этих 50 гривен :)

-~{}~ 07.04.07 22:18:

1. почему ошибки парсинга не отлавливаешь?
2. выпадение скрипта с фатальной ошибкой за взлом считается? :)

-~{}~ 07.04.07 22:34:

Код:
echo '<<<^_^>>>';
Код:
Найдено использование HEREDOC синтаксиса <<<.
да неужели? <<<^_^>>>

-~{}~ 07.04.07 22:42:

Код:
echo 'и сказал он: "да будет свет!", - и стало так';
Код:
Найден запрещенный символ " (двойные кавычки).
бедные кавычки...
 

xintrea

Новичок
echo '<<<^_^>>>';
Найдено использование HEREDOC синтаксиса <<<.
да неужели? <<<^_^>>>
Опасные неразрывные символы. Пофигу что в кавычках. Кстати дайте PHP-код, в котором без извратного HEREDOC-синтаксиса не обойтись. И кроме того - "Самое, возможно, неприятное, что в конце строки не может быть также и символа carriage return ( \r), только form feed, AKA newline (\n). Поскольку Microsoft Windows использует последовательность \r\n как терминатор строки, ваш heredoc может не сработать, если вы запишете ваш скрипт в редакторе под Windows."


echo 'и сказал он: "да будет свет!", - и стало так';
Найден запрещенный символ " (двойные кавычки).
бедные кавычки
Об этом написано в соглашении. Двойные кавычки запрещены. Так как внутри них идет парсинг на предмет значений переменных.
 

SiMM

Новичок
> Двойные кавычки запрещены. Так как внутри них идет парсинг на предмет значений переменных.
Идёт - ну и? Для echo это так критично?
 

dark-demon

d(^-^)b
Об этом написано в соглашении. Двойные кавычки запрещены. Так как внутри них идет парсинг на предмет значений переменных.
внутри одинарных кавычек ничего не идёт.

И кроме того - "Самое, возможно, неприятное, что в конце строки не может быть также и символа carriage return ( \r), только form feed, AKA newline (\n). Поскольку Microsoft Windows использует последовательность \r\n как терминатор строки, ваш heredoc может не сработать, если вы запишете ваш скрипт в редакторе под Windows."
ну я пишу в редакторе под виндой. хередок замечательно работает.
 

xintrea

Новичок
Автор оригинала: dark-demon
поломали, наверно :)
Не, это самый главный хакер - админ хостинга ломает. Причем не только мой сайт а сразу все. Периодичность у него - неделя, неделю хост работает, через неделю наверно скучно становится и хост лежит несколько дней.

Если поломают, я тут отчет напишу.
 
Сверху