讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python开发中防范Web应用的XSS与CSRF攻击

云雪同学_8356

云雪同学_8356

发布时间:2026-10-10 08:40:30

|

912人浏览过

|

来源于php中文网

原创

XSS防护核心是上下文感知编码:HTML、JS、URL等不同上下文需用对应编码方式,CSRF需Token绑定会话且严格校验,CSP须全面配置并禁用unsafe选项,DOM型XSS需后端对API返回字段预清洗。

如何在python开发中防范web应用的xss与csrf攻击

直接输出用户输入前必须做上下文感知编码

不加处理地把 user_input 插进 HTML、JS 或 URL,等于主动给 XSS 开门。关键不是“要不要转义”,而是“在哪种上下文中用哪种编码”。比如:user_input 被塞进 <div>{{ user_input }}</div>,用 HTML 实体编码(、<code>>)就够了;但若写进 <script>var data = "{{ user_input }}";</script>,光 HTML 编码没用,得用 JS 字符串编码,否则引号闭合后仍可注入。

常见错误现象:

Galileo python sdk
Galileo python sdk

Galileo AI 平台 Python SDK 完整参考,用于评估、监控和保护 GenAI 应用,适用于构建 Python 应用。

下载
  • 用 html.escape() 处理所有场景,结果在 JS 上下文中被绕过
  • 前端用 innerHTML 渲染服务端返回的富文本,却没走白名单过滤
  • URL 参数拼进 <a href="xxx"> 时,忘了对 &、= 做 URL 编码

实操建议:

  • Flask 模板中默认开启自动转义,但遇到 {{ user_input | safe }} 要立刻警觉,确认该内容是否真的可信
  • Django 模板同理,禁用 |safe 或 mark_safe() 前,必须确保已做过白名单清洗(如用 bleach.clean())
  • 纯 Python 后端生成 HTML 片段时,优先用 html.escape(user_input, quote=True),且只用于 HTML 文本上下文

CSRF Token 必须绑定会话且一次性验证

CSRF 防御失效,90% 是因为 Token 没和用户 session 绑死,或验证逻辑被绕过。Token 不是贴个标签就完事,它得满足:由服务端生成、与当前 session ID 关联、每次敏感请求都校验、校验失败立即拒绝且不泄露原因。

立即学习“Python免费学习笔记(深入)”;

常见错误现象:

  • Token 存在客户端 localStorage,被跨域页面读取复用
  • POST 请求未携带 Token 时,后端只打日志不拦截,攻击者可暴力试探
  • 使用全局固定 Token(如配置文件里写死),所有用户共享一个值

实操建议:

  • Flask 中用 flask-wtf 的 CSRFProtect,它默认将 Token 加密后存入 session,并在表单渲染时自动注入 <input type="hidden" name="csrf_token">
  • FastAPI 中推荐用 fastapi-csrf-protect 库,它支持自定义加密密钥、Token 过期时间、以及 SameSite=Lax 的 Cookie 设置
  • 手动实现时,Token 值必须调用 secrets.token_urlsafe(32) 生成,不能用 random 模块

Content-Security-Policy 头不能只配 script-src

CSP 是最后一道防线,但很多人只加了 script-src 'self' 就以为万事大吉。其实攻击者早就不靠 <script> 标签了——onerror、javascript: 伪协议、内联样式里的 expression()(IE)、甚至 <img src=x onerror=...> 都能绕过简单配置。

实操建议:

  • 至少覆盖 default-src 'self'、script-src 'self' 'unsafe-inline' 'unsafe-eval'(如果真要用内联脚本,就明确写出来,别留空)、style-src 'self' 'unsafe-inline'、img-src *、connect-src 'self'
  • 开发期先用 Content-Security-Policy-Report-Only 头配合 report-uri 收集违规行为,再逐步收紧
  • 避免在 CSP 中放 'unsafe-inline' 或 'unsafe-eval',除非你清楚每个用到它们的地方,并已做好其他补偿措施

DOM型XSS最容易被Python后端开发者忽略

Python 后端管不到 DOM 操作,但很多漏洞源头恰恰来自后端返回的数据结构。比如接口返回 JSON:{"searchTerm": "<script>alert(1)</script>"},前端用 document.write(data.searchTerm) 或 el.innerHTML = data.searchTerm 直接渲染,就触发 DOM 型 XSS。后端没法阻止前端乱写,但可以控制返回什么。

实操建议:

  • 对所有 API 接口的字符串字段,预设过滤规则:移除 <script、on\w+=、javascript: 等危险模式(用正则要谨慎,优先用成熟库如 bleach)
  • 返回 JSON 前,对可能被前端当作 HTML 渲染的字段(如 title、content、description)统一做 HTML 编码,哪怕前端暂时不用,也留出安全余量
  • 在 Swagger 或 OpenAPI 文档中标明哪些字段是“纯文本”,哪些是“允许 HTML”,并要求前端团队严格按约定使用

真正难防的不是那些显眼的 <script>,而是 location.hash、document.referrer、URLSearchParams 这些看似无害的浏览器 API 被前端拿来直插 DOM —— 后端能做的,是在数据出口处多一道清洗,别让危险字符串流出去。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1691

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4244

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1689

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24717

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3027

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3047

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn