基本上我想做的是:
include($_SERVER['REQUEST_URI']);
问题是,这是不安全的
如果它指向"/allowed/directory/"
或它的子目录,它将是安全的
所以我用startsWith("/allowed/directory/")来测试这一点
然而,我仍然害怕这样的事情:
"allowed/directory/../../bad/directory"
有没有一种方法可以检查字符串是否指向php中的特定目录或其
子目录之一
(基本上应用了所有/../-或者我错过了另一个安全漏洞?)
PHP函数realpath()
应删除..////从路径。
虽然你是对的,但这可能是一个相当危险的操作。IMO路径应限制为一组已知的字符(如"a-zA-Z_"和/)。此外,路径字符串应限制为已知大小(如256个字符)。
一旦确定前缀是正确的,就可以像这样使用preg_match:
if(preg_match("#^[A-Za-z0-9/]+#", $string) {
// correct
}
else {
// incorrect
}
您要检查的可变部分(非静态部分)通常希望只是字母数字。
只要您使用include
来包含本地PHP文件并正确验证您的输入(保持输入简单),就应该可以了。只要非常小心,彻底地测试。您通常希望避免将用户输入传递到敏感函数(如include
)中。但有了框架,有时很难避免这种情况。
你可以做的另一件事是有一个有效输入的列表来进行精确的比较。您可以将其保存在ini文件中,然后使用parse_ini_file加载它。这通常是最安全的做法,只需要多做一点工作。您还可以使用带有数组的PHP文件,这在APC中效果更好。