Druid连接池的能力介绍与使用方法

Druid连接池的能力介绍与使用方法

本文将介绍druid连接池的能力:监控sql调用数据(慢sql、调用量、异常堆栈)、防止sql注入和数据库密码加密。

1. Druid连接池简介

Alibaba Druid官网使用手册里是这样介绍的:Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
如果你是Java程序员,你在大多数项目中应该都见到过使用Druid作为数据库连接池,无他,阿里巴巴出品,质量有保证。当然这是玩笑,我们程序员选择技术组件时严谨的,下表是Druid连接池和其它连接池的对比,从此表可以看出,Druid连接池在性能、监控、诊断、安全、扩展性这些方面远远超出竞品。这些强大的能力才是Druid连接池被众多Java程序员青睐的根本原因。在这里插入图片描述

2. 为监控而生

Druid连接池最初就是为监控系统采集jdbc运行信息而生的,它内置了StatFilter 功能,能采集非常完备的连接池执行信息Druid连接池内置了能和Spring/Servlet关联监控的实现,使得监控Web应用特别方便Druid连接池内置了一个监控页面,提供了非常完备的监控信息,可以快速诊断系统的瓶颈。
2.1 监控信息采集的StatFilter
Druid连接池的监控信息主要是通过StatFilter 采集的,采集的信息非常全面,包括SQL执行、并发、慢查、执行时间区间分布等。这些都可以通过配置的方式实现,如通过增加JVM的参数配置实现sql合并:-Ddruid.stat.mergeSql=true,开启后可默认实现多种sql优化策略;在yml配置文件里增加slowSqlMillis参数,可用于控制慢sql记录检测的超时时间。
2.2监控不影响性能
Druid增加StatFilter之后,能采集大量统计信息,同时对性能基本没有影响。StatFilter对CPU和内存的消耗都极小,对系统的影响可以忽略不计。监控不影响性能是Druid连接池的重要特性。
2.3 SQL参数化合并监控
实际业务中,如果SQL不是走PreparedStatement,SQL没有参数化,这时SQL需要参数化合并监控才能真实反映业务情况。如下SQL:
select * from t where id = 1
select * from t where id = 2
select * from t where id = 3
参数化后:
select * from t where id = ?
参数化合并监控是基于SQL Parser语法解析实现的,是Druid连接池独一无二的功能。
2.4 执行次数、返回行数、更新行数和并发监控
StatFilter能采集到每个SQL的执行次数、返回行数总和、更新行数总和、执行中次数和和最大并发。并发监控的统计是在SQL执行开始对计数器加一,结束后对计数器减一实现的。可以采集到每个SQL的当前并发和采集期间的最大并发。
2.5 慢查监控
缺省执行耗时超过3秒的被认为是慢查,统计项中有包括每个SQL的最后发生的慢查的耗时和发生时的参数。
2.6 Exception监控
如果SQL执行时抛出了Exception,SQL统计项上会Exception有最后的发生时间、堆栈和Message,根据这些信息可以很容易定位错误原因。
3. 防SQL注入
SQL注入攻击是黑客对数据库进行攻击的常用手段,Druid连接池内置了WallFilter 提供防SQL注入功能,在不影响性能的同时防御SQL注入攻击。

3.1 基于语意的防SQL注入

Druid连接池内置了一个功能完备的SQL Parser,能够完整解析mysql、sql server、oracle、postgresql的语法,通过语意分析能够精确识别SQL注入攻击。
检测逻辑
3.1.1只允许基本的crud命令(增删改查)
通过配置noneBaseStatementAllow参数,设置是否允许非基本语句的其他语句,缺省关闭。通过这个选项就能够屏蔽诸如CREATE、DROP、ALERT等可能存在严重危害的DDL语言。
在这里插入图片描述
3.1.2.禁止访问系统级表
出于权限控制的需要,Druid对于系统表的操作进行了详细的限制,给予用户充分的自定义空间。举例:
select * from information_schema.columns;
该操作不存在注入点,只是对系统表进行简单查询,所以是被允许的。
但是如果是:
select id from admin where id = 1 and 5 = 6 union select concat(id, name, score) from (select column_name from information_schema.columns where table_name = class1)
因为SQL在子语句中使用了union进行了concat拼接,拼接之后连接了系统表进行查询。Druid在sql parser解析后,判断information_schema在层次中的位置,如果它的父节点为SQL表达式(select等)、左节点为"from",就会满足子句拼接的条件,从而被认为具有攻击性。
3.1.3.禁止访问系统变量
Druid同样也是通过配置策略的方式限制用户对于系统敏感变量的访问,代码与系统表的限制类似,正常的针对version、basedir的查询不会报错,但是:
select * from database where id=‘1’ and len(@@version)>0 and ‘1’=‘1’
上文的语句中使用逻辑表达式,尝试探测版本信息。因为@@version的内容在where或having之后,所以会被禁止。
3.1.4.禁止访问系统函数
和系统敏感的表、变量一样,Druid冶金用了诸如sleep等危险的系统函数的使用,最新的Druid在mysql中摒弃了黑名单的做法,采用白名单的方式限制函数的使用,其他数据库仍旧使用黑名单。
select * from ((select sleep(0))a);
会被禁止,因为显而易见的sleep函数出现在了可能存在注入点的位置(from的子节点)。
3.1.5.禁止出现注释
通常的业务SQl语句不会带有注释,而在SQL注入中类似的行为却很常见,Druid默认模式下,会在SQL parser解析之前,先消除语句中的单行和多行注释内容。
诸如’//or//‘1’='2等常见绕waf手段都是利用了SQL的快注释符。
3.1.6.禁止同时执行多条SQL语句
Druid默认每次只允许执行一条SQL,一次执行多条会被认为疑似是恶意SQL注入语句。
3.1.7.禁止永真条件
利用永真条件判断是否存在注入点是sql注入攻击最常用的手段。Druid对where、order by和group by节点之后的两个及以上永真条件进行过滤。
例如:select info from admin where ID = i d ; 其中 id; 其中 id;其中id为可控输入,如果输入为1,在数据库层就会变成永真条件。因此Druid目前的规则允许语句子句之后最多只存在一个永真逻辑表达式
3.1.8.禁止 getshell
into outfile是常用的利用注入点进行文件写入,druid的拦截是智能的,它只对真正的注入进行拦截,而正常的语句,例如:
记录每个用户的登录ip,写入文件中:select “127.0.0.1” into outfile ‘c:\index.php’;是被允许的。
3.2 极低的漏报率和误报率
基于SQL语意分析,大量应用和反馈,使得Druid的防SQL注入拥有极低的漏报率和误报率。
3.3 防注入对性能影响极小
内置参数化后的Cache、高性能手写的Parser,使得打开防SQL注入对应用的性能基本不受影响。

4. 加密数据库密码

Java项目中,数据库的密码往往以明文形式写在项目的配置文件里,所有能看到本项目代码的人员都可以拿到,这对运维安全来说,是一个很大的挑战。Druid为此提供一种数据库密码加密的手段ConfigFilter。
4.1项目里配置数据库加密方法如下

  1. DruidDataSource支持jvm启动参数配置filters:
    java -Ddruid.filters=config
    或者在yml文件里加入参数:filters:config
  2. 同时可以在jvm启动参数配置配置开启解密:
    -Ddruid.config.decrypt=true
    或者在yml文件里加入参数:config.decrypt:true
  3. 当然最重要的是解密私钥的配置:
    config.decrypt.key:${privateKey}
    4.2获取私钥和加密后的密码方式如下
  4. 去官网下载druid-1.0.16.jar后,在命令行中执行如下命令:
    java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password
    程序会输出私钥:privateKey:xxxxxxx
    加密后的密码:password: xxxxxxx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/483970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电气安全】ASCP电气防火限流式保护器/末端回路线路保护

为什么要使用电气防火限流式保护器? 应急管理部消防救援局统计,在造成电气火灾事故的原因中,最为主要的当为末端线路短路,在电气火灾事故中占比高达70%以上。如何效预防末端线路短路引发的电气火灾事故? 现阶段最为常…

P2926 [USACO08DEC] Patting Heads S题解

题目 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。 贝茜让N (1≤N≤) 头奶牛坐成一个圈。除了1号与N号奶牛外,i号奶牛与i−1号和i1号奶牛相邻。N号奶牛与1号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包…

按列值分组并横向全连接

按列值分组并横向全连接 原效果 处理效果 import pandas as pddef segmentation_col(df ,col_name):# 按列的值分组list_type df[col_name].unique()df_list []for item in list_type:df_list.append(df[df[col_name] item])# 并横向连接# 判断是否能连接if len(df_list) …

Java 自定义线程池实现

自定义线程池 简介任务图示阻塞队列 BlockingQueue<T>ReentrantLock代码 线程池 ThreadPool工作线程类 Worker 拒绝策略接口代码测试类 TestThreadPool为什么需要j i&#xff1f;&#xff08;lambad表达式相关&#xff09; 测试结果拒绝策略&#xff1a;让调用者自己执行…

【计算机网络篇】数据链路层(3)差错检测

文章目录 &#x1f95a;误码&#x1f354;两种常见的检错技术⭐奇偶校验⭐循环冗余校验&#x1f388;例子 &#x1f95a;误码 误码首先介绍误码的相关概念 &#x1f354;两种常见的检错技术 ⭐奇偶校验 奇校验是在待发送的数据后面添加1个校验位&#xff0c;使得添加该校验…

谷粒商城 分布式组件

1.成功启动人人开源前端项目和后端项目联调 RefreshScope //动态从配置中心获取配置

LeetCode Python - 71. 简化路径

目录 题目描述解法运行结果 题目描述 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&…

数学(算法竞赛、蓝桥杯)--快速幂

1、B站视频链接&#xff1a;G01 快速幂_哔哩哔哩_bilibili 题目链接&#xff1a;P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; typedef long long LL; int a,b,p; int quickpow(LL a,int n,int p){…

前缀和(一)

前缀和 一维前缀和数组 假设有一个数组为a [ n ] , 另一个数组为s [ n ] . 其中 s [ j ] a[1] a[ 2 ] ......a[ j-1] a [ j ] 。--->s[ j ]表示a数组从第一个元素到第 j 个元素之和&#xff0c;那么我们则就称 s 数组为前缀和数组 例题&#xff1a;前缀和 链接&#xff1a;…

百度快速上首页霸屏秒收蜘蛛池程序,网络推广效果超好

百度快速进入首页&#xff0c;霸屏&#xff0c;秒收蜘蛛池程序。 是一个网络推广效果极佳的节目。 是一款适合百度的优化程序 当你进来阅读这篇文章时&#xff0c;蜘蛛池的概念对你来说可能还比较陌生。 既然您阅读了这篇文章&#xff0c;说明您对网络推广有了一定的兴趣。 无…

ssm002学院党员管理系统+jsp

鄂尔多斯应用技术学院党员管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对鄂尔多斯应用技术学…

Maven高级-聚合与继承 私服(图文并茂)

文章目录 一、分模块开发与设计1. 分模块开发的意义问题导入 模块拆分原则2. 分模块开发&#xff08;模块拆分&#xff09;问题导入2.1 创建Maven模块2.2 书写模块代码2.3 通过maven指令安装模块到本地仓库&#xff08;install指令&#xff09; 二、依赖管理1. 依赖传递问题导入…

linux前期配置

电脑端 ~目录下创建一个用于共享的nfs文件夹 mkdir nfs 配置互通文件权限 按照第八行配置 两个网络适配器 1.NET 2.桥接 编辑--->虚拟网络编辑器 开始这样 点更改设置后会有另一个连接出现 设置静态地址 在这个目录下些下这个 ip是设置的静态ip&#xff0c;用…

AVL树(靠平衡因子判断翻转的二叉搜索树)

之前我们在学习set和map的时候说&#xff0c;他们的底层数二叉搜索树&#xff0c;其实这是不准确的&#xff0c;准确的来说他应该是AVL树 那么什么事AVL树呢啊&#xff1f; 但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中 插入的元素有序或者接近有序&#xff0c;二叉搜索…

深度学习pytorch——多分类问题(持续更新)

回归问题 vs 分类问题&#xff08;regression vs classification&#xff09; 回归问题&#xff08;regression&#xff09; 1、回归问题的目标是使预测值等于真实值&#xff0c;即predy。 2、求解回归问题的方法是使预测值和真实值的误差最小&#xff0c;即minimize dist(p…

数据结构与算法4-冒泡排序

文章目录 1. 认识冒泡排序2. 图示2.1 图示12.2 图示2 3. 代码 1. 认识冒泡排序 双层for循环&#xff0c;每次选出最大的数“浮”到数组的最后面&#xff1b;时间复杂度O( n 2 n^2 n2)&#xff0c;空间复杂度O(1);重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff…

【吊打面试官系列】Redis篇 -Redis 集群会有写操作丢失吗?为什么?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f;】 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 集群会有写操作丢失吗&#xff1f;为什么&#xff1f; Redis 并不能保证数据的强一致性&#xff0c;这意味这…

你可敢信这是 AI 写的歌?suno 真的惊到我了!

你可敢信这是 AI 写的歌&#xff1f;suno 真的惊到我了&#xff01; AI 音乐平台 suno 横空出世&#xff0c;效果惊人&#xff0c;我赶紧试了一下&#xff0c;amazing&#xff01;&#xff01;&#xff01; suno创作 - 背叛 这是我随意创作的&#xff0c;这几天对诅咒前男友那首…

②零基础MySQL数据库-MySQL约束

作用 表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性&#xff0c;比如用户表有些列的值&#xff08;手机号&#xff09;不能为空&#xff0c;有些列的值&#xff08;身份证号&#xff09;不能重复 分类 主键约束(primary key) PK 自增长约束(auto_increme…

Web前端全栈HTML5通向大神之路

本套课程共三大阶段&#xff0c;六大部分&#xff0c;是WEB前端、混合开发与全栈开发必须要掌握的技能&#xff0c;从基础到实践&#xff0c;是从编程小白成长为全栈大神的最佳教程&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1S_8DCORz0N2ZCdtJg0gHsw?pwdtjyv 提取…
最新文章