导读:本期聚焦于小伙伴创作的《如何基于正则表达式实现SQL注入防御的输入清洗技术方案》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何基于正则表达式实现SQL注入防御的输入清洗技术方案》有用,将其分享出去将是对创作者最好的鼓励。

SQL注入攻击的核心是利用未经过滤的用户输入拼接SQL语句,改变原有查询逻辑。基于正则表达式的输入清洗方案,就是通过预设规则匹配输入中的危险内容,在输入进入SQL执行流程前完成过滤或转义,从根源上阻断注入路径。

如何基于正则表达式实现SQL注入防御的输入清洗技术方案

核心防御原理

SQL注入常用的危险元素包括特殊字符和SQL关键字两类,正则表达式可以精准匹配这两类内容:

  • 特殊字符:单引号'、双引号"、分号;、注释符--/* */、括号()等,这类字符常被用来闭合原有SQL语句结构。
  • SQL关键字:SELECTINSERTUPDATEDELETEUNIONEXECORAND等,这类关键字常被用来构造新的查询逻辑。

输入清洗的逻辑就是遍历用户输入字符串,用正则表达式匹配上述危险内容,根据业务需求选择直接拒绝请求、替换危险字符为空、或者对危险字符进行转义处理。

正则表达式编写规则

编写清洗用的正则表达式需要覆盖常见注入场景,同时避免过度过滤影响正常业务输入。以下是通用的规则参考:

1. 危险字符匹配正则

匹配常见注入特殊字符的正则表达式如下:

['"\;\-\-\/\*\(\)]

该正则可以匹配单引号、双引号、反斜杠、分号、双减号、斜杠、星号、括号这些常用于注入的特殊字符。

2. SQL关键字匹配正则

匹配常见SQL关键字的正则表达式如下,不区分大小写:

(?i)(SELECT|INSERT|UPDATE|DELETE|UNION|EXEC|OR|AND|DROP|TRUNCATE|DECLARE)

其中(?i)表示后续匹配不区分大小写,覆盖关键字的大小写变体场景。

不同场景的清洗实现示例

以下以Python和Java两种常用后端语言为例,展示输入清洗的具体实现。

Python实现示例

Python的re模块支持正则表达式操作,以下是清洗函数实现:

import re

def clean_sql_input(user_input):
    # 先匹配并转义特殊字符,将单引号转义为两个单引号,符合SQL转义规范
    special_char_pattern = re.compile(r"['\]")
    cleaned = special_char_pattern.sub(lambda x: "''" if x.group() == "'" else "\\", user_input)
    # 再匹配SQL关键字,将关键字替换为空,避免注入逻辑生效
    keyword_pattern = re.compile(r"(?i)(SELECT|INSERT|UPDATE|DELETE|UNION|EXEC|OR|AND|DROP|TRUNCATE|DECLARE)")
    cleaned = keyword_pattern.sub("", cleaned)
    return cleaned

# 测试示例
test_input = "admin' OR 1=1 --"
print(clean_sql_input(test_input))
# 输出结果:admin'' 1=1 --

Java实现示例

Java使用java.util.regex包处理正则,实现逻辑如下:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class SqlInputCleaner {
    // 特殊字符匹配正则
    private static final Pattern SPECIAL_CHAR_PATTERN = Pattern.compile("['\\]");
    // SQL关键字匹配正则,不区分大小写
    private static final Pattern KEYWORD_PATTERN = Pattern.compile("(?i)(SELECT|INSERT|UPDATE|DELETE|UNION|EXEC|OR|AND|DROP|TRUNCATE|DECLARE)");

    public static String cleanSqlInput(String userInput) {
        if (userInput == null) {
            return null;
        }
        // 转义单引号和反斜杠
        String cleaned = SPECIAL_CHAR_PATTERN.matcher(userInput).replaceAll(match -> {
            if ("'".equals(match.group())) {
                return "''";
            } else {
                return "\\";
            }
        });
        // 过滤SQL关键字
        cleaned = KEYWORD_PATTERN.matcher(cleaned).replaceAll("");
        return cleaned;
    }

    public static void main(String[] args) {
        String testInput = "test; DROP TABLE user --";
        System.out.println(cleanSqlInput(testInput));
        // 输出结果:test;  TABLE user --
    }
}

方案注意事项与边界

基于正则表达式的输入清洗方案虽然简单易落地,但使用时需要注意以下问题:

  • 避免过度过滤:比如业务需要支持用户输入包含ANDOR等关键字的内容时,直接过滤会导致正常输入被篡改,此时可以选择仅转义特殊字符,或者根据输入参数类型做差异化处理,比如数字类型参数只允许输入数字,无需匹配关键字。
  • 不能作为唯一防御手段:正则表达式规则难以覆盖所有新型注入变种,建议配合参数化查询、ORM框架的防注入机制一起使用,形成多层防御体系。
  • 输入来源全覆盖:不仅要清洗前端表单输入,还要清洗URL参数、HTTP请求头、Cookie等所有用户可控的输入来源,避免遗漏攻击入口。
注意:输入清洗是在不可信输入进入业务逻辑前的预处理步骤,不能替代SQL语句的参数化执行,两者结合才能最大限度降低SQL注入风险。

SQL注入正则表达式输入清洗Web安全修改时间:2026-06-25 17:18:46

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。