我似乎无法找到参考。我假设 PHP 函数file_exists
在linux上使用系统调用,并且这些对于任何不包含\0
字符的字符串都是安全的,但我想确定
是否有人(最好是非轶事)有关此信息?如果我不先检查字符串,是否容易受到注射?
答案 0 :(得分:3)
我想你需要,因为用户可能会输入类似的内容:
../../../somewhere_else/some_file
并访问他不允许访问的文件。
我建议你在php代码中独立生成文件的绝对路径,然后通过basename()
从用户那里获取文件名称或排除包含../
的任何输入,例如:
$escaped_input = str_replace("../","",$input);
答案 1 :(得分:1)
这取决于你想要保护的内容。
file_exists
不会对磁盘进行任何写入操作,这意味着可能发生的最糟糕情况是有人获取有关您的文件系统的信息或存在的文件。
但是,在实践中,如果您稍后使用之前使用file_exists
检查过的相同文件执行某些操作,例如include
,则可能希望执行更严格的检查。
我假设您可能会将可能来自用户输入的任意值传递到此函数中
如果是这种情况,那在某种程度上取决于您实际上需要首先使用file_exists
的原因。通常,对于用户可以直接传递值的任何文件系统函数,我会尝试尽可能地过滤掉字符串。这实际上只是迂腐而且安全,在实践中可能没有必要。
因此,例如,如果您只需要检查单个目录中是否存在文件,则应该删除各种目录分隔符。
从个人经验来看,我只是将用户输入传递给file_exists
调用以映射到控制器文件,在这种情况下,我只删除任何非字母数字+下划线字符。
更新:阅读最近添加的评论,没有特殊字符,因为这不会在shell中执行。即使\0
也应该没问题,至少在较新的PHP版本上(我相信较旧的版本会在\0
发送到底层文件系统调用之前剪切字符串。)