You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中输入SQL查询的合法性验证实现咨询

Spring Boot中验证SQL语句开头的实现方案

其实不用特意找Spring Boot专属的方法,Java原生的字符串处理能力完全能满足需求,核心是处理好SQL的大小写、开头空格等场景,确保验证准确。

实现思路

  1. 先处理输入的SQL:去除前后空格,统一转成小写(或大写),避免大小写导致的判断误差
  2. 验证SQL是否以指定关键字开头:允许的关键字包括select、show、describe、insert、delete、update
  3. 严谨性处理:要避免类似selectxxx这种伪关键字被误判,确保关键字后面是空格或语句结束

具体实现代码

方式一:使用字符串匹配(直观易读)

可以写一个工具方法或直接在业务逻辑中加入验证:

public void validateSql(String sql) {
    // 先判断SQL是否为空或空白
    if (sql == null || sql.isBlank()) {
        throw new IllegalArgumentException("SQL语句不能为空");
    }
    String processedSql = sql.trim().toLowerCase();
    String[] allowedKeywords = {"select", "show", "describe", "insert", "delete", "update"};
    
    boolean isValid = false;
    for (String keyword : allowedKeywords) {
        if (processedSql.startsWith(keyword)) {
            // 验证关键字后是否为空格或语句结束,避免伪关键字
            int keywordLen = keyword.length();
            if (processedSql.length() == keywordLen || Character.isWhitespace(processedSql.charAt(keywordLen))) {
                isValid = true;
                break;
            }
        }
    }
    
    if (!isValid) {
        throw new IllegalArgumentException("不允许的SQL语句类型,仅支持select、show、describe、insert、delete、update开头的SQL");
    }
}

方式二:使用正则表达式(简洁高效)

正则表达式可以更简洁地处理开头空格、关键字匹配的场景:

public void validateSql(String sql) {
    if (sql == null || sql.isBlank()) {
        throw new IllegalArgumentException("SQL语句不能为空");
    }
    // 正则说明:^匹配开头,\\s*匹配任意空格,|分隔关键字,\\b匹配单词边界
    String validSqlRegex = "^\\s*(select|show|describe|insert|delete|update)\\b";
    if (!sql.trim().toLowerCase().matches(validSqlRegex)) {
        throw new IllegalArgumentException("不允许的SQL语句类型,仅支持select、show、describe、insert、delete、update开头的SQL");
    }
}

在Spring Boot中使用

你可以在Controller接收SQL输入后,直接调用这个验证方法,比如:

@RestController
@RequestMapping("/sql")
public class SqlProcessController {

    @PostMapping("/execute")
    public ResponseEntity<String> processSql(@RequestBody String sql) {
        try {
            validateSql(sql);
            // 这里写执行SQL的业务逻辑
            return ResponseEntity.ok("SQL验证通过,已进入执行流程");
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    // 把上面的validateSql方法放在这里,或者抽成工具类
    private void validateSql(String sql) {
        if (sql == null || sql.isBlank()) {
            throw new IllegalArgumentException("SQL语句不能为空");
        }
        String validSqlRegex = "^\\s*(select|show|describe|insert|delete|update)\\b";
        if (!sql.trim().toLowerCase().matches(validSqlRegex)) {
            throw new IllegalArgumentException("不允许的SQL语句类型,仅支持select、show、describe、insert、delete、update开头的SQL");
        }
    }
}

注意事项

  • 这种验证只是基础的语句类型校验,不能替代SQL注入防护,如果要执行用户输入的SQL,务必使用预编译语句(如JdbcTemplate的update/query方法绑定参数)来避免注入风险
  • 如果需要支持更多SQL关键字,只需修改关键字数组或正则表达式即可

内容的提问来源于stack exchange,提问作者Raz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:36:29