【问题标题】:Protect a dangerous static method in PHP保护 PHP 中危险的静态方法
【发布时间】:2015-04-10 08:34:59
【问题描述】:
myClass.php
    public function clearCache() {
      // validate input and determine the appropriate cache folder;
      ...
      helper::removeFolder($folder);
}

helper.php
    static function removeFolder($folder) {
        ...
    }

第一种方法会执行所有输入验证,以确保我们没有删除错误的文件夹。

我想保护第二种方法免受 php 对象注入和未经授权的使用。

现在我正在使用这个检查调用类名 How to get the name of the calling class (in PHP)

我特别担心攻击者利用这种方法擦除敏感数据或整个网站。这是矫枉过正还是有更好的方法?

有什么想法吗?当然我只关心远程攻击,如果攻击者可以在我的服务器上放置一个文件并执行它,那么他们可以自己擦除磁盘。

我正在使用Joomla,如果框架提供了这些功能,请注明。

【问题讨论】:

  • 某人如何将对象注入 PHP,您是在 eval()ing/反序列化用户输入还是提取变量或其他东西?无论如何都是坏主意
  • 以@simontemplar 所说的为基础,如果有人可以从您的代码远程运行一个函数,那么您将遇到更大的问题
  • 这是 Joomla 的扩展。这不是我关心的代码(因为我已采取一切可能的步骤来确保它是安全的),但那里有成千上万的扩展,我经常看到未经验证的输入。这会导致严重的漏洞,我不想成为让攻击者有机会造成更大破坏的人。
  • removeFolder 可能包括对unlink 的调用或类似的调用。现在,如果有人足够聪明,可以向removeFolder 发送不受信任的输入,他们也可以直接对unlink 执行相同的操作——您无法阻止,也不应该在意。保护文件系统的真正方法是使用适当的权限,这样 Web 进程就无法访问不应修改的数据。
  • 问题不在于你是否偏执,而在于你是否足够偏执。我是否应该推断出我已经够偏执了?

标签: php security joomla


【解决方案1】:

首先我不认为“检查调用类名”对于助手来说是一个很好的功能。助手应该是一段通用的可重用代码,添加这个限制似乎违背了这个概念。

另一方面,您正在尝试防止在任何其他方法中误用“removeFolder”,这基本上是不可能的(内置函数如 eval 和 exec 也会出现同样的情况)。您应该在使用该函数的方法中进行验证,您应该确保所有使用该函数的方法都得到适当保护,而不是试图将“removeFolder”锁定在暗房内。

编辑:也许更偏执的措施可以使该方法“万无一失”并将其限制为删除非关键文件\文件夹。

【讨论】:

  • 你提出了很多好的观点,我喜欢你是如何抓住我的偏执狂的。
【解决方案2】:

如果您想阻止其他人轻松访问敏感的类函数,第一个选择是只将该方法设为私有,以便只能在您的类内部调用它,您可以在其中控制它的调用方式。与作为安全措施相比,这对您控制函数的使用方式更有帮助;如果有人可以运行他们自己的 PHP 脚本来调用你的类,那么该站点已经被入侵了。

如果您有一个用于清除 Joomla 缓存的 removeFolder() 调用,第一个建议是 Joomla 具有内部缓存管理功能,请参阅 JFactory::getCache("component") 和 $cache->clean(),更适合管理 Joomla 缓存对象。如果您管理自己的存储,则可以清理该函数,以便如果您想让它更安全,它只会相对于您的缓存的根起作用 - 可能最大的受益者是保护您自己不正确地使用调用。

【讨论】:

  • 很好的答案;我的组件所做的是在 Joomla 的背后使用 rm -rf 清除缓存,这是我可以真正清除高流量网站缓存的唯一方法(Joomla JCache 递归地逐个文件解析...)。因此,如果在生成新命中时正在清除缓存,则可能会在重新创建使用它们的页面后删除临时压缩资源(例如 javascripts 和 css);这将有效地破坏网站。 (这不是妄想症,它实际上发生在几个高流量的网站上)。为了保护 removeFolder() 函数而走这么远,绝对是偏执狂。
猜你喜欢
  • 2014-12-19
  • 1970-01-01
  • 2013-10-02
  • 2015-12-17
  • 1970-01-01
  • 2015-01-24
  • 2011-05-25
  • 2015-03-17
  • 2011-07-17
相关资源
最近更新 更多