is_file($ _ GET)和安全性

时间:2010-12-18 10:57:08

标签: php file-io get

我在我的PHP文件上使用此代码来加载缓存文件,我担心它是否足够安全:

//quick! load from cache if exists!
if (is_file('cache/'.($cachefile=basename('/',$_GET['f']))))
{
    header('content-type: text/css');
    require('cache/'.$cachefile);
    die(); //ALL OK, loaded from cache
}

编辑:我还想知道它是否存在,它是如何被利用以及如何以安全的方式重写它。

编辑2:我编辑了以前代码中的代码,我不知道我怎么能认为is_file会过滤坏路径>。<

编辑3:再次更改,因此它使用basename()代替end(explode()),并且还在重复代码时将包含更改为在第一次比较期间将值分配给变量(或文件检查)。

我从不只是include($_GET),但是今天,我以某种方式认为is_file会过滤掉可能会损害我系统的路径。我不知道怎么做。

谢谢

3 个答案:

答案 0 :(得分:3)

我可以发送$_GET['f'] = '../../database_passwords.xml' ...

使用basename除去传递路径的最后一段以外的任何内容。或者,构造路径,然后计算对应的绝对路径,并检查它是否仍在cache/内。

答案 1 :(得分:2)

BAD!

怎么样:

page.php?f=../../../../../etc/password

永远不要做这样的事情

根据白名单或“[a-z] + .php”

等特定模式检查f

答案 2 :(得分:1)

不,不是。我可以将'../../anypath'放入$_GET['f']并访问您服务器上的任何文件,即使是www root以外的文件。

[编辑] 如果你检查值中的'/'和其他无效字符会更安全。如果该文件名仅包含字母数字字符._,则非常安全。