【问题标题】:How to block specific PHP statements如何阻止特定的 PHP 语句
【发布时间】:2012-06-03 00:22:48
【问题描述】:

虽然听起来很危险,但我希望用户能够在我的网站上创建自己的 PHP 程序。

我有什么办法可以编写代码,这样当用户发布他们的代码时,他们就不会删除或编辑已经存在的文件,也许是使用 RegExp?

谢谢

【问题讨论】:

  • 不要使用正则表达式...如果要检查脚本中特定函数的使用情况,请使用内置标记器
  • 最简单的方法是通过设置正确的权限使 PHP 无法访问该文件。这很可能需要对您的服务器的 root 访问权限
  • 内置分词器?那是什么?
  • @RickyAYoder,tokeniser 是允许您“标记化”编程语言以进行词法分析的函数,并检查诸如“此行是注释吗?”之类的功能
  • 你有没有想过做某事project page at codepad?至少他们已经解决了这些问题,尽管不可否认,这并不是所有问题的解决方案。另请阅读codepad about page

标签: php file-upload filesystems


【解决方案1】:

看看php.ini指令disable_functions

【讨论】:

  • 可以理解,但我不想完全禁用这些功能——只在运行一段代码时。
  • 好吧,没有其他方法可以在 php (afaik) 中本地禁用功能,另一种解决方案可能是在安全模式下运行 php,但在 VM 中并经常重置它。但我看不出有任何方法可以安全地允许服务器代码执行和公共访问。
  • 正如 Mark Ba​​ker 所说,您也可以对提交的 php 代码进行标记化,但分析这将很难使其可用。
  • @RickyAYoder 在你的问题下看到我的评论,你也可以看看en.wikipedia.org/wiki/Lexical_analysis#Tokenizer
  • 哦,我明白了。谢谢。我去看看。
【解决方案2】:

除非您想通过php.ini 简单地禁用功能(这会限制您自己的脚本,特别是如果您允许用户上传和管理他们的 PHP 文件),那么任何类型的这种规模代码的审核脚本都会变得可怕而复杂。您至少需要监控所有创建的文件或操作,并取消对尚未创建的文件或操作的任何调用。

PHP 在解析 HTML 或 XML 之类的东西时遇到了很多麻烦,所以我会避免使用原始 PHP 来让人们执行自己的脚本。

【讨论】:

    【解决方案3】:

    如果您在服务器管理方面得心应手,您可能会想出办法。您可能想在服务器故障时问这个问题。我认为如果您将文件复制到一个具有正确权限的目录(可能是 550),它不会让脚本写任何东西,但我不太确定。

    我的一个建议是将 set_time_limit() 添加到所有脚本的顶部,以缩短运行时间。此外,我会设置一个脚本,一次只允许执行这么多次,这样你的服务器就不会被破坏。

    【讨论】:

    • 此时,这似乎是最合理的解决方案。
    【解决方案4】:

    看到 PHP 中可用的功能数量,这使得安全地设置共享主机已经有些困难,实际上没有办法通过将某些语句列入黑名单来安全地允许用户执行此操作。

    但是,如果您真的现在正在做的事情,则可以使用允许执行的功能的白名单。如果您真的想安全地做到这一点,您可以通过在非特权 PHP 解析器中运行代码并使用结果来实现这一点。以与您的网站相同的权限运行代码是安全的。

    【讨论】:

    • 还有非特权解析器?我可以更改特定路径的权限吗?
    • 可以设置PHP程序的权限;例如php.net/manual/en/security.apache.php。但是,这仅在您对服务器具有 root 访问权限时才有效。
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2022-11-23
    • 2013-10-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多