За последние 24 часа нас посетил 23081 программист и 1505 роботов. Сейчас ищут 1073 программиста ...

"Песочница" на PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем X-Cray, 16 дек 2006.

  1. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Можно ли на PHP сделать "Песочницу"?

    Т.е. подключить с помощью include и выполнить PHP код, не давая ему доступа к внешним переменным, а также к некоторым функциям.
     
  2. Xpert

    Xpert Активный пользователь

    С нами с:
    15 дек 2006
    Сообщения:
    47
    Симпатии:
    0
    Может virtual ?
     
  3. Davil

    Davil Guest

  4. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Прочитал.. не помогло.

    Скрипт:
    PHP:
    1.  
    2. <?
    3.  
    4. /*
    5. ...
    6. //здесь идет код основной программы (не ООП)
    7. ...
    8. */
    9.  
    10. require ("./возможно, опасный для исполнения код.php");
    11. ?>
    12.  
    Как код, который запускается require-ом, ограничить в правах?
     
  5. Davil

    Davil Guest

    Сделать основной код защищенным, т.е. protected или private. Иначе, если он public, к нему будет доступ "отовсюду"...
     
  6. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Так. Идея с подключением стороннего кода была "послана", ибо код располагается на стороннем сервере, а это не есть хорошо.

    А все-таки. Если бы я подключал сторонний код, к редактированию которого у меня нет доступа, как можно было бы запретить ему выполнять, например, mail() после включения в мой скрипт посредством require ?
    Причем, отключать mail() глобально нельзя - она используется основным кодом выше
     
  7. Davil

    Davil Guest

    Ну, тут есть только один вариант. Это брать исходник включаемого файла, парсить его и выполнять функцией eval()...
     
  8. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    X-Cray, да никак.
    P.S. require и include -- по сути одно и тоже, разница лишь в том как они себя ведут если самого файла нету...
     
  9. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    На этом я и остановился перед тем, как спросить на форуме.
    Ладно. Спасибо.
    Тему можно закрывать, я думаю.
     
  10. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    не дошло до меня, сорри.
    А как это решит поставленную задачу? что коду внутри eval переменные и функции недоступны?
     
  11. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Нет. Просто перед тем, как выполнить, текст кода заносится в переменную, например, $a, парсится вручную на наличие "гадости", а после, если все Ок, выполняется eval($a);
     
  12. Davil

    Davil Guest

    В функции eval() может быть все, что допустимо в сценариях:
    - Ввод/вывод, в том числе закрытие и открытие тэгов <? и ?>;
    - Управляющие инструкции: циклы, условные операторы и т.д.
    - объявления и вызовы функций;
    - вложенные вызовы функции eval().
    А так же:
    -Код в eval() будет использовать те же глобальные переменные, что и вызвавшая программа.
    - Любая критическая ошибка приведет к завершению работы всего сценария.
     
  13. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    фигасе. это ж сколько "гадостей" предусмотреть надо... :lol:
     
  14. Davil

    Davil Guest

    X-Cray может все таки не стоит заниматься такой фигней? Это ж просто рай для взломщика... Кто прознает, будет соревноваться с тобой в невнимательности =)) Вспомнил ли ты про это, а про то? Потом у тебя парсер до нескольких мегабайт сможет разрастись =)
     
  15. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Поэтому (см. Выше), я бросил затею.
    Эх.. а жаль-с. :)
     
  16. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    X-Cray, так а просто получить вывод от того скрипта посредством virtual не пойдет? это конечно никак не ограничит гада в правах, но хотябы изолирует его от "наших" переменных и т.п.
     
  17. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Ок. А если у гада:

    PHP:
    1. <?while( TRUE )
    2. mail ("admin@php.ru", " :-D ", " :-D ");?>
    ?
     
  18. Davil

    Davil Guest

    Тогда курение не поможет =))
    На мой взгляд, лучше вообще не стоит подпускать никого кроме себя к выполнению на своей стороне...
     
  19. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Позвольте, развеять Ваше заблуждение - разница есть и достаточно большая.
    1. При подключении через require можно получить только 1 или 0 - подключен файл или нет.
    При подключении через include можно получить результат подключения.
    пример
    PHP:
    1.  
    2. <?php
    3. //filename = 'test.inc'
    4. return "TEST.INC";
    5. ?>
    6. <?
    7. //filename = 'test.php'
    8. print 'Include: '.include('test.inc');
    9. print 'Require: '.require('test.inc');
    10. ?>
    11.  
    2. Что то слышал про то что при подключении через include и require существует разница в том, что при подключении через include скрипт "приостанавливается" для подключения, при подключении через require скрипт сначала подключает, потом выполняется - практического подтверждения данного слуха я не нашел, и в доках не копался, поэтому будем считать это слухом.

    Теперь, X-Cray
    Я так понимаю, что раз Вы намерены подключать сторонний сскрипт - вы хотите его подключать не слишком часто. Как вариант могу предложить решение - с подключением его через "иную" сборку пхп, то есть вариант сборки пхп отличный от того по которым работает основная система.
    То есть тупо запускать сторонний скрипт на другой версии пхп, а то что получится в выводе, брать как результат работы скрипта.
     
  20. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    в 5.1.2 cli ваш пример кстати нормально выводит "TEST.INC" и там и там...
    попытка неудалась :)

    а про "2" -- это такоой бред, что даже возражать на него нечего ;)
     
  21. Davil

    Davil Guest

    vb не проще ли подключить через virtual, чем мудрить со сборками?
     
  22. Anonymous

    Anonymous Guest

    Для таких извращенцев, как вы, придумали safe mode .... =)
     
  23. Xpert

    Xpert Активный пользователь

    С нами с:
    15 дек 2006
    Сообщения:
    47
    Симпатии:
    0
    Ага. По реквайру скрипт просто убьется, а по инклюду все же соблаговолит сказать что же не так...
     
  24. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    avm, по первому пункту похоже я сам находился в заблуждении, проверил на 5.2.0 и на 4.3.3 - функции выводят ретурн одинакого.
    по поводу второго пункта, цитата со страницы на которую вы дали ссылку.
    Меня терзают подозрения что и первый пункт следует тестить на версиях 4.0.х, но как мы понимаем - я дико отстал в знаниях по этому вопросу, даже не знаю у какого изврахенца может быть установлен тот же 4.0.2 :)
     
  25. avm

    avm Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    vb, точно. Вспоминаю было такое в php3... поэтому и не использовал это тогда. Надо же как крепко забылось!...