什么是字段映射逻辑(表字段部分防注入)

字段映射逻辑是指 在后端预先定义一个“白名单”或映射表,
将前端传入的字段名称与实际数据库中的字段名称建立安全且固定的对应关系,
而不是将前端传入的原始字符串直接拼接到 SQL 语句中,从而避免 SQL 注入漏洞。

1. 问题背景

通常,数据库的字段名称应由后端来控制,保证只能操作预定义的字段。若前端能直接传入任意字段名,则可能被攻击者利用,例如传入 'id; DROP TABLE users' 这类恶意字符串,导致 SQL 注入攻击和数据库破坏。


2. 字段映射逻辑的原理

映射关系的建立

  • 后端开发人员在系统设计阶段,提前定义一份字段映射表(或白名单),明确哪些前端传入的标识符可以对应到哪些实际的数据库字段。例如:
    # 定义允许通过前端选择的字段映射关系
    allowed_fields = {
        "username": "user_name",
        "email": "user_email",
        "created": "created_at",
        # 其他允许的字段映射...
    }
    

校验与转换过程

  • 接收前端请求: 当前端传入一个字段名时(例如用于排序、筛选或查询),后端首先不会直接使用它,而是先在 allowed_fields 中查找该字段名是否存在。
  • 合法性验证: 如果前端提交的字段名称正是预定义映射中的一个键,则继续操作;否则,直接返回错误,拒绝该请求。
  • 转换为安全字段: 若验证通过,则使用映射表中对应的真实数据库字段名来组装 SQL,而不使用原始输入。这样即使攻击者在前端传入复杂或嵌入 SQL 语句的字符串,也只能匹配不到映射表中的键,系统便会拦截这次请求。

3. 实际应用举例

假设有一个需求:前端允许根据某个字段进行排序排序,用户可以选择 usernamecreated 进行排序。如果直接将用户输入拼接到 SQL 中,可能会出现如下问题:

不安全写法(直接拼接):

SELECT * FROM users ORDER BY [用户输入的字段];

攻击者可以输入类似 "username; DROP TABLE users" 这样的恶意代码。

安全写法(使用字段映射):

# 获取前端请求的字段参数
field_input = request.args.get("sort_field")
# 查找安全映射
if field_input in allowed_fields:
    actual_field = allowed_fields[field_input]
else:
    raise Exception("非法字段参数")

query = f"SELECT * FROM users ORDER BY {actual_field}"

在这种情况下,即使攻击者尝试传入恶意字符串,也不会在 allowed_fields 中匹配到,进而无法进入 SQL 组装阶段。


posted @ 2025-04-19 18:42  kuki'  阅读(61)  评论(0)    收藏  举报