如何清理$ _GET变量以防止路径注入?

时间:2011-11-16 21:58:41

标签: php security

清理$_GET['']请求的最佳方法是什么?我想只允许从一个目录下载文件。

$baseDir = "/home/html/xy.com/public_html/downloads/";    
$path = realpath($baseDir . $_GET['file']);  

下一步是什么?

3 个答案:

答案 0 :(得分:13)

以下是我在那里排队后会做的事情:

if (dirname($path) === $baseDir) {
    //Safe
}

http://php.net/dirname

基本上,在发送任何文件实际位于您支持的路径之前,请先进行检查。请注意,您还必须在文件名前添加自己的/(在$path中)并将其从$baseDir定义中删除,因为dirname()不会留下尾随路径分隔符。

答案 1 :(得分:3)

不是检查没有相对路径碎片存在,而是立即剥离它们更容易。只需在获取值时立即使用basename()

$baseDir = "/home/html/xy.com/public_html/downloads/";    
$path = realpath($baseDir . basename($_GET['file']));  

这已经保证它不能从你的基本目录向上或向下移动。

答案 2 :(得分:0)

在将$_GET分配给$path之前,您需要清理该值。

我建议使用PHP自己的清理功能(http://php.net/manual/en/function.filter-input.phphttp://php.net/manual/en/filter.filters.sanitize.php)。需要PHP> = 5.2.0,