使用$ _GET包含页面的最安全的方法是什么,而不会在数组/使用开关等中放置允许的页面。我有很多页面,所以不用谢谢。
$content = addslashes($_GET['content']); if (file_exists(PAGE_PATH."$content.html")) { include(PAGE_PATH."$content.html"); }
这有多安全?
感谢。
答案 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)
最安全的方法是稍微清理请求。
../
^\/
从那里,确保检查他们要求的文件是否存在,并且可以阅读。然后,只需include
。
答案 8 :(得分:-6)
你应该至少使用类似的东西来防止XSS攻击。
$content = htmlentities($_GET['page'], ENT_QUOTES, 'UTF-8');
并且addslashes不会保护您免受SQL注入。