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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Защита при использовании eval()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Защита от выполнения потенциально опасных функций при использовании eval()
Uchkuma
Отправлено: 29 Июня, 2010 - 20:16:54
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




У меня на сайте в админке есть специальная формочка "Выполнить произвольный 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>

Жду ваших советов и рекомендаций, дорогие друзья!
 
 Top
alexspb
Отправлено: 30 Июня, 2010 - 13:03:15
Post Id


Посетитель


Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




еще потенциально опасная функция - base64_decode()


-----
Хостинг - неограниченно доменов на одну папку
Ajax - отличное введение
 
 Top
JustUserR
Отправлено: 30 Июня, 2010 - 14:00:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Uchkuma пишет:
Так вот как же лучше всего проверить входные данные, перед тем как передать их функции eval()?
Я решил запретить выполнение определенных функций следующим образом
В силу того что PHP является динамическим языком программирования с роизвольным уровнем вложения динамических элементов - то ваша защита может быть обойдена с помощью функции create_function код который является строковой константой - и может содержать через конкатенацию или экранирование или шифрование любую из вышеуказанных функций Аналогичным образом использование библиотеки runkit позволяет динамически модифицировать код любых функций - и по аналогии использовать в них любые операторы Кроме того начиная с PHP5.3 функции становятся объектами первого рода и их также можно динамически генерировать
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций
Кроме того следует проверять кодировку вводимых данных чтобы функция поиска сработала успешно - и желательно поверять PHP-код на фатальные ошибки


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Uchkuma
Отправлено: 30 Июня, 2010 - 14:45:21
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций

Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
 
 Top
JustUserR
Отправлено: 30 Июня, 2010 - 14:55:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
awiz
Отправлено: 30 Июня, 2010 - 17:09:27
Post Id



Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Uchkuma пишет:
JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций

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

мой совет- поставтье просто
PHP:
скопировать код в буфер обмена
  1. if($_SERVER['REMOTE_ADDR']!==$your_ip) exit;

(Отредактировано автором: 30 Июня, 2010 - 17:09:45)

 
 Top
Uchkuma
Отправлено: 30 Июня, 2010 - 18:39:31
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




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

это святое дело!
 
 Top
awiz
Отправлено: 30 Июня, 2010 - 20:22:54
Post Id



Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Uchkuma пишет:

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

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

Закатив глазки

(Отредактировано автором: 30 Июня, 2010 - 20:23:25)

 
 Top
JustUserR
Отправлено: 01 Июля, 2010 - 00:43:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




awiz пишет:
Мой совет- поставтье просто if($_SERVER['REMOTE_ADDR']!==$your_ip) exit
В принципе ограничение по IP-адресу является достаточно хорошим способом - однако из первоначального требования к задаче имелось в виду что административная панель в принципе имеет нужную защиту - и проблема заключается в том что опция выполнения PHP-кода предоставляется сторонним пользователям и нужно ограничить их дейтсвия по его исполнению - иначе можно сделать просто авторизацию учитывая что IP-адреса бывают динамические и NAT-адреса и в принципе в некоторых случаях их можно подделать как IP spoofing


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Uchkuma
Отправлено: 01 Июля, 2010 - 07:30:19
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Ну да, изначальный вопрос так и остался не решенным. Попробую его несколько переформулировать:
Как запретить выполнение определенных функций в скрипте? Вариант с запретом в php.ini не подходит, т.к. во-первых - нет к нему доступа, во-вторых - это возымеет отношение ко всем сайтам, а нужно только к определенному скрипту.
JustUserR, ваши слова в одной из тем:
JustUserR пишет:
Если ваш хостинг достаточно качественный то должен разрешать использование собственных CGI-скриптов - а это значит что вы сможете установить собственную инстанцию PHP-интерпретатора с любыми настройками - и еще указать пользователя и группу от имени которых ваши PHP-скрипты будут исполняться

Похоже, это и есть вариант решения проблемы в данном случае? Знаю, что мой хостинг это позволяет, но сам с CGI-скриптами никогда дела не имел.
Хотелось бы изучить по детальнее, как это делается. Буду рад ссылкам на русскоязычную литературу.
 
 Top
JustUserR
Отправлено: 01 Июля, 2010 - 13:11:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




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-скриптов - добавив все нужные ограничения


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
tisar
Отправлено: 27 Июля, 2011 - 21:12:23
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




JustUserR пишет:
В силу того что PHP является динамическим языком программирования с роизвольным уровнем вложения динамических элементов - то ваша защита может быть обойдена с помощью функции create_function код который является строковой константой - и может содержать через конкатенацию или экранирование или шифрование любую из вышеуказанных функций Аналогичным образом использование библиотеки runkit позволяет динамически модифицировать код любых функций - и по аналогии использовать в них любые операторы Кроме того начиная с PHP5.3 функции становятся объектами первого рода и их также можно динамически генерировать


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

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



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Значит нужно создать новую тему и описать проблему полностью
Тема закрыта!


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB