🎀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 ...
随机推荐
- 2025高级java面试精华及复习方向总结
1. Java基础 顶顶顶顶的点点滴滴 1.1 java集合关系结构图 1.2 如何保证ArrayList的线程安全 方法一: 使用 Collections 工具类中的 synchronizedLis ...
- 最大流问题:增广路与 Edmonds-Karp 算法
最大流问题是其中一个经典的图论问题,其目标是在一个流网络中计算从源点到汇点的最大流量.流网络由节点和边组成,每条边都有一个容量,表示该边所能承载的最大流量. 最大流问题 通常来说,最大流问题仅在有向图 ...
- BGV12
BGV12,论文:(Leveled) Fully Homomorphic Encryption without Bootstrapping 密钥交换 ️ 矩阵\(A_{N*n_2}\) 矩阵\(B_{ ...
- Vector不推荐使用的原因
线程安全可以自己这么用:
- VulNyx - System
扫描发现 2121是ftp端口 8000 http的一个端口 6379redis端口 爆破redis的密码 爆破出来时bonjour 猜测ftp的密码和redis的密码是一样的 尝试用密码去爆出ftp ...
- Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践
title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon e ...
- 一键实现风险识别+处理,天翼云AOne助手尽在“掌”握!
随着企业数字化建设的不断加速,优化站点性能与响应速度成为当今时代的一个重要课题.对于政务.金融类机构来说,其门户网站.信用卡中心等代表着对外形象,如果出现访问不通或者时延严重的现象将影响业务办理效率以 ...
- SQL注入的业务场景以及危害
SQL注入的业务场景以及危害 在现代Web应用中,数据库是存储和检索数据的核心组件.然而,当Web应用未能正确验证和过滤用户输入时,就可能会遭受SQL注入攻击.SQL注入是一种严重的安全漏洞,它允许攻 ...
- Flink同步kafka到iceberg(cos存储)
一.flink到logger 1.source create table source_table ( id bigint comment '唯一编号' ,order_number bigint co ...
- Luogu P10581 蓝桥杯2024国A 重复的串 题解 [ 蓝 ] [ KMP ] [ 动态规划 ] [ 矩阵加速 ]
重复的串:KMP + dp 的板子题. 暴力 dp 设计 \(dp_{k,i,j}\) 表示主串匹配到第 \(i\) 位,模式串有 \(j\) 位已匹配完成,目前已完成 \(k\) 次匹配的方案数. ...