侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

识别并修复简单的SQL注入漏洞

2025-12-12 / 0 评论 / 4 阅读

题目

识别并修复简单的SQL注入漏洞

信息

  • 类型:问答
  • 难度:⭐

考点

SQL注入原理,参数化查询,输入验证

快速回答

SQL注入是通过恶意输入篡改SQL查询的攻击手段。防御核心方法:

  1. 使用参数化查询(预编译语句)替代字符串拼接
  2. 对输入进行严格验证(白名单过滤)
  3. 最小化数据库权限
## 解析

1. 原理说明

SQL注入是攻击者通过在输入字段插入恶意SQL代码,篡改原始SQL查询逻辑的攻击方式。例如:当使用字符串拼接构造SQL时,输入 ' OR '1'='1 可能绕过登录验证。

2. 漏洞代码示例

# 危险!字符串拼接查询
username = request.form['username']
password = request.form['password']
sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"
# 若输入 username: admin'-- 
# 查询变为:SELECT * FROM users WHERE username='admin'-- ' AND password=''

3. 修复方案(参数化查询)

# 安全:使用参数化查询
import sqlite3
conn = sqlite3.connect('db.sqlite')
cursor = conn.cursor()

# 使用 ? 作为占位符
cursor.execute(
    "SELECT * FROM users WHERE username=? AND password=?",
    (username, password)  # 参数自动转义
)

4. 最佳实践

  • 始终使用参数化查询:所有主流语言都支持(Java的PreparedStatement,PHP的PDO等)
  • 输入验证:对用户名等输入使用正则表达式限制字符(如 ^[a-z0-9_]{3,20}$
  • 深度防御:数据库连接使用最小权限账户,避免使用SA账号

5. 常见错误

  • 尝试手动转义特殊字符(易遗漏如 \ 的边界情况)
  • 仅在前端验证(攻击者可绕过前端直接提交恶意数据)
  • 依赖黑名单过滤(如仅过滤 SELECT, UNION 等关键词)

6. 扩展知识

  • ORM框架:如SQLAlchemy、Hibernate等自动使用参数化查询
  • 二次注入:即使使用参数化查询,存储未净化的数据后再次查询仍可能触发注入
  • 工具检测:使用SQLMap等工具自动化检测注入漏洞