当前位置: 首页 > news >正文

AST语法树应用于sql检查

语法树,就是一颗表达式的二叉树,比如获取sql where条件的 左表达式     右表达式 ;,判断where 条件里面是不是就是没有带条件,或者没有什么用的条件 1=1,delete_flag=0

以下是blockAttackInnerInterceptor里校验sql的方法

package com.example.ast;import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import lombok.SneakyThrows;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.update.Update;public class AstDemo {public static void main(String[] args) throws Exception{// 解析 SQLStatement stmt = CCJSqlParserUtil.parse("update table a set a.status=1 where delete_flag=0  ");Update select = (net.sf.jsqlparser.statement.update.Update) stmt;Expression whereExpr = select.getWhere();boolean x = fullMatch(whereExpr, "delete_flag");//返回true就代表全表更新的where 条件System.out.println(x);}private  static  boolean fullMatch(Expression where, String logicField) {if (where == null) {return true;}if (StringUtils.isNotBlank(logicField)) {if (where instanceof BinaryExpression) {BinaryExpression binaryExpression = (BinaryExpression) where;if (StringUtils.equals(binaryExpression.getLeftExpression().toString(), logicField) || StringUtils.equals(binaryExpression.getRightExpression().toString(), logicField)) {return true;}}if (where instanceof IsNullExpression) {IsNullExpression binaryExpression = (IsNullExpression) where;if (StringUtils.equals(binaryExpression.getLeftExpression().toString(), logicField)) {return true;}}}if (where instanceof EqualsTo) {// example: 1=1EqualsTo equalsTo = (EqualsTo) where;return StringUtils.equals(equalsTo.getLeftExpression().toString(), equalsTo.getRightExpression().toString());} else if (where instanceof NotEqualsTo) {// example: 1 != 2NotEqualsTo notEqualsTo = (NotEqualsTo) where;return !StringUtils.equals(notEqualsTo.getLeftExpression().toString(), notEqualsTo.getRightExpression().toString());} else if (where instanceof OrExpression) {OrExpression orExpression = (OrExpression) where;return fullMatch(orExpression.getLeftExpression(), logicField) || fullMatch(orExpression.getRightExpression(), logicField);} else if (where instanceof AndExpression) {AndExpression andExpression = (AndExpression) where;return fullMatch(andExpression.getLeftExpression(), logicField) && fullMatch(andExpression.getRightExpression(), logicField);} else if (where instanceof Parenthesis) {// example: (1 = 1)Parenthesis parenthesis = (Parenthesis) where;return fullMatch(parenthesis.getExpression(), logicField);}return false;}
}

http://www.dtcms.com/a/423151.html

相关文章:

  • 分转科技:科技乐享生活,时尚分转未来
  • 推广型网站免费建设网页开发价格
  • Livox-Mid360驱动安装(ROS1/Ubuntu20.04)
  • 建设厅网站查询电工证件做枪版视频网站犯法吗
  • 开启C++新世界:从函数到对象的两天思维跃迁
  • C# 中Ping 网络连通性检测实战
  • 阿里 + 南洋理工新突破!MMR1 模型破解多模态推理训练难题,开源160 万数据 + 15k RL 样本!
  • 多模态PDF解析
  • 如何判断模型矩阵是否做了镜像
  • C语言常量和存储类别详解
  • 计算机视觉进阶教学之Mediapipe库(一)
  • 《道德经》第八章
  • 开源 C# 快速开发(十一)线程
  • 大学生网站建设策划书响应式网站用什么开发的
  • 交换机可以做网站跳转吗wordpress 目录样式
  • 第2章 三个小工具的编写(1)
  • 生态系统NPP及碳源、碳汇模拟实践技术应用
  • 【Rust GUI开发入门】编写一个本地音乐播放器(3. UI与后台线程通信)
  • P11013 「ALFR Round 4」C 粉碎 题解
  • 跨境商城网站建设公司做小程序要多少钱
  • scratch绘制帽子花 2025年6月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析
  • 特色专业建设展示网站北京seo培训
  • 网络原理-HTTP补充1
  • 做外贸相关的网站全面的vi设计公司
  • 如何构建高效 AI 智能体
  • 9.25训练赛+Codeforces1054 (Div. 3)
  • 老Java项目访问提示orcale 19c ORA-01017: 用户名/口令无效; 登录被拒绝
  • 目标检测:yolov7算法在RK3588上部署
  • Maya Python: 安装pymel
  • 全景网站开发待遇南宁logo设计公司