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

java order by 防止注入的方法

防注入方法

    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
     */
    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";

    /**
     * 检查字符,防止注入绕过
     */
    public static String escapeOrderBySql(String value)
    {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
        {
            throw new UtilException("参数不符合规范,不能进行查询");
        }
        return value;
    }

    /**
     * 验证 order by 语法是否符合规范
     */
    public static boolean isValidOrderBySql(String value)
    {
        return value.matches(SQL_PATTERN);
    }

调用escapeOrderBySql()方法就可以对order by后的字符进行验证,如果出现了特殊符号那么直接抛出异常,如果字符合法那么原样返回。

SQL注入类型

按照注入点类型来分类


(1).数字型注入点(当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。)

sql原型: select * from aaa where id = 1 ,有如下种可能:

1). 加单引号,对应的sql: select * from aaa where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;

2).加or 1=1,对应的sql: select * from aaa where id=3 or 1=1 这个时候能够查询到所有的结果

3).加上 and 1=1 对应的sql:select * from aaa where id=3 and 1=1 不能查询到结果


(2).字符型注入点(当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。)

sql原型: select * from aaa where name='admin' ,有如下种可能:

1).加单引号:

select * from aaa where name ='admin' and 1=1 -- '

这种注入方式并不会影响查询结果

2).加union:

select name from aaa where name='1' union select database()#'

这种的结果就是把数据库信息泄露出去。

3).加or

select name from aaa where name='11' or '1234 '='1234'

这种就是导致查询的结果并不是期望的结果,导致数据泄露


(3).搜索型注入点(说明一下,搜索型注入也无他,前加%' 后加 and '%'=' 对于MYSQL数据库,后面可以把 and '%'='换成--)

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'


更多:
从orderby引发的SQL注入问题的思考 - 冯廷鑫 - 博客园

相关文章:

  • required a bean of type that could not be found. The injection point has the following annotations:
  • 删除换行符在线 在线删除所有回车换行工具
  • 实现将HashMap转换成为ArrayList,并将map的Key 、Value分别存放到两个ArrayList当中
  • java switch可以字符串吗
  • @Query中countQuery的介绍
  • java8 Stream将List转成Map
  • ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘xxx.sxxx_.id‘ which is
  • group by 和 where一起使用
  • java求多个Long的平均数,其中可能有null
  • java遍历Map的四种方法
  • win11窗口分1/3 2/3屏的方法
  • java后端实习经验
  • cb.conjunction()的意思
  • spring hashmap线程安全
  • 给el-table动态添加竖线分割
  • Cumulo 的 ClojureScript 模块已经成型
  • gitlab-ci配置详解(一)
  • javascript 总结(常用工具类的封装)
  • js中forEach回调同异步问题
  • Magento 1.x 中文订单打印乱码
  • node.js
  • Promise初体验
  • Swift 中的尾递归和蹦床
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 对象管理器(defineProperty)学习笔记
  • 翻译--Thinking in React
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 用element的upload组件实现多图片上传和压缩
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 找一份好的前端工作,起点很重要
  • 中文输入法与React文本输入框的问题与解决方案
  • ​MySQL主从复制一致性检测
  • #QT(智能家居界面-界面切换)
  • (09)Hive——CTE 公共表达式
  • (function(){})()的分步解析
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)创业的注意事项
  • (转)为C# Windows服务添加安装程序
  • .NET 常见的偏门问题
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET程序员迈向卓越的必由之路
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .skip() 和 .only() 的使用
  • @Bean, @Component, @Configuration简析
  • @拔赤:Web前端开发十日谈
  • [20171106]配置客户端连接注意.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Angular] 笔记 7:模块
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BROADCASTING]tensor的扩散机制