【问题标题】:Security in including file even using is_file即使使用 is_file 包含文件的安全性
【发布时间】:2013-10-08 18:26:54
【问题描述】:

我在 Stackoverflow 学到了很多东西,这是我最喜欢的编程网站,在这里研究我找到了许多问题的答案。 现在我已经完成了我需要知道的代码:它有任何安全漏洞吗?

它需要从 url 中获取域名,以便查看目录中是否存在包含该表达式的 var 文件并输出其内容。 非常感谢您的帮助!

如果我使用 htmlspecialchars 和 preg_replace 清理 HTTP_HOST 就足够了吗?使用 strip_tags 将是矫枉过正,不是吗?从数组中删除那些特殊字符也是多余的,你不觉得吗?

编辑

我将更改代码并为包含文件本身添加保护。非常感谢!

【问题讨论】:

  • 您永远不应该让任何用户提供的数据到达任何处理文件系统的操作附近,尤其是在像include 这样危险的操作中。这并不容易被利用,但我相信有人可以弄清楚如何做到这一点。
  • 为什么要检查域名的文件是否存在?您是否知道 HTTP_HOST 是用户提供的 var,它几乎可以包含任何内容?
  • 这对我来说一直是个难题,但我确实需要从 HTTP_HOST 获取域。如果我不仅可以去除域扩展名,还可以去除 "/" 、 "." , "=" , ";"等等,难道不能解决问题吗?
  • @echolearning 你不能简单地保留一个白名单吗?
  • 为什么不呢?您绝对可以使用某些 url,因为只有您控制的域才会包含 *var.php 文件。

标签: php security include sanitize whitelist


【解决方案1】:

没有。您应该使用允许的表达式的白名单。对于像include 这样危险的事情,您绝对不想依赖黑名单和简单的清理。

您还可以硬编码哪个目录包含您的 PHP 文件。

【讨论】:

  • 如果白名单有数千个条目,服务器上会不会很困难?
  • 这是否意味着您将拥有数千个 *var.php 文件?我错过了什么吗?
  • 正确,但它们是非常简单的文件,我有 Litespeed,打开它们不是问题,可能是 php 处理时间,因此是我的问题。但是如果没有白名单的替代品......
  • 我只是说:您收集的*var.php 文件已经列入白名单。
  • 使用白名单解决方案,我应该创建一个手动列表以便在服务器上更快更轻吗?
【解决方案2】:

假设您将所有*var.php 文件保存在一个特殊目录中(假设为/var/www/include/vars/),您可以将它们读入一个数组,并将选择限制在该数组的边界内,而不仅仅是is_file()ing:

$vardir='/var/www/include/vars/';
$varfiles=array();
foreach(scandir($vardir) as $fn)
  if(($fn!='.')&&($fn!='..'))
    $varfiles[]="$vardir$fn";

/* Next, do whatever sanitizing you see fit */

if(array_find($fnvar)) include_once $fnvar;

请注意,这实际上一个白名单,在 cmets 中提到:如果您在$vardir 目录中创建一个新的{xyz}var.php,您实际上是在白名单中插入一个新条目.

正如@ack__ 所指出的那样,您无法以某种方式避免白名单...

【讨论】:

  • 非常感谢详细的回答。我的问题是该检查的处理时间/负载:/
  • 嗯,您的问题是特定于安全性的。如果您决定采用这种方式,我相信您可以使用大量优化技术。
  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2014-11-24
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多