5

如果可以,我有一个问题。我有一个名为的变量$source,它应该包含文件的相对路径,例如./uploads/2012/some-document.pdf

现在,这个$source变量将包含用户输入,通过 $_GET 和 $_POST。我不希望人们输入 URL,我只想在文件仅存在于本地服务器上时做一些事情

我的问题是检查文件是否仅存在于本地服务器上的最佳方法是什么?


这是我到目前为止所得到的:

1)file_exists可能会根据服务器配置返回 true,因此我可以将它与 stripos 一起使用来检查字符串的前几个字符是否为 http:// ,如下所示:

if( file_exists($source) && stripos($source,'http://')!==0 ) {
    echo 'File exists on local';
}

但是,缺点是我必须指定所有不同的 URL 类型,例如 https://、http:// 和 ftp://,以确保安全。

2)我realpath用来获取文件的绝对路径,如果找不到则返回false。这似乎很可靠,但不是 100% 这是最好的应用程序

3) 用于preg_replace首先删除字符串中的所有 URL 提及,然后简单地使用file_exists. 虽然这可能是最安全的,但它很可能是最密集的,我不想使用这种方法。

4

2 回答 2

4

除了其他答案之外,您还可以简单地拒绝使用方案的路径:

if (parse_url($path, PHP_URL_SCHEME)) {
    // has something:// so ignore
}

这也适用于特殊包装器,例如php://,zlib://等...

您还可以通过添加前缀来强制对输入变量进行本地检查file://

file_exists('file://' . $path);
于 2012-05-11T21:28:17.143 回答
2

realpath()(与file_exists)一起去。它将为您过滤掉 URL,并且您应该得到关于文件是否存在的可靠结果。

于 2012-05-11T21:20:51.520 回答