Web 安全攻防实战
OWASP Top 10、XSS/CSRF/SQL注入/SSRF 防御
- 理解 OWASP Top 10 安全风险
- 掌握 XSS/CSRF/SQL注入/SSRF 的防御
- 理解认证安全和密码哈希
- 掌握安全头和传输安全
Web 安全攻防实战
安全不是功能,是底线。一个 SQL 注入漏洞可能拖垮整个数据库。这节课覆盖 Python Web 开发中最常见的安全问题。
SQL 注入
XSS(跨站脚本)
CSRF(跨站请求伪造)
CSRF:利用用户已登录的身份发起伪造请求攻击场景:用户登录了 bank.com用户访问了恶意网站 evil.comevil.com 有一个表单自动提交到 bank.com/transfer浏览器自动带上 bank.com 的 cookie转账成功! 防御:CSRF Token(Django: {% csrf_token %},每次请求验证)SameSite Cookie 属性(Lax/Strict)验证 Origin/Referer 头敏感操作需要二次验证(密码/验证码) SameSite Cookie:Strict: 完全不允许跨站发送cookie(最安全,体验差)Lax: 允许顶级导航的GET请求带cookie(默认,平衡)None: 允许跨站(必须配合Secure) FastAPI 需要手动实现 CSRF 保护Django 内置 CsrfViewMiddlewareCSRF防御:Token + SameSite Cookie + Origin验证
认证安全与密码哈希
密码用 bcrypt/argon2/PBKDF2 哈希,加盐,别明文存,别用 MD5SQL 写参数化的用户输入要转义、校验生产环境必须用 HTTPSJWT 密钥要 256bit+,设过期时间SECRET_KEY/API Key 别提交到 Git文件上传要验证类型、用随机文件名、隔离存储定期用 pip-audit 扫依赖漏洞。
安全头与传输安全
SSRF:服务端请求伪造
SSRF 是攻击者让服务器请求内网地址的漏洞:
# SSRF 攻击场景:
# 一个图片代理功能:
# GET /proxy?url=http://example.com/img.jpg
# 攻击者改为:
# GET /proxy?url=http://169.254.169.254/latest/meta-data/
# 169.254.169.254 是云服务器元数据地址!
# 可以获取临时凭证、IAM角色信息
# 防御:
# 1. URL 白名单(只允许指定域名)
# 2. 禁止访问内网IP(10.x/172.16-31.x/192.168.x/127.x/169.254.x)
# 3. 禁用重定向(或验证重定向目标)
# 4. 使用独立的网络命名空间/出口IP
# 5. DNS rebinding 防护(先解析IP验证,再用IP连接)防御 SQL 注入的正确方式是?
密码应该用什么算法存储?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
正确顺序通常是:先写能跑的单体,但内部清晰分层(路由/业务/数据)、模块边界明确、有测试覆盖;等团队规模、流量和独立发布诉求真的上来,再按「变更频率、负载特征、独立性」去拆服务。过早微服务会把单机内的函数调用变成跨网络调用,带来分布式事务、链路排查、运维复杂度等一堆难题。
挑战任务
密码哈希验证器
实现密码哈希和验证函数,使用 PBKDF2 + salt。
课后作业
输入验证器
写一个函数验证用户输入,防止 XSS,过滤转义 HTML 特殊字符。