Обеспечение доступности только определенных функций и переменных в PHP - PullRequest
0 голосов
/ 09 ноября 2010

Я хочу создать среду программирования.Я объясню это на примере.

Один программист напишет этот код;

<html>
 <head>
  <?php definedMetaTags(); ?>
 </head>
</body>

Программист сохранит этот файл и затем загрузит его в мою систему.Этот файл будет выполнен на стороне сервера, а затем система вернет сгенерированный код обратно.

Эта функция defineMetaTags () уже будет записана в системе.

Пример Compiler.php:

<?php
 require_once("definitionsForProgrammer.php");
 include("uploadedfile.php");
?>

Мой вопрос заключается в том, что я хочу разрешить файлу uploadedfile.php только те функции, которые мне нужны.Еще, может быть, этот программист пишет некоторые коды, что я хочу, чтобы он / она делал.(Удаление файлов, подключение к MySQL и т. Д.)

Можно ли разрешить коду только определенные функции, переменные, константы?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

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

<html>
 <head>
  {[definedMetaTags]}
 </head>
</body>

Затем Compiler.phpбудет выглядеть так:

<?php
 require_once("definitionsForProgrammer.php");

 $macros = array();
 $macros['definedMetaTags'] = definedMetaTags();

 $output = file_get_contents("uploadedfile.php");
 foreach($macros as $macro=>$value) $output = str_replace("{[$macro]}", $value, $output);

 echo $output;
?>

Необходимо переписать функцию definedMetaTags(), чтобы она возвращала теги в виде строки, а не печатала их непосредственно для вывода.

Этот метод будетпозволяет вам определять любое количество макросов, не подвергая себя всем рискам безопасности, о которых упоминали другие.

1 голос
/ 09 ноября 2010

Если вы стремитесь к безопасности и хотите позволить им писать функции, тогда краткий ответ: нет.

По сути, вы запрашиваете песочницу PHP, которая позволит вам ограничить, какой код может быть выполнен. PHP должен поддерживать это на фундаментальном уровне, чтобы он работал. Например, предположим, что вы применили подход «я разрешаю только пользователю писать функцию с именем« foo »». Внутри этой функции пользователь может совершать всевозможные плохие действия, например совершать системные вызовы, загружать другой код и выполнять его и т. Д. Чтобы предотвратить это, вам необходимо реализовать проверки на гораздо более низком уровне в системе.

Если вы хотите ограничить область действия только определениями переменных, тогда да, вы можете это сделать. Вы можете использовать token_get_all () и token_name (), чтобы проверить файл и убедиться, что в нем нет кода, который вам не нужен. Например:

foreach (token_get_all(file_get_contents("uploadedfile.php")) as $token) {
  if (is_array($token)) {
    echo token_name($token[0]), " ";
  } else {
    echo $token;
  }
}

Если вам не нравятся какие-либо токены, которые вы видите, не включайте файл. Вы также можете теоретически защититься от плохих функций, но это потребует значительных усилий, чтобы правильно проанализировать файл и убедиться, что они не делают что-то плохое.

ссылки:

1 голос
/ 09 ноября 2010

Хорошо, если я правильно понимаю ваш вопрос. Если вы включите ("uploadedfile.php"); вы приобретете все в нем.

Что вы можете сделать, это разбить ваш код на связанные разделы (будь то через классы или просто определения функций в файле), а затем включить только тот файл / класс, который вы хотите.

(дайте мне знать, если это не то, что вы просите)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...