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()
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
У меня на сайте в админке есть специальная формочка "Выполнить произвольный php-код". Я ее использую, когда мне бывает нужно быстро проверить работу какого-нибудь фрагмента кода, функции или скрипта на хостинге. Как видно из заголовка, реализовано все на функции eval(). В принципе, все хорошо - доступ к админке и конкретно к данному разделу есть только у меня. Однако в перспективе доступ может быть дан и другому человеку, да и от утечки пароля никто не застрахован. В общем мне хотелось бы исключить наиболее опасные угрозы в таких случаях.
Так вот как же лучше всего проверить входные данные, перед тем как передать их функции eval()?
Я решил запретить выполнение определенных функций следующим образом:
Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010
Помог: 0 раз(а)
еще потенциально опасная функция - base64_decode()
----- Хостинг - неограниченно доменов на одну папку Ajax - отличное введение
JustUserR
Отправлено: 30 Июня, 2010 - 14:00:21
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Uchkuma пишет:
Так вот как же лучше всего проверить входные данные, перед тем как передать их функции eval()?
Я решил запретить выполнение определенных функций следующим образом
В силу того что PHP является динамическим языком программирования с роизвольным уровнем вложения динамических элементов - то ваша защита может быть обойдена с помощью функции create_function код который является строковой константой - и может содержать через конкатенацию или экранирование или шифрование любую из вышеуказанных функций Аналогичным образом использование библиотеки runkit позволяет динамически модифицировать код любых функций - и по аналогии использовать в них любые операторы Кроме того начиная с PHP5.3 функции становятся объектами первого рода и их также можно динамически генерировать
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций
Кроме того следует проверять кодировку вводимых данных чтобы функция поиска сработала успешно - и желательно поверять PHP-код на фатальные ошибки
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Uchkuma
Отправлено: 30 Июня, 2010 - 14:45:21
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций
Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
JustUserR
Отправлено: 30 Июня, 2010 - 14:55:40
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Uchkuma пишет:
Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
Кстати для этой цели может хорошо помочь модуль runkit - там имеется и проверка интаксиса и средства для динамической маниуляции PHP-кодом
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
awiz
Отправлено: 30 Июня, 2010 - 17:09:27
Гость
Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2010
Помог: 0 раз(а)
Uchkuma пишет:
JustUserR пишет:
Таким образом для точной проверки вводимого PHP-кода нужно выполнять не его предварительную проверку и передачу в функцию eval - а самому выступать интерпретатором и проверять значения переменных и функций
Уууу... на этом месте, похоже, придется отказаться от этой идеи. Хостинг у меня платный, php в качестве модуля apache, так что вряд ли что-то подобное получится сделать =(
Дело говоришь! Но в сам скрипт такие записи вносить нежелательно. А вот добавить в файл .htaccess в папке админки:
Order Deny,Allow
Deny from all
Allow from 100.99.99.1, 100.99.99.2
это святое дело!
awiz
Отправлено: 30 Июня, 2010 - 20:22:54
Гость
Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2010
Помог: 0 раз(а)
Uchkuma пишет:
Дело говоришь! Но в сам скрипт такие записи вносить нежелательно. А вот добавить в файл .htaccess в папке админки:
Order Deny,Allow
Deny from all
Allow from 100.99.99.1, 100.99.99.2
Покинул форум
Сообщений всего: 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/
Uchkuma
Отправлено: 01 Июля, 2010 - 07:30:19
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
Ну да, изначальный вопрос так и остался не решенным. Попробую его несколько переформулировать: Как запретить выполнение определенных функций в скрипте? Вариант с запретом в php.ini не подходит, т.к. во-первых - нет к нему доступа, во-вторых - это возымеет отношение ко всем сайтам, а нужно только к определенному скрипту. JustUserR, ваши слова в одной из тем:
JustUserR пишет:
Если ваш хостинг достаточно качественный то должен разрешать использование собственных CGI-скриптов - а это значит что вы сможете установить собственную инстанцию PHP-интерпретатора с любыми настройками - и еще указать пользователя и группу от имени которых ваши PHP-скрипты будут исполняться
Похоже, это и есть вариант решения проблемы в данном случае? Знаю, что мой хостинг это позволяет, но сам с CGI-скриптами никогда дела не имел.
Хотелось бы изучить по детальнее, как это делается. Буду рад ссылкам на русскоязычную литературу.
JustUserR
Отправлено: 01 Июля, 2010 - 13:11:33
Активный участник
Покинул форум
Сообщений всего: 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/
tisar
Отправлено: 27 Июля, 2011 - 21:12:23
Новичок
Покинул форум
Сообщений всего: 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.
OrmaJever
Отправлено: 27 Июля, 2011 - 21:29:29
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Значит нужно создать новую тему и описать проблему полностью
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.