1

基本上我想做的是:

include($_SERVER['REQUEST_URI']);

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

但是我仍然害怕这样的事情:

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

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

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

4

2 回答 2

1

PHP 函数realpath()应该从路径中删除 ../ ///。

虽然你是对的,但这可能是一个相当危险的操作。IMO 路径应限制为一组已知的字符(如“a-zA-Z_”和 / )。此外,路径字符串应限制为已知大小(如 256 个字符)。

于 2013-02-20T04:32:00.430 回答
0

一旦你确定前缀是正确的,你可以像这样使用 preg_match :

if(preg_match("#^[A-Za-z0-9/]+#", $string) {
    // correct
}
else {
    // incorrect
}

您正在检查的可变部分(非静态部分)通常希望只是字母数字。

只要您使用include包含本地 PHP 文件并正确验证您的输入(保持输入简单),您应该没问题。只是要非常小心并彻底测试。您通常希望避免将用户输入传递给敏感函数,例如include. 但是对于框架,有时很难避免这种情况。

您可以做的另一件事是拥有一个有效输入列表来进行精确比较。您可以将它放在一个 ini 文件中并使用parse_ini_file加载它。这通常是最安全的做法,只需多做一点工作。您还可以使用带有数组的 PHP 文件,这与APC配合得更好。

于 2013-02-20T04:22:36.070 回答