12.1 安全深入实践 本节摘要:安全加固不是买一个产品,而是按清单逐项施工。本节用 Django 自带的安全检查工具先做体检,再依次落地传输加密、安全响应头、上传文件防护与依赖漏洞巡检。每一项都对应一类真实攻击,理解"防的是谁"比记住配置更重要。 先做体检 Django 自带一个部署检查命令,专门扫描生产配置里的安全隐患: 对着墨迹博客跑一遍,输出一串警告:DEBUG 未关、SECRETKEY 硬编码、SECURESSLREDIRECT 未开启、未配置 HSTS。这个清单就是本章的施工图——每一条警告背后都是一类攻击:DEBUG 泄露报错页里的配置与源码片段,攻击者最喜欢看这个;SECRETKEY 泄露则可伪造会话 Cookie 与密码重置令牌。
本节摘要:安全加固不是买一个产品,而是按清单逐项施工。本节用 Django 自带的安全检查工具先做体检,再依次落地传输加密、安全响应头、上传文件防护与依赖漏洞巡检。每一项都对应一类真实攻击,理解"防的是谁"比记住配置更重要。
Django 自带一个部署检查命令,专门扫描生产配置里的安全隐患:
python manage.py check --deploy
对着墨迹博客跑一遍,输出一串警告:DEBUG 未关、SECRET_KEY 硬编码、SECURE_SSL_REDIRECT 未开启、未配置 HSTS。这个清单就是本章的施工图——每一条警告背后都是一类攻击:DEBUG 泄露报错页里的配置与源码片段,攻击者最喜欢看这个;SECRET_KEY 泄露则可伪造会话 Cookie 与密码重置令牌。
逐项修:DEBUG 关掉、密钥放进环境变量、强制 HTTPS 跳转。改完再跑一遍检查,警告清零才继续。
# 生产配置摘录 SECURE_SSL_REDIRECT = True # 全站 HTTP 跳 HTTPS SESSION_COOKIE_SECURE = True # Cookie 只走加密通道 CSRF_COOKIE_SECURE = True SECURE_HSTS_SECONDS = 31536000 # 一年 内置 HTTPS only SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_CONTENT_TYPE_NOSNIFF = True # 禁 MIME 嗅探 SECURE_REFERRER_POLICY = "same-origin" X_FRAME_OPTIONS = "DENY" # 禁被嵌入 iframe 防点击劫持
每个头防的攻击不同,值得各自理解一遍。HSTS 告诉浏览器"一年内本站只用 HTTPS 访问",掐灭中间人在咖啡店 WiFi 下发假 HTTP 页面的降级攻击;nosniff 阻止浏览器把图片文件当脚本执行,堵死上传漏洞的利用链;X-Frame-Options 拒绝被恶意站点 iframe 嵌套,否则攻击者可以在你的登录页上叠一层透明按钮,诱导点击。安全头的共同点:一次配置,浏览器强制执行,服务端零运行时开销——性价比极高的一类防御。
文件上传是内容型站点最大的攻击面。墨迹博客支持上传头像与文章配图,三道闸门:
def validate_image(file): if file.size > 2 * 1024 * 1024: raise ValidationError("图片不能超过 2MB") if not file.content_type.startswith("image/"): raise ValidationError("只能上传图片") return file # 媒体根目录由独立域名或对象存储提供 MEDIA_URL = "/media/"
第一道闸限大小与类型;第二道闸在保存时统一重写文件名为随机 UUID 加白名单后缀,用户原始文件名里的路径穿越片段(比如点点斜杠开头)彻底作废;第三道闸最关键——媒体文件由 Nginx 直接服务且禁用脚本执行,就算真有人传上来一个伪装成图片的脚本,Web 服务器也只当静态字节吐回去,不交给任何解释器。上传目录一旦能执行代码,整台服务器就交出去了。还有个容易忽略的细节:图片内容也要校验,用 Pillow 真正打开一次再保存,既验证了文件确实是图片,又顺手剥掉了嵌在图片元数据里的恶意载荷——只查后缀名是防不住把脚本改名的把戏的。
供应链是近年出事最多的环节:你引用的某个 pip 包被投毒或曝出漏洞,你的站点就跟着中招。定期跑:
pip list --outdated safety check
把依赖升级排进维护节奏——每月一次小版本跟进,每年一次大版本评估。升级前先跑第 9 章建立的测试体系,测试绿了才上预发。
备份是最后一道且最可靠的一道防线。数据库每日全量加增量、媒体文件同步到对象存储、导出的备份每季度真的恢复演练一次——没恢复过的备份等于没有备份。有一次演练时发现备份文件损坏,提前补救,比上线后才发现要便宜一百倍。
除了这些可见的工程项,还有一类"人的漏洞"需要制度堵:账号共享。墨迹博客早期三个编辑共用一个管理员账号,谁改的配置无从追溯,账号泄露也无人能定位。治理方法很直接:每人独立账号、按角色进组、离职当天移除——第 7 章的分组体系在这里再次兑现价值。再配合 Admin 后台的日志记录(谁在什么时间改了什么对象),操作可追溯性就完整了。安全体系的三根支柱至此齐备:技术防线(传输、头部、上传、依赖)、数据防线(备份与演练)、管理防线(账号与审计)——三者缺一,防线就是纸糊的。
安全加固完成,项目生命周期进入常态化维护。下一节把十二章的旅程按时间轴复盘一遍。