动态包含

时间:2009-02-05 17:01:24

标签: php dynamic include

使用$ _GET包含页面的最安全的方法是什么,而不会在数组/使用开关等中放置允许的页面。我有很多页面,所以不用谢谢。

$content = addslashes($_GET['content']);

if (file_exists(PAGE_PATH."$content.html")) { 
include(PAGE_PATH."$content.html");
}

这有多安全?

感谢。

9 个答案:

答案 0 :(得分:3)

如果检查有效模式的输入,您将会更安全地睡觉。例如假设您知道所包含的文件永远不会有子目录,并且始终是字母数字

if (preg_match('/^[a-z0-9]+$/', $_GET['page']))
{
    $file=PAGE_PATH.$_GET['page'].".html";
    if (file_exists($file))
    {
         readfile($file);
    }
}

我使用过readfile,好像.html文件只是静态的,没有必要使用include。

您的方法可能存在缺陷,即您可以设计系统中任何HTML文件的路径,并将其作为PHP执行。如果你能找到一些方法来获取你自己在文件系统上设计的HTML文件,你可以通过你的脚本执行它。

答案 1 :(得分:3)

这是非常糟糕的做法。您应该设置一个控制器来处理需要执行或检索的代码的调度,而不是尝试直接从用户提供的变量中包含它。在包含文件时,您不应该信任用户输入。你没有什么可以阻止他们包含你不想包含的东西。

答案 2 :(得分:1)

将其与只接受“a-zA-Z - ”的正则表达式匹配。

编辑:我认为阻止特定模式不是一个好主意。我喜欢像我说的那样,只接受我们知道不会导致漏洞的字符的正则表达式。

答案 3 :(得分:0)

假设“{允许”的一组页面都存在于PAGE_PATH下,那么我可能会建议如下内容:

  • 修剪页面名称
  • 拒绝以斜杠开头的页面名称(可能是绝对路径的尝试)
  • 拒绝包含..的页面名称(可能是路径遍历的尝试)
  • 明确前缀PAGE_PATH并包含(希望)安全路径

如果您的网页名称都遵循一些一致的规则,例如字母数字字符,那么你理论上可以使用正则表达式来验证,拒绝“坏”页面名称。

PHP网站上有一些more discussion of these issues

答案 4 :(得分:0)

它看起来通常很安全,因为在显示页面之前检查页面实际存在。但是,您可能希望创建一个人们无法使用有效的$ _SESSION凭据查看的页面黑名单。这可以使用数组/开关完成,也可以只在特定目录中包含所有特殊页面,然后检查它。

答案 5 :(得分:0)

您可以先扫描包含所有HTML模板的目录,然后将所有模板名称缓存到数组中,以便验证GET参数。 但即使你缓存这个数组,它仍会产生某种开销。

答案 6 :(得分:0)

别。你永远不会预料到所有可能的攻击,你会受到攻击。

如果您希望保持代码不受数组等影响,请使用包含两列ID和路径的数据库。按数字ID请求页面。忽略所有非纯数字的ID请求,而不是您的有效ID范围。如果您关注SEO,可以在链接中的数字ID之后添加任意页面名称,就像Stack Overflow那样。

数据库不需要很重。例如,您可以使用SQLite

答案 7 :(得分:0)

最安全的方法是稍微清理请求。

  1. 删除所有../
  2. 删除^\/
  3. 从那里,确保检查他们要求的文件是否存在,并且可以阅读。然后,只需include

答案 8 :(得分:-6)

你应该至少使用类似的东西来防止XSS攻击。

$content = htmlentities($_GET['page'], ENT_QUOTES, 'UTF-8');

并且addslashes不会保护您免受SQL注入。