🎀SQL注入拦截工具-动态order by
简介
业务场景经常会存在动态order by 入参情况,在处理动态 order by 参数时,需要防止SQL注入攻击。SQL注入是一种常见的安全漏洞,攻击者可以通过这种手段操纵查询来执行恶意代码。
措施
- 使用预编译语句(Prepared Statements):
预编译语句是防止SQL注入的有效方法之一。它们允许将SQL语句和参数分开发送到数据库服务器,这样数据库引擎就可以预先编译SQL语句,并确保参数作为数据而不是可执行代码被处理。 - 参数化查询:
使用参数化查询同样可以帮助防止SQL注入。在这种方式下,即使用户输入包含恶意的SQL代码,这些输入也会被视为纯文本而不是可执行的命令。 - 白名单验证:
限制 ORDER BY 子句中的列名只能是从一个已知的安全列表中选择。这意味着你需要有一个明确的列名列表,只有当用户的输入匹配这个列表中的某个值时,才允许使用它来排序。 - 正则表达式检查:
可以使用正则表达式来验证传入的列名是否符合预期格式。例如,只允许字母、数字以及特定的字符如下划线等。 - 框架或库提供的安全特性:
如果你正在使用某种编程语言的框架或ORM(对象关系映射),请利用其内置的安全特性来处理SQL查询。许多现代框架都提供了防止SQL注入的功能。 - 避免直接拼接SQL字符串:
不要直接将用户输入的数据拼接到SQL查询字符串中。这通常是导致SQL注入的主要原因之一。
工具
通过正则表达式判断order by 入参是否符合预期
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Pattern;
/**
* @program: ZK
* @description: order by 检查工具
* @author: zk
* @create: 2024-09-30 17:42
**/
public class OrderByCheckUtil {
/**
* 适用于 a-zA-Z0-9_.等限定字符 拼接asc/desc 及多个字段
* t.id desc, t.name
*/
private static final Pattern FILTER_PATTERN = Pattern.compile("^([a-zA-Z0-9_/\\.]+)(\\s+)?(asc|desc)?$");
private static final String COMMA= ",";
public static boolean check(String orderBy) {
if(StringUtils.isBlank(orderBy)){
return true;
}
String[] split = orderBy.split(COMMA);
for (String s : split) {
if(!FILTER_PATTERN.matcher(s.trim()).matches()){
return false;
}
}
return true;
}
}
测试
- test
// 正常场景
System.out.println(OrderByCheckUtil.check("id"));
System.out.println(OrderByCheckUtil.check("id asc"));
System.out.println(OrderByCheckUtil.check("id desc"));
System.out.println(OrderByCheckUtil.check("id desc, name"));
System.out.println(OrderByCheckUtil.check("id desc, name asc"));
System.out.println(OrderByCheckUtil.check("t.id"));
System.out.println(OrderByCheckUtil.check("t.id asc"));
System.out.println(OrderByCheckUtil.check("t.id desc"));
System.out.println(OrderByCheckUtil.check("t.id desc, t.name"));
System.out.println(OrderByCheckUtil.check("t.id desc, t.name asc"));
System.out.println(OrderByCheckUtil.check("table_t.id"));
System.out.println(OrderByCheckUtil.check("table_t.id asc"));
System.out.println(OrderByCheckUtil.check("table_t.id desc"));
System.out.println(OrderByCheckUtil.check("table_t.id desc, table_t.name"));
System.out.println(OrderByCheckUtil.check("table_t.id desc, table_t.name asc"));
// 非法字符
System.out.println(OrderByCheckUtil.check("id; DROP TABLE users; --"));
System.out.println(OrderByCheckUtil.check("id, (SELECT * FROM information_schema.tables) --"));
System.out.println(OrderByCheckUtil.check("(id), (SELECT * FROM users WHERE 'x'='x')"));
System.out.println(OrderByCheckUtil.check("id; EXEC master..xp_cmdshell 'dir c:\\' --"));
System.out.println(OrderByCheckUtil.check("id ASC, CASE WHEN (1=1) THEN 1 ELSE 0 END"));
System.out.println(OrderByCheckUtil.check("id, CONCAT(username, ':', password)"));
- result
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
false
false
false
false
false
false
结束
🎀SQL注入拦截工具-动态order by的更多相关文章
- sqlmap开源 测试sql注入的工具 各种参考链接
https://www.cnblogs.com/insane-Mr-Li/p/10150165.html https://github.com/sqlmapproject/sqlmap 官网 http ...
- SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦截器实现防止SQL注入/XSS攻击
SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删改查等操作. XSS ...
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
- [W3bsafe]分享一个爬SQL注入漏洞的工具
分享一个爬SQL注入的工具 本文转自:i春秋社区由团队核心成员若间开发把工具放到E盘的一个文件夹 他会自动生成一个文本文件 Result.txt 最大页数 自己想弄填多少就填多少关键词 注入点关键词 ...
- SQL注入之常用工具sqlmap
通常来说,验证一个页面是否存在注入漏洞比较简单,而要获取数据,扩大权限,则要输入很复杂的SQL语句,有时候我们还会对大量的URL进行测试,这时就需要用到工具来帮助我们进行注入了. 目前流行的注入工具有 ...
- 网络安全系列 之 SQL注入学习总结
目录 1. sql注入概述 2. sql注入测试工具 3. sql注入防御方法 3.1 问题来源 3.2 防御方法 4. SQL注入防御举例 4.1 使用JDBC时,SQL语句进行了拼接 4.2 使用 ...
- Go语言SQL注入和防注入
Go语言SQL注入和防注入 一.SQL注入是什么 SQL注入是一种注入攻击手段,通过执行恶意SQL语句,进而将任意SQL代码插入数据库查询,从而使攻击者完全控制Web应用程序后台的数据库服务器.攻击者 ...
- mybatis中#{}与${}的差别(如何防止sql注入)
默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...
- MySQL SQL 注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本博文将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符. 所谓SQL注入,就是 ...
- MyBatis怎么防止SQL注入
SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL ...
随机推荐
- selenium等待的三种方式(详细)
1.强制等待 time.sleep(3) 这种方式会是操作强行等待3s才会进行下一步操作,但是这种放法,可能会延长测试的时间,如果元素在1s中出现,就会浪费2s的时间,并且这种放法单次有效,每次需要等 ...
- 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
前言 去年下半年 cursor 非常火,让很多一行代码都不懂的小白,也可以做自己的网站和搭 App,当时一下子就引爆了独立开发的热潮. 不过每月20dollar的价格也不算便宜,这时候可以使用 cli ...
- 智算引领 AI启航,中国电信天翼云助推辽宁数智发展!
近日,中国电信辽宁公司"智算引领 AI启航"新质生产力赋能辽宁新时代"六地"建设大会在沈阳圆满落幕.辽宁省工业和信息化厅,省国资委,省数据局,省农业农村厅,沈阳 ...
- Idea报错 【cannot access com.xxx】的【解决办法】
正常操作代码,一个类突然标红,提示 cannot access com.xxx . 执行下面操作,执行完后项目变为正常 但是如果是你代码存在异常,可不是清缓存就能解决了,就要靠自己了哈哈 第一步Fil ...
- 十四. Redis 新功能
十四. Redis 新功能 @ 目录 十四. Redis 新功能 1. ACL 2. IO多线程 3. 工具支持 Cluster 4. 其它新功能-介绍 5. 最后: 1. ACL ACL 参考官网: ...
- 在flink消费一段时间kafka后,kafka-group的offset被重置了是怎么回事?
一.背景 腾讯Flink使用 KafkaSource API创建source端,源码中默认开启了checkpoint的时候提交offset 到kafka-broker.读取kafka数据写入到iceb ...
- vue-element-template去除登录
一.修改src目录下的permission.js文件 1.注释 //if (hasToken) { // if (to.path === '/login') { // // if is logged ...
- Luogu P4933 大师 题解 [ 绿 ] [ 线性 dp ] [ dp 细节处理 ] [ 限制转移条件优化 ]
依据值域的 \(O(n^2)\) 做法 这种做法只适用于这种值域小的题,下一种做法才是求等差数列的通解. 我们定义 \(f[i][j]\) 表示以 \(h_i\) 为最后一个数,公差为 \(j\) 的 ...
- 《Vue2 框架入门第一课:基础概念与环境搭建》
前端宇宙的新钥匙 --Vue2 在前端开发的广袤宇宙中,Vue2 框架宛如一把闪耀的钥匙,为开发者们开启了一扇通往高效.灵活构建用户界面的大门.随着互联网技术的飞速发展,前端开发的复杂性与日俱增,对开 ...
- [Jaav SE/程序生命周期] 优雅的Java应用程序的启停钩子框架
序 了解 spring 生态及框架的 java er 都知道,spring 应用的生命周期管理及配套接口较为优雅.可扩展. 但脱离 spring 的 java 应用程序,如何优雅地启停.管理程序的生命 ...