Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Защита при использовании eval()
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Защита при использовании eval()

Страниц (1): [1]
 

1. Uchkuma - 29 Июня, 2010 - 20:16:54 - перейти к сообщению
У меня на сайте в админке есть специальная формочка "Выполнить произвольный php-код". Я ее использую, когда мне бывает нужно быстро проверить работу какого-нибудь фрагмента кода, функции или скрипта на хостинге. Как видно из заголовка, реализовано все на функции eval(). В принципе, все хорошо - доступ к админке и конкретно к данному разделу есть только у меня. Однако в перспективе доступ может быть дан и другому человеку, да и от утечки пароля никто не застрахован. В общем мне хотелось бы исключить наиболее опасные угрозы в таких случаях.
Так вот как же лучше всего проверить входные данные, перед тем как передать их функции eval()?
Я решил запретить выполнение определенных функций следующим образом:
PHP:
скопировать код в буфер обмена
  1. function php_code(){
  2. if(strlen($_POST['php_code'])>=500){
  3. echo 'Слишком большой код';
  4. }
  5.  
  6. $php_code = ' '.$_POST['php_code'].' ';
  7.  
  8. $deny = '/\b((include|require)|(readfile|show_source|highlight_file|import_request_variables|extract|parse_str|eval|assert|passthru|exec|system|shell_exec|proc_open|mysql_query|fopen)\s*\(.*\))\W/Uis';
  9.  
  10. if(preg_match_all($deny, $php_code, $matches)){
  11. foreach($matches[1] as $match){
  12. echo 'В выполняемом коде запрещено использовать "'.$match.'"!<br>';
  13. }
  14. }
  15. eval($php_code);
  16. }
  17.  
  18. if(!empty($_POST['php_code'])) php_code();

Форма:
CODE (html):
скопировать код в буфер обмена
  1. <form action="" target="_blank" method="post">
  2. Выполнить PHP-код<br>
  3. <textarea name="php_code"></textarea><br>
  4. <input type="submit" value="Выполнить">
  5. </form>

Жду ваших советов и рекомендаций, дорогие друзья!
2. alexspb - 30 Июня, 2010 - 13:03:15 - перейти к сообщению
еще потенциально опасная функция - base64_decode()
3. JustUserR - 30 Июня, 2010 - 14:00:21 - перейти к сообщению
Uchkuma пишет:
Так вот как же лучше всего проверить входные данные, перед тем как передать их функции eval()?
Я решил запретить выполнение определенных функций следующим образом
В силу того что PHP является динамическим языком программирования с роизвольным уровнем вложения динамических элементов - то ваша защита может быть обойдена с помощью функции create_function код который является строковой константой - и может содержать через конкатенацию или экранирование или шифрование любую из вышеуказанных функций Аналогичным образом использование библиотеки runkit позволяет динамически модифицировать код любых функций - и по аналогии использовать в них любые операторы Кроме того начиная с PHP5.3 функции становятся объектами первого рода и их также можно динамически генерировать
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций
Кроме того следует проверять кодировку вводимых данных чтобы функция поиска сработала успешно - и желательно поверять PHP-код на фатальные ошибки
4. Uchkuma - 30 Июня, 2010 - 14:45:21 - перейти к сообщению
JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций

Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
5. JustUserR - 30 Июня, 2010 - 14:55:40 - перейти к сообщению
Uchkuma пишет:
Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
Кстати для этой цели может хорошо помочь модуль runkit - там имеется и проверка интаксиса и средства для динамической маниуляции PHP-кодом
6. awiz - 30 Июня, 2010 - 17:09:27 - перейти к сообщению
Uchkuma пишет:
JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций

Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(

мой совет- поставтье просто
PHP:
скопировать код в буфер обмена
  1. if($_SERVER['REMOTE_ADDR']!==$your_ip) exit;
7. Uchkuma - 30 Июня, 2010 - 18:39:31 - перейти к сообщению
awiz пишет:
мой совет- поставтье просто
PHP:
скопировать код в буфер обмена
  1. if($_SERVER['REMOTE_ADDR']!==$your_ip) exit;

Дело говоришь! Но в сам скрипт такие записи вносить нежелательно. А вот добавить в файл .htaccess в папке админки:
Order Deny,Allow
Deny from all
Allow from 100.99.99.1, 100.99.99.2

это святое дело!
8. awiz - 30 Июня, 2010 - 20:22:54 - перейти к сообщению
Uchkuma пишет:

Дело говоришь! Но в сам скрипт такие записи вносить нежелательно. А вот добавить в файл .htaccess в папке админки:
Order Deny,Allow
Deny from all
Allow from 100.99.99.1, 100.99.99.2

это святое дело!

Закатив глазки
9. JustUserR - 01 Июля, 2010 - 00:43:22 - перейти к сообщению
awiz пишет:
Мой совет- поставтье просто if($_SERVER['REMOTE_ADDR']!==$your_ip) exit
В принципе ограничение по IP-адресу является достаточно хорошим способом - однако из первоначального требования к задаче имелось в виду что административная панель в принципе имеет нужную защиту - и проблема заключается в том что опция выполнения PHP-кода предоставляется сторонним пользователям и нужно ограничить их дейтсвия по его исполнению - иначе можно сделать просто авторизацию учитывая что IP-адреса бывают динамические и NAT-адреса и в принципе в некоторых случаях их можно подделать как IP spoofing
10. Uchkuma - 01 Июля, 2010 - 07:30:19 - перейти к сообщению
Ну да, изначальный вопрос так и остался не решенным. Попробую его несколько переформулировать:
Как запретить выполнение определенных функций в скрипте? Вариант с запретом в php.ini не подходит, т.к. во-первых - нет к нему доступа, во-вторых - это возымеет отношение ко всем сайтам, а нужно только к определенному скрипту.
JustUserR, ваши слова в одной из тем:
JustUserR пишет:
Если ваш хостинг достаточно качественный то должен разрешать использование собственных CGI-скриптов - а это значит что вы сможете установить собственную инстанцию PHP-интерпретатора с любыми настройками - и еще указать пользователя и группу от имени которых ваши PHP-скрипты будут исполняться

Похоже, это и есть вариант решения проблемы в данном случае? Знаю, что мой хостинг это позволяет, но сам с CGI-скриптами никогда дела не имел.
Хотелось бы изучить по детальнее, как это делается. Буду рад ссылкам на русскоязычную литературу.
11. JustUserR - 01 Июля, 2010 - 13:11:33 - перейти к сообщению
Uchkuma пишет:
Похоже, это и есть вариант решения проблемы в данном случае? Знаю, что мой хостинг это позволяет, но сам с CGI-скриптами никогда дела не имел.
Хотелось бы изучить по детальнее, как это делается. Буду рад ссылкам на русскоязычную литературу
Действительно в вашем случае это буде качественное и эффективное решение задачи блокировки фунций - поскольку ведь если заблокировать их использование в самом PHP-интепретаторе то не придется проверять текущий динамический PHP-код на предмет их наличия - и значит не надо будет писать свой проверяющий интерпретатор - при том что пользовательские PHP-скрипты можно будет никак не ограничивать по динамическому коду
Обычный CGI-скрипт представляет собой приложение которое запускается web-сервером и обменивается данными с ним за счет стандартного потока ввода/вывода - при этом конечно все данные должны соответствовать HTTP-протоколу и в частности CGI-скрипт при работе обязан выводить ряд обязательный HTTP-заголовков - иначе возникается 500 ошибка С точки зрения настройки Apache достаточно указать в файле .htaccess для нужных файлов тип обработчика cgi-script - после чего при обращении к определенному web-ресурсу если он является CGI-скриптом то передается на исполнение Достаточно подробно механизм CGI-скриптом описан здесь http://forum.php.su/topic.php?fo...m=65&topic=3
Далее вам необходимо выяснить точную верси ОС хостинг-провайдера и собрать для нее исполняемый файл PHP-интерпрератора - если у вас имеется SSH то можно собирать прямо на сервере указывая к конфигурационных файла prefix="/path/to/home/dir" - а если нет то можете установить на виртуальную машину такую же ОС и скомпилировать там и потом перенести исполняемый файл - последний вариает описывался здесь http://progbook[dot]ru/2008/07/31/ph[dot][dot][dot]jj-kostarev[dot]html После того как вы получить свой исполняемый файл PHP-интерпрератора причем можете при компиляции добавить туда любые требуемые библиотеки - вы можете установить его как CGI-скрипт для обработки файло с расширением PHP путем установки директивы Action
Для того чтобы указать получившейся инстанции интерпретатора путь к конфигурационному файлу php.ini необходимо использовать переменную окружения PHPRC с соответствующим путем - ее можн установить из .htaccess при настройке директив для CGI-скрипта - а именно за счет директив SetEnv и PassEnv Также для финальной настройки требуется установить правильные права и принадлежности соответствующих файлов - и по возможности использовать suexec
Вы можете использовать полученный PHP-интерпретатор везде а можете специально для функции пользовательких PHP-скриптов - добавив все нужные ограничения
12. tisar - 27 Июля, 2011 - 21:12:23 - перейти к сообщению
JustUserR пишет:
В силу того что PHP является динамическим языком программирования с роизвольным уровнем вложения динамических элементов - то ваша защита может быть обойдена с помощью функции create_function код который является строковой константой - и может содержать через конкатенацию или экранирование или шифрование любую из вышеуказанных функций Аналогичным образом использование библиотеки runkit позволяет динамически модифицировать код любых функций - и по аналогии использовать в них любые операторы Кроме того начиная с PHP5.3 функции становятся объектами первого рода и их также можно динамически генерировать


А разве проверка строк кода на наличие выше описанные функции и при их обнаружении запрет исполнения кода не решит вопрос безопасности? Мне с помощью eval() необходимо выполнять только математическии операции. Причина использования функции eval: http://forum.php.su/topic.php?fo...1&topic=7841

P.S.: Извините за поднятие древней темы, но меня так же как и автору появилась потребность использовать функцию eval.
13. OrmaJever - 27 Июля, 2011 - 21:29:29 - перейти к сообщению
Значит нужно создать новую тему и описать проблему полностью

 

Powered by ExBB FM 1.0 RC1