2015-02-03 2 views
0

Это немного трудно объяснить, что я после ... Вот простой скрипт:PHP выполнить некоторый код в индивидуальной среде

<?PHP 

$someData = ["foo" => "bar"]; 

function someFunction($someArg) { 
    include("someFile.php"); 
} 

?> 

и вот код «somefile.php»:

<?PHP 
    echo "I'm some file!"; 
    global $someData; // point 1 
    var_dump($someData); 
    include("someOtherFile.php"); // point 2 
?> 

Я хочу, чтобы его можно было позволить «someFile.php» получить доступ к любой переменной, кроме того, что предоставляется ему в качестве аргументов «someFunction» (точка 1) и не включать в нее какие-либо другие файлы (точка 2)? в то время как все это происходит в "someFunction()" ... как я могу достичь этого и/или сделать свой путь вокруг этого?

+1

Зачем голосовать? – Whocares

+1

Именно здесь объект php приходит к вам в качестве решения. Попробуйте исключить глобальные переменные, чтобы забыть о проблеме с переменным доступом и использовать частные функции для сужения доступа к функции (методу). Не понимаю, что такое downvote. +1. –

+0

Можете ли вы быть любезны, чтобы придумать практический пример? – Whocares

ответ

0

Нет, вы не можете предотвратить чтение других переменных из включенного файла.

Чтобы предотвратить прочтение любого состояния вашей заявки, вы можете заменить include на exec. Например: exec ('php someFile.php argument') и получить аргумент в someFile.php с помощью $argv variable или getOpt

0

К сожалению, нет возможности каким-либо образом (что я знаю) ограничить доступ к текущему экземпляру. Это похоже на цель и дизайн PHP. Я предложил ниже предложение, но я рекомендую вам прочитать мой комментарий и в конце.

То, что я могу порекомендовать, заключается в том, что вы выполняете файл PHP отдельно и используете собственный файл php.ini для отключения функций, таких как include через свойство disable_function. Вы можете создать временный файл PHP с глобальными данными вам нужно это, чтобы получить доступ в верхней части, как:

<?php 
$someData = ["foo" => "bar"]; 


    echo "I'm some file!"; 
    global $someData; // point 1 
    var_dump($someData); 
    include("someOtherFile.php"); // point 2 
?> 

Вы бы тогда назвать его, как, например: Exec ("PHP -f /temporary_folder/tempfile.php - -php-ini /temporary_folder/php.ini ");

Я рекомендую, если безопасность важна, и вы намерены заставить ее обратиться к публике (самостоятельно ее или освободить), которую вы проверили или просмотрели профессионалом безопасности. Блокировка выполнения PHP-кода - непростая задача, и есть много способов, которыми кто-то может выполнить произвольный код или делать то, что yu не хочет. Вы можете заблокировать eval, но знаете ли вы, что вы также можете оценить код через функцию preg_replace? Вы бы не подумали, что функция регулярного выражения может быть использована.

+0

Как я знаю, вы не можете отключить языковые конструкции с disable_function. – sectus

+0

Ах, я никогда не пробовал честно. Я просто просматриваю php-код весь день и чистую вредоносную программу. – masshuu

0

Похоже, что вы хотите, чтобы «песочница» включала сценарий. Я не знаю ответа, но есть похожие ответы на вопросы, которые вы можете проверить, например, this

PS: это должен быть комментарий, но, к сожалению, у меня все еще нет комментариев.

0

Невозможно добиться этого с помощью включения.

Вы должны подумать о включении в число CTRL + C и CTRL + V. Так как ваш исходный код имеет доступ к глобальной переменной, ваш файл include также имеет. Он работает, как вставка новой страницы в используемый ноутбук. Это просто эстетическая операция. Решение? OOP ...


Вы должны попытаться не использовать глобальные переменные и переключиться на объектно-ориентированное программирование. Если глобальных переменных нет и все хранится в объекте, объект решает, имеет ли кто-либо доступ к этой переменной.Короткий пример:

<?php 
    // "Closed environment" 
    class NoAccess() { 
     private $notaccessible; 
     public __construct ($notaccessibleparam) { 
      $this->notaccessible = $notaccessibleparam; 
     } 
     public method yourfunction() { 
      print_r($this->notaccessible); // have access 
     } 
    } 

    $instance = new NoAccess(10); 
    // Further Code dont even know there is a variable called $notaccessible. 
    // ... 
    // ... 
    // But, You can always call: 
    $instance->yourfunction(); // which have access, and know it. 
?> 

В этом случае eveyrhing, что вы включили (в трех точках комментариев), или там писать, не может использовать notaccessible переменного $. Единственный способ использовать его - использовать собственный интерфейс, такой как yourfunction().

Это может быть что-то новое для вас, но вы должны попытаться прочитать о oop (объектно-ориентированное программирование) в php, в то время как я вижу, что ваш код довольно сложный, и вы должны переключаться на oop так быстро, как можете.


ССЫЛКИ:

http://php.net/manual/en/language.oop5.php - OOP на php.net

http://php.net/manual/en/language.oop5.visibility.php - видимости переменных внутри класса на php.net


PS. Попробуйте использовать маленькие буквы в <?php. Это хорошая привычка.

Смежные вопросы