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