- 工信部备案号 滇ICP备05000110号-1
- 滇公网安备53011102001527号
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
- CN域名投诉举报处理平台:电话:010-58813000、邮箱:service@cnnic.cn
本文仅用于安全开发与教育目的。所有示例均在本地隔离环境中演示,请勿在未授权的系统上进行测试。
SQL 注入(SQL Injection,简称 SQLi)是指攻击者通过构造恶意输入,使原本用于“数据”的字符串被数据库解析为“可执行指令”,从而绕过认证、读取/篡改数据,甚至控制服务器的漏洞。它是 OWASP Top 10 中长期位列前茅的经典漏洞,触发门槛极低,但破坏力极大。
刚接触后端开发的程序员常有以下认知盲区:
“功能跑通就行”:优先关注业务逻辑,未将“输入不可信”作为默认前提。
“前端已经校验了”:误以为前端限制输入长度或格式就能防住攻击。
“内部系统/测试环境无所谓”:忽略权限提升或内网横向移动的风险。
“拼接字符串最直观”:为图省事直接 f-string 或 + 拼接 SQL,未了解预编译机制。
假设一个简单的登录验证功能:
# 危险写法(教学示例,切勿在生产环境使用)
username = request.POST['username']
password = request.POST['password']
sql = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
cursor.execute(sql)
正常输入admin/123456时,SQL 为:
SELECT * FROM users WHERE username='admin' AND password='123456'
但若攻击者在用户名框输入:admin' --(注意 -- 后通常需跟一个空格,部分数据库要求)
最终执行的 SQL 会变成:
SELECT * FROM users WHERE username='admin' -- ' AND password='任意值'
-- 是 SQL 的注释符,其后的密码校验被直接忽略。数据库仅验证用户名,攻击者即可免密登录。
本质问题:代码将“数据”与“SQL 语法”混为一谈。数据库引擎无法区分哪些是程序员写的逻辑,哪些是用户输入的文本,从而执行了被注入的指令。
这是防御 SQL 注入最核心、最有效的方法。参数化查询会将用户输入严格作为“数据”处理,数据库会提前编译 SQL 结构,输入无法改变执行逻辑。
# 安全写法 sql = "SELECT * FROM users WHERE username=%s AND password=%s" cursor.execute(sql, (username, password)) # 参数与语句分离
主流语言/框架均内置支持:
Python: psycopg2, mysql-connector, SQLAlchemy
Java: PreparedStatement
PHP: PDO / MySQLi 预处理
Node.js: pg, mysql2 的占位符语法
校验类型、长度、格式(如邮箱、手机号正则)
拒绝包含非常规字符的输入(仅限业务允许的场景)
注意:黑名单过滤(如替换 ' 为 '')极易被绕过,仅作辅助手段。
数据库连接账号不要使用 root/sa
仅授予 SELECT、INSERT、UPDATE 等业务必需权限
禁止 DROP、GRANT、FILE 等高危操作
如 Django ORM、SQLAlchemy、Prisma、Hibernate 等。它们默认采用参数化机制,大幅降低手写 SQL 的风险。若必须手写复杂查询,仍应使用参数绑定。
前端校验仅用于提升用户体验,攻击者可轻易绕过浏览器直接发送 HTTP 请求。所有到达后端的输入都应视为不可信。
习惯 | 说明 |
|---|---|
禁用字符串拼接 SQL | 无论多简单的查询,都使用参数化 |
默认开启错误日志脱敏 | 生产环境关闭详细数据库报错,防信息泄露 |
使用自动化工具扫描 | 如 |
学习 OWASP 安全指南 | 建立系统性安全认知,而非“遇到问题才查” |
代码审查加入安全项 | 团队互相检查 SQL 拼接、权限配置、输入处理 |
SQL 注入之所以“简单”,是因为它只需一行不规范的代码就能触发;之所以“危险”,是因为一旦利用成功,往往直接击穿应用层防线。安全不是后期附加的模块,而是开发的第一性原则。从写第一行数据库交互代码开始,养成“参数化查询 + 最小权限 + 输入不信任”的习惯,将为你避开大量后期返工与线上事故。
延伸学习:OWASP SQL Injection Prevention Cheat Sheet、《Web安全深度剖析》、各语言官方数据库驱动文档。
注:本文所有技术内容仅用于提升开发安全意识与防御能力。请在合法授权的环境中进行安全测试,遵守《网络安全法》及相关合规要求。
售前咨询
售后咨询
备案咨询
二维码

TOP