请求清理$_GET['']
的最佳方法是什么?我想只允许从一个目录下载文件。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
下一步是什么?
请求清理$_GET['']
的最佳方法是什么?我想只允许从一个目录下载文件。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
下一步是什么?
这里是我会在行之后你有没有:
if (dirname($path) === $baseDir) {
//Safe
}
基本上,做发送任何该文件实际上是在你支持一个路径前的检查。请注意,您还必须在文件名前($path
)添加自己的/
,并将其从$baseDir
定义中删除,因为dirname()
不会留下尾随路径分隔符。
在将$_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,
而不是后检查没有相对路径碎片存在,更容易马上剥离它们。只需使用basename()
立即当你获取值:
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . basename($_GET['file']));
已经保证它不能从基本目录中向上或向下移动。
那你应该绝对不允许'..' –
这是全部吗?之后,我的脚本将是安全的? – Adrian
不,不允许使用'/'和其他文件中不存在的字符。 – jli