【问题标题】:Dynamic Include Safety动态包括安全
【发布时间】:2010-10-06 05:03:59
【问题描述】:

有什么方法可以安全地包含页面而不将它们全部放入数组中?

if (preg_match('/^[a-z0-9]+/', $_GET['page'])) { $page = $_GET['page'].".php"; $tpl = $_GET['page'].".html"; if (file_exists($page)) 包含($page); if (file_exists($tpl)) 包括($tpl); }

我应该添加什么以使其非常安全?

我这样做是因为我不喜欢必须包含必须包含在所有页面上的内容。 “包含页眉 > 内容 > 包含页脚”方式。我也不想使用任何模板引擎/框架。

谢谢。

【问题讨论】:

    标签: php security


    【解决方案1】:

    您当前实施的弱点是……

    1. 正则表达式只测试字符串的开头,所以“images/../../secret”会通过,并且
    2. 无需进一步验证,“index”也将是一个有效值并会导致递归。

    为了确保您的实施安全,最好将所有要包含的内容放在自己的目录中(例如“includes”和“templates”)。基于此,你只需要确保这个目录没有出路。

    if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) {
        $page = realpath('includes/'.$_GET['page'].'.php');
        $tpl = realpath('templates/'.$_GET['page'].'.html');
        if ($page && $tpl) {
            include $page;
            include $tpl;
        } else {
            // log error!
        }
    } else {
        // log error!
    }
    

    注意:realpath 如果文件存在则返回给定相对路径的绝对路径,否则返回false。所以file_exists 是不必要的。

    【讨论】:

      【解决方案2】:

      尽管您说过不想将可用页面列表存储在数组中,但它可能是最好的非数据库解决方案。

      $availFiles = array('index.php', 'forum.php');
      if(in_array($_GET['page'].".php", $availFiles))
       {
         //Good
       }
      else
       {
         //Not Good
       }
      

      您可以使用 DB 查询或读取文件,甚至读取目录的内容并过滤掉您不想要的内容,轻松地动态构建数组。

      【讨论】:

      • 哇,我发布了这个答案并刷新了你已经发表了评论.. 很快。
      • +1;阅读目录内容并过滤掉东西是一个很好的快乐媒介
      • 读取目录内容并过滤掉内容将是我将您的应用返回给您以修复实现的原因。如果您有 100,000 个用户,您会持续读取文件权限吗?如果您要这么懒,请缓存它并生成胶水代码或其他东西来处理它。
      【解决方案3】:

      我同意 Unkwntech。这是一种将文件包含到您的网站中的不安全方式,我希望 PHP 程序员能够完全取消它。即便如此,包含所有可能匹配项的数组肯定更安全。但是,您会发现MVC pattern 效果更好,而且更安全。我会下载 code igniter 并学习一两个教程,您会喜欢它的原因与您想使用动态包含的原因相同。

      【讨论】:

        【解决方案4】:

        您不应该将用户提供的信息用于包含。您应该始终拥有某种类型的请求处理程序来为您执行此操作。虽然正则表达式可能会过滤某些内容,但它不会过滤所有内容。

        如果您不希望您的网站被黑客入侵,则不允许您的用户通过指定包含来控制应用程序的流程。

        【讨论】:

        • 正则表达式不会过滤哪些内容?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 2022-08-10
        • 2012-02-05
        • 2010-11-22
        • 2010-11-04
        相关资源
        最近更新 更多