2010-11-09 1 views
0

Я хочу создать среду программирования. Я объясню это на примере.Выполнение только определенных функций и переменных, доступных в PHP

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

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

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

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

Пример Compiler.php:

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

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

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

+1

Вы рассматривали XMLRPC или SOAP для этой цели? – stillstanding

+0

Я действительно хочу, чтобы код был отправлен мне (на сервер) во-первых. Я не хочу, чтобы пользователь отправлял запрос и принимал его ответ. – tcak

ответ

1

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

По существу, вы просите изолированную программу 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; 
    } 
} 

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

ссылки:

+0

Будет ли это защищать от переменных переменных? –

+0

Если вы спрашиваете меня, чем да, я также хочу, чтобы безопасность для переменных также была. Потому что вы знаете там много информации в $ _SERVER и другие переменные, которые я не помню сейчас. – tcak

1

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

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

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

+0

Я объединю вашу мысль (класс) и путь бхарат. Поэтому я разрешу пользователю использовать переменные и функции этого класса. Я дам вам знать, хорошо ли это работает. – tcak

2

Если цель состоит в том, чтобы позволить пользователю вставить заполнители, которые будут заменены каким-либо 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() функция должна быть переработана таким образом, что она возвращает тег в виде строки вместо того, чтобы печатать их непосредственно на выход.

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

+0

Schwartzie, ваш путь хорош, но проблема в том, что я буду использовать эту вещь для множества языков программирования. C++, Java, Javascript, Html, Python и т. Д. Таким образом, str_replace иногда может работать неправильно для разных языков. Да HTML не использует стиль {[...]}, но мы можем видеть это кодирование стиля на других языках. На самом деле это проблема. – tcak

+0

Имеет ли ваше приложение название? Просто используйте это - или какую-нибудь другую разумно отличную строку - в качестве префикса для макроса: '{[TolgaApp_definedMetaTags]}'. Хотя это не будет предотвращать столкновений с синтаксисом произвольного языка, это, безусловно, позволит избежать непреднамеренных и помещает только разумное ограничение для пользователей. – Schwartzie

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