2023-08-30 20:01:04
PHP防止目录遍历与文件下载漏洞的指南如下:
一、目录遍历漏洞的防护
1. 权限控制
确保敏感文件和目录的权限设置为仅允许服务器进程及相关用户访问,避免其他用户或第三方恶意访问。例如,通过Linux系统的chmod命令限制目录权限为750或文件权限为640,防止未授权访问。
2. 输入验证与过滤
对用户输入的文件路径进行严格过滤,禁止包含../、..等路径跳转字符。可使用正则表达式(如/^[a-zA-Z0-9_-/]+.php$/)限制输入格式,或通过PHP内置函数filter_input(INPUT_GET, 'path', FILTER_SANITIZE_STRING)过滤非法字符。
3. 使用绝对路径
在引用文件或目录时,优先使用绝对路径(如/var/www/html/uploads/),而非相对路径(如../../uploads/)。绝对路径可避免攻击者通过构造相对路径绕过限制。
4. 白名单验证
设定允许访问的目录白名单,仅允许用户访问特定路径下的文件。例如,通过basename()函数提取文件名,并检查其是否位于预设目录中(如/var/www/html/safe_dir/)。
二、文件下载漏洞的防护
1. 合法性检查
对用户请求的文件进行多维度验证,包括扩展名(如仅允许.pdf、.jpg)、MIME类型(通过finfo_file()函数检测)及文件大小(限制最大下载字节数)。同时,强制文件必须位于预设的安全目录内。
2. 文件名转换
将用户上传的文件名替换为随机字符串或哈希值,避免直接使用原始名称。例如,通过uniqid()或md5()生成唯一标识,并存储原始文件名与随机名的映射关系。
3. 下载权限控制
结合用户认证与授权机制,确保仅授权用户可下载文件。例如,在下载前检查用户会话($_SESSION['user_id'])是否匹配文件权限表中的记录,或通过API令牌(JWT)验证身份。
4. 禁用危险函数
避免使用readfile()、file_get_contents()等直接输出文件的函数,改用安全的替代方案(如通过数据库存储文件路径,并在验证后通过流式传输下载)。
总结
目录遍历与文件下载漏洞的根源在于未对用户输入进行充分验证和权限控制。通过权限隔离、输入过滤、路径规范化及白名单机制,可显著降低此类风险。开发人员应定期审计代码,并参考OWASP等安全标准更新防护策略,以应对新型攻击手段。