简介

业务场景经常会存在动态order by 入参情况,在处理动态 order by 参数时,需要防止SQL注入攻击。SQL注入是一种常见的安全漏洞,攻击者可以通过这种手段操纵查询来执行恶意代码。

措施

  1. 使用预编译语句(Prepared Statements):

    预编译语句是防止SQL注入的有效方法之一。它们允许将SQL语句和参数分开发送到数据库服务器,这样数据库引擎就可以预先编译SQL语句,并确保参数作为数据而不是可执行代码被处理。
  2. 参数化查询:

    使用参数化查询同样可以帮助防止SQL注入。在这种方式下,即使用户输入包含恶意的SQL代码,这些输入也会被视为纯文本而不是可执行的命令。
  3. 白名单验证:

    限制 ORDER BY 子句中的列名只能是从一个已知的安全列表中选择。这意味着你需要有一个明确的列名列表,只有当用户的输入匹配这个列表中的某个值时,才允许使用它来排序。
  4. 正则表达式检查:

    可以使用正则表达式来验证传入的列名是否符合预期格式。例如,只允许字母、数字以及特定的字符如下划线等。
  5. 框架或库提供的安全特性:

    如果你正在使用某种编程语言的框架或ORM(对象关系映射),请利用其内置的安全特性来处理SQL查询。许多现代框架都提供了防止SQL注入的功能。
  6. 避免直接拼接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的更多相关文章

  1. sqlmap开源 测试sql注入的工具 各种参考链接

    https://www.cnblogs.com/insane-Mr-Li/p/10150165.html https://github.com/sqlmapproject/sqlmap 官网 http ...

  2. SpringCloud微服务实战——搭建企业级开发框架(五十一):微服务安全加固—自定义Gateway拦截器实现防止SQL注入/XSS攻击

      SQL注入是常见的系统安全问题之一,用户通过特定方式向系统发送SQL脚本,可直接自定义操作系统数据库,如果系统没有对SQL注入进行拦截,那么用户甚至可以直接对数据库进行增删改查等操作.   XSS ...

  3. Java防止SQL注入2(通过filter过滤器功能进行拦截)

    首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...

  4. [W3bsafe]分享一个爬SQL注入漏洞的工具

    分享一个爬SQL注入的工具 本文转自:i春秋社区由团队核心成员若间开发把工具放到E盘的一个文件夹 他会自动生成一个文本文件 Result.txt  最大页数 自己想弄填多少就填多少关键词 注入点关键词 ...

  5. SQL注入之常用工具sqlmap

    通常来说,验证一个页面是否存在注入漏洞比较简单,而要获取数据,扩大权限,则要输入很复杂的SQL语句,有时候我们还会对大量的URL进行测试,这时就需要用到工具来帮助我们进行注入了. 目前流行的注入工具有 ...

  6. 网络安全系列 之 SQL注入学习总结

    目录 1. sql注入概述 2. sql注入测试工具 3. sql注入防御方法 3.1 问题来源 3.2 防御方法 4. SQL注入防御举例 4.1 使用JDBC时,SQL语句进行了拼接 4.2 使用 ...

  7. Go语言SQL注入和防注入

    Go语言SQL注入和防注入 一.SQL注入是什么 SQL注入是一种注入攻击手段,通过执行恶意SQL语句,进而将任意SQL代码插入数据库查询,从而使攻击者完全控制Web应用程序后台的数据库服务器.攻击者 ...

  8. mybatis中#{}与${}的差别(如何防止sql注入)

    默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...

  9. MySQL SQL 注入

    如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本博文将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符. 所谓SQL注入,就是 ...

  10. MyBatis怎么防止SQL注入

    SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL ...

随机推荐

  1. shell脚本中的变量

    在shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业.如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次.突然你觉得 ...

  2. cmake-4

    cmake-4学习,参考 cmake构建c++项目快速入门2-1 cmake构建c++项目快速入门2-2 了解 cmake的工作原理: Windows下用cmake编译cmake (1)先下载cmak ...

  3. Integer包装类中的IntegerCache结构

    public void test3() { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i = ...

  4. uniapp-中picker-view用户不触发channge事件也知道用户选择的值

    我们都知道,只用用户触发change事件的时候,我们才知道,用户选择的是哪一个值: 如何用户没有触发change事件,我们压根就不知道用户选择的是哪一个值: 那么什么时候,用户不会触发change事件 ...

  5. Atcoder ABC216G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]

    01Sequence:比较板的差分约束,但有一个很妙的转化. 朴素差分约束 设 \(x_i\) 表示第 \(i\) 位的前缀和. 我们要最小化 \(1\) 的个数,就要求最小解,就要求最长路.因为约束 ...

  6. PADS无模命令总结表

    无模命令总结表 1.C 补充格式,在内层负片设计时用来显示 Plane 层的焊盘及 Thermal.使用方法是,从键盘上输入 C 显示,再次输入 C 可去除显示. 2.D 打开/关闭当前层显示,使用方 ...

  7. 设计原则&模式:单例模式(创建型)

    定义:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式. 五种实现方式: 饿汉式 懒汉式 双重校验 静态内部类 枚举类 饿汉式 特点:线程安全,调用效率高,但是不 ...

  8. Linux用户登录失败锁定策略

    1.账户锁定策略介绍 在Linux系统中,为了提高系统安全性,防止暴力破解攻击,我们可以通过配置PAM(Pluggable Authentication Modules)模块来限制登录失败次数并锁定用 ...

  9. 值得推荐的IT公司名单(成都篇)

    成都,作为新一线城市中的科技强市,拥有众多优秀的 IT 公司,为广大 IT 从业者提供了丰富的就业机会和良好的职业发展环境.以下是一些值得推荐的 IT 公司(排名不分先后): 一.互联网巨头在成都 1 ...

  10. Windows服务器等保审核安全设置

    1.开启账户锁定策略 进入Windows服务器,快捷键"WIN+R"打开运行窗口.输入"gpedit.msc"并点击确定,依次点击"计算机配置&quo ...