仅使PHP中可用的特定函数和变量

时间:2010-11-09 17:13:43

标签: php function variables constants

我想创建一个编程环境。我将用一个例子来解释它。

一位程序员将编写该代码;

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

程序员将保存此文件,然后上传到我的系统。该文件将在服务器端执行,然后系统将返回生成的代码。

已定义的MetaTags()函数已经写入系统。

Compiler.php的一个例子:

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

我的问题是我想让uploadfile.php只允许我想要的功能。另外,也许程序员会写一些我希望他/她做的代码。 (删除文件,mysql连接等)

有没有办法只允许代码中的特定函数,变量,常量?

3 个答案:

答案 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;
  }
}

如果您不喜欢您看到的任何令牌,请不要包含该文件。理论上你也可以通过这种方式防范不良函数,但是需要花费大量精力来正确解析文件并确保它们没有做坏事。

的引用: