清理目录路径名php

时间:2013-02-20 04:09:48

标签: php file path

基本上我想做的是:

include($_SERVER['REQUEST_URI']);

问题是,这不安全 如果它指向"/allowed/directory/"或它的子目录,那将是安全的 所以我用startsWith(“/ allowed / directory /”)测试它。

然而,我仍然害怕这样的事情:

"allowed/directory/../../bad/directory"

有没有办法检查字符串是否指向某个特定目录或其中某个子目录在php中?

(基本上应用所有的/../ - 或者我错过了另一个安全漏洞?)

2 个答案:

答案 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更好。