请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 124|回复: 0

文件操作

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-12 14:42:12 | 显示全部楼层 |阅读模式
【必须】文件类型限制
通过白名单对上传或者下载的文件类型、大小进行严格校验。仅允许业务所需文件类型上传,避免上传木马、WebShell等文件。
  1. import os
  2.   
  3. ALLOWED_EXTENSIONS = ['txt','jpg','png']
  4.   
  5. def allowed_file(filename):
  6.     if ('.' in filename and
  7.         '..' not in filename and
  8.         os.path.splitext(filename)[1].lower() in ALLOWED_EXTENSIONS):
  9.         
  10.         return filename
  11.     return None
复制代码

【必须】禁止外部文件存储于可执行目录
禁止外部文件存储于WEB容器的可执行目录(appBase)。建议使用 tempfile 库处理临时文件和临时目录。
【必须】避免路径穿越
保存在本地文件系统时,必须对路径进行合法校验,避免目录穿越漏洞
  1. import os

  2. upload_dir = '/tmp/upload/' # 预期的上传目录
  3. file_name = '../../etc/hosts' # 用户传入的文件名
  4. absolute_path = os.path.join(upload_dir, file_name) # /tmp/upload/../../etc/hosts
  5. normalized_path = os.path.normpath(absolute_path) # /etc/hosts
  6. if not normalized_path.startswith(upload_dir): # 检查最终路径是否在预期的上传目录中
  7.     raise IOError()
复制代码

【建议】避免路径拼接
文件目录避免外部参数拼接。保存文件目录建议后台写死并对文件名进行校验(字符类型、长度)。

【建议】文件名hash化处理
建议文件保存时,将文件名替换为随机字符串。
  1. import uuid

  2. def random_filename(filename):
  3.     ext = os.path.splitext(filename)[1]
  4.     new_filename = uuid.uuid4().hex + ext
  5.     return new_filename
复制代码


回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 08:15 , Processed in 0.180831 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表