1

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

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

if (file_exists(PAGE_PATH."$content.html")) {
包括(PAGE_PATH。“$content.html”);
}

那有多安全?

谢谢。

4

9 回答 9

3

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

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

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

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

于 2009-02-05T17:10:09.793 回答
3

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

于 2009-02-05T17:10:41.323 回答
1

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

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

于 2009-02-05T17:09:48.220 回答
0

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

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

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

PHP 网站上有更多关于这些问题的讨论。

于 2009-02-05T17:09:08.190 回答
0

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

  1. 去掉任何../
  2. 剥离^\/

从那里,确保您检查他们请求的文件是否存在并且可以读取。那么,就include这样吧。

于 2009-02-05T17:27:15.003 回答
0

它看起来通常是安全的,因为您在显示页面之前检查页面是否确实存在。但是,您可能希望创建一个人们不应使用有效 $_SESSION 凭据查看的页面的黑名单。这可以通过数组/开关来完成,或者您可以简单地将所有特殊页面放在某个目录中,然后进行检查。

于 2009-02-05T17:10:14.397 回答
0

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

于 2009-02-05T17:10:23.133 回答
0

不。你永远不会预料到所有可能的攻击,你会被黑客入侵。

如果您想让您的代码不使用数组等,请使用具有两列 ID 和路径的数据库。通过数字 ID 请求页面。忽略所有对不是纯数字且不在您的有效 ID 范围内的 ID 的请求。如果您担心 SEO,您可以在链接中的数字 id 之后添加任意页面名称,就像 Stack Overflow 一样。

数据库不必是重型的。例如,您可以使用SQLite

于 2009-02-05T17:12:25.313 回答
-6

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

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

并且 addlashes 不会保护您免受 SQL 注入的侵害。

于 2009-02-05T17:05:11.333 回答