清除目录路径名php



基本上我想做的是:

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中效果更好。

相关内容

  • 没有找到相关文章