Python Web开发如何防范SQL注入_使用参数化查询与ORM实践

SQL注入发生在将用户输入拼接到SQL语句中的任何位置,尤其是用format()、%或+拼接时;必须使用参数化查询,并对表名、字段名等结构化部分做白名单校验。SQL注入到底在哪儿发生不是所有拼接字符串的地方都危险,但所有用 format()、% 或 + 拼接用户输入进 SQL 语句的位置,都是高危点。比如 SELECT * FROM users WHERE name = '{}'".format(request.args.get('name')) ------ 这种写法只要用户传入 ' OR '1'='1,就直接绕过验证。本质问题不是"用了原生 SQL",而是"把不可信数据当代码执行"。ORM 也不是银弹:手写 filter("name = '{}'".format(...)) 同样会中招。原生 SQL 必须用 execute() 的参数化接口Python DB-API(如 sqlite3、psycopg2、pymysql)都支持占位符,但语法不统一,混用就会出错:sqlite3 只认 ? 或 :name,不支持 %spsycopg2 只认 %s,且必须用元组或字典传参,不能用列表pymysql 支持 %s,但不支持命名参数 %(...)s(除非开启 named=True)错误示例:cursor.execute("SELECT * FROM user WHERE id = %s", user_id) ------ 在 psycopg2 中会报 TypeError: not all arguments converted,因为期望元组,给了列表。立即学习"Python免费学习笔记(深入)";正确写法(以 psycopg2 为例):cursor.execute("SELECT * FROM user WHERE id = %s", (user_id,))Django ORM 不等于自动免疫Django 查询集默认安全,但三个地方容易翻车:extra() 和 raw():直接执行原始 SQL,参数必须手动用 params=... 传入,不能拼接filter(**{field_name: value}):如果 field_name 来自用户输入(比如搜索字段名),会触发动态字段注入Q 对象组合时用了 eval() 或字符串格式化构造表达式典型错误:User.objects.filter(**{request.GET.get('sort_by', 'id'): 'asc'}) ------ 用户传 sort_by=dict 就能读取内部对象结构。 Julius AI Julius AI是一款功能强大的AI数据分析工具,可以快速分析和可视化复杂数据。

相关推荐
DLYSB_3 小时前
存储运维实战:基于 Ceph Event 监听与 Python 适配器的分布式存储健康度物理声光响应架构
运维·ceph·python·报警灯
阿童木写作4 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
阿童木写作5 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
就是一只白6 小时前
复制地理信息python版本
python
凌虚6 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
看浪的路人7 小时前
第1讲:Agent 到底是什么?和 Chatbot 有什么区别
python·ai
五阿哥永琪7 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善7 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
瓦学妹7 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
天天爱吃肉82188 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车