我处于需要允许用户下载从 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?