【问题标题】:Making Only Specific Functions and Variables Available in PHP在 PHP 中只使用特定的函数和变量
【发布时间】:2010-11-09 17:13:43
【问题描述】:

我想做一个编程环境。我会举例说明。

一个程序员将​​编写该代码;

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

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

该definedMetaTags()函数将已经写入系统中。

Compiler.php 的一个例子:

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

我的问题是我想只允许uploadfile.php 使用我想要的功能。否则,也许那个程序员写了一些我想让他/她做的代码。 (删除文件、mysql连接等)

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

【问题讨论】:

  • 您是否考虑过 XMLRPC 或 SOAP 用于此目的?
  • 我实际上希望首先将代码发送给我(到服务器)。我不希望用户发送请求并接受它的响应。

标签: php function variables constants


【解决方案1】:

如果目标是允许用户插入将被某些 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() 函数需要重新设计,以便将标签作为字符串返回,而不是直接将它们打印到输出。

此方法允许您定义任意数量的宏,而不会让自己暴露于此处其他人提到的所有安全风险。

【讨论】:

  • Schwartzie,你的方法很好,但问题是我会将这个东西用于很多编程语言。 C++、Java、Javascript、Html、Python 等。因此,str_replace 有时可能对不同的语言起作用。是的,HTML 通常不使用 {[...]} 样式,但我们可能会在其他语言中看到该样式编码。这实际上是问题所在。
  • 您的应用程序有名称吗?只需使用它——或其他一些相当不同的字符串——作为宏的前缀:{[TolgaApp_definedMetaTags]}。虽然这不会避免与任意语言的语法发生冲突,但它肯定会避免无意的冲突,并且只对用户施加合理的约束。
【解决方案2】:

如果您的目标是安全并且想让他们编写函数,那么简短的回答是:不。

本质上,您需要一个 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;
  }
}

如果您不喜欢看到的任何标记,请不要包含该文件。理论上,您也可以通过这种方式防范不良功能,但需要付出相当大的努力才能正确解析文件并确保它们没有做坏事。

参考:

【讨论】:

  • 这也能防范变量变量吗?
  • 如果你问我不是,我也想要变量的安全性。因为您知道 $_SERVER 中有很多信息,以及我现在不记得的其他变量。
【解决方案3】:

好吧,如果我正确理解了您的问题。如果你包含(“uploadedfile.php”);您将获得其中的一切

您可以做的是将您的代码分解成相关的部分(无论是通过类还是文件中的函数定义),然后只包含您想要的文件/类。

(如果这不是您的要求,请告诉我)

【讨论】:

  • 我会把你的想法(类)和巴拉特的方式结合起来。因此,我将只允许用户使用该类的变量和函数。如果它运作良好,我会告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2023-04-09
  • 2018-01-23
  • 2014-12-20
相关资源
最近更新 更多