Spring Boot中输入SQL查询的合法性验证实现咨询
Spring Boot中验证SQL语句开头的实现方案
其实不用特意找Spring Boot专属的方法,Java原生的字符串处理能力完全能满足需求,核心是处理好SQL的大小写、开头空格等场景,确保验证准确。
实现思路
- 先处理输入的SQL:去除前后空格,统一转成小写(或大写),避免大小写导致的判断误差
- 验证SQL是否以指定关键字开头:允许的关键字包括
select、show、describe、insert、delete、update - 严谨性处理:要避免类似
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
相关产品推荐
相关产品推荐

