清理$_GET['']
请求的最佳方法是什么?我想只允许从一个目录下载文件。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
下一步是什么?
答案 0 :(得分:13)
以下是我在那里排队后会做的事情:
if (dirname($path) === $baseDir) {
//Safe
}
基本上,在发送任何文件实际位于您支持的路径之前,请先进行检查。请注意,您还必须在文件名前添加自己的/
(在$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.php和http://php.net/manual/en/filter.filters.sanitize.php)。需要PHP> = 5.2.0,