我想创建一个编程环境。我将用一个例子来解释它。
一位程序员将编写该代码;
<html>
<head>
<?php definedMetaTags(); ?>
</head>
</body>
程序员将保存此文件,然后上传到我的系统。该文件将在服务器端执行,然后系统将返回生成的代码。
已定义的MetaTags()函数已经写入系统。
Compiler.php的一个例子:
<?php
require_once("definitionsForProgrammer.php");
include("uploadedfile.php");
?>
我的问题是我想让uploadfile.php只允许我想要的功能。另外,也许程序员会写一些我希望他/她做的代码。 (删除文件,mysql连接等)
有没有办法只允许代码中的特定函数,变量,常量?
答案 0 :(得分: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()
函数需要重新编写,以便将标记作为字符串返回,而不是直接将它们打印到输出中。
此方法允许您定义任意数量的宏,而不会让自己暴露于其他人提到的所有安全风险。
答案 1 :(得分:1)
好吧,如果我正确理解你的问题。如果你包括(“uploadedfile.php”);你将获得一切。
你可以做的是将你的代码分解成相关的部分(无论是通过类还是只是文件中的函数定义),然后只包含你想要的文件/类。
(如果那不是你的要求,请告诉我)
答案 2 :(得分:1)
如果你的目标是安全性而你想让他们写功能,那么简短的回答是:不。
基本上你要求一个PHP沙箱,它可以让你限制可以执行的代码。 PHP必须在基础层面支持它才能工作。例如,假设您采用了“我只允许用户编写名为'foo'的函数”的方法。在该函数内部,尽管用户可以执行各种不好的操作,例如进行系统调用,下载其他代码并执行它等等。为了防止这种情况,您需要在系统中的更低级别执行检查。 / p>
如果您愿意仅将范围限制为变量定义,那么您可以这样做。您可以使用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;
}
}
如果您不喜欢您看到的任何令牌,请不要包含该文件。理论上你也可以通过这种方式防范不良函数,但是需要花费大量精力来正确解析文件并确保它们没有做坏事。
的引用: