我处于这样一种情况,我需要允许用户下载从URL动态确定的文件.在下载开始之前,我需要进行一些身份验证,因此下载必须先通过脚本运行.所有文件都将存储在Web根目录之外,以防止手动下载.
例如,以下任何一个都可以是下载链接:
http://example.com/downloads/companyxyz/overview.pdf
http://example.com/downloads/companyxyz/images/logo.png
http://example.com/downloads/companyxyz/present/ppt/presentation.ppt
基本上,文件夹深度可以变化.
为了防止目录遍历,比如说:http: //example.com/downloads/../../../../etc/passwd 我显然需要对URI进行一些检查.(注意:我没有选择将此信息存储在数据库中,必须使用URI)
以下正则表达式是否可以确保用户不输入可疑内容:
preg_match('/^\/([-_\w]+\/)*[-_\w]+\.(zip|gif|jpg|png|pdf|ppt|png)$/iD', $path)
我有什么其他选择来确保URI是理智的吗?可能在PHP中使用realpath?
我建议使用realpath()
将路径转换为绝对路径.然后,您可以将结果与允许目录的路径进行比较.