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

news2024/9/30 19:37:28

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.coloradmin.cn/o/1540647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生网络魔术师:Docker高级网络实战演练与深度解析

在Docker的世界中,网络无疑是一块充满魔力的土地。当我们超越了基础的网络配置,步入Docker高级网络领域时,你会发现一个全新的、强大而灵活的网络模型正在等待你的探索。本文将带你亲历Docker高级网络实战操作,揭开overlay网络、自…

【动态规划】Leetcode 70. 爬楼梯

【动态规划】Leetcode 70. 爬楼梯 解法1 ---------------🎈🎈题目链接🎈🎈------------------- 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 输入…

GaussDB WDR分析之集群报告篇

AWR报告目前已经成为Oracle DBA分析问题,定位故障最为重要的报告,阅读与分析AWR报告的技能也是Oracle DBA必备的技能。国产数据库为了提高运维便捷性,都在做类似Oracle AWR报告的模仿,只不过由于指标体系不够完善,因此…

Windows系统安装WampServer结合内网穿透实现公网访问本地服务

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…

网络安全笔记-day7,共享文件服务器

文件共享服务器 准备阶段 打开虚拟机win2003 创建文件 D:. —share   –down   |  test1.txt   |   —up     01xxx.txt     02xxx.txt 配置IP win2003 192.168.1.10 255.255.255.0 winxp 192.168.1.20 255.255.255.0 创建共享文件夹 创建共享&#xff1…

Axure RP 9 for Mac中文激活版:原型设计工具

Axure RP 9 for Mac是一款值得设计师信赖的原型设计工具。它以其卓越的性能和稳定的运行赢得了广大用户的赞誉。 软件下载:Axure RP 9 for Mac中文激活版下载 在Axure RP 9中,您可以尽情发挥自己的设计才华,创造出独一无二的原型作品。无论是…

【MySQL】9. 内置函数

函数 1. 日期函数 获得年月日: mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-03-23 | ---------------- 1 row in set (0.00 sec)获得时分秒: mysql> select current_time(); ------------…

看完就等于拿捏浮点数在内存中的储存了

诸君又该学习了,今天我们继续来一睹浮点数的奥妙真容。 经过前面文章对整形提升相关的解释,我们都对整形和字符在内存空间上的储存已经有了大概的认知,那么现在我们就来好好讲讲浮点数在内存中的储存规则。 目录 浮点数与整形储存的不同 …

which is not functionally dependent on columns in GROUP BY clause 错误解决方法

今天遇到了which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by的错误,记录一下解决方法。 该错误是因为在SQL语句中用到了聚合函数,但是聚合函数之外的字段没有全部放到group …

电脑电池健康度查询

首先使用winr 输入cmd,打开黑窗口 再出入以下代码: powercfg/batteryreport将路径中文件找到即可查看电池健康度。

软件测试(自动化测试)

1. Selenium 1.1 Selenium是什么? 用来做web自动化测试的框架。 1.2 Selenium特点 支持各种浏览器,支持各种平台,支持各种语言,有丰富的API, 1.3 工作原理 1.4 Selenium环境搭建 下载配套浏览器及驱动 这里使用Ch…

vcs编译选项--不常用

1)如何查看波形的毛刺(glitch) 参考:公众号:IC学社 需要添加仿真选项:fsdbglitch0 “值得说明的是,glitch 对 design 是非常不好的,需要规避,设计代码中应该具有检查 g…

Express:快速搭建Node.js应用的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DataV 在HTML中使用

一:什么是DataV 介绍 | DataV (jiaminghi.com) 组件库基于Vue (React版 (opens new window)) ,主要用于构建大屏(全屏)数据展示页面即数据可视化,具有多种类型组件可供使用:…

[leetcode] 138. 随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

Spring Bean加载优先级

当我们使用 ConditionalOnMissingBean / ConditionalOnBean注解去给某个 bean 注入赋予条件时,那在条件判断时我们需要确保条件判断过程所需的环境已准备好。 举个例子 下面的代码中有两个配置类,涉及两个 Bean 的注入 配置类 ConfigA 需要注入一个 A…

taro之Swiper的使用

图样&#xff1a; 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…

Linux之文件系统与软硬链接

前言 我们之前阐述的内容都是在文件打开的前提下, 但是事实上不是所有文件都是被打开的, 且大部分文件都不是被打开的(也就是文件当前并不需要被访问), 都在磁盘中进行保存. 那这些没有被(进程)打开的文件, 也是需要被管理的! 对于这部分文件核心工作之一是能够快速定位文件…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

web自动化--元素定位之xpath和css

元素定位 xpath绝对路径相对路径案例xpath策略&#xff08;路径&#xff09;案例xpath策略&#xff08;层级、扩展&#xff09;属性层级与属性层级与属性拓展层级与属性综合 csscss选择器&#xff08;id、类、标签、属性&#xff09;id选择器类选择器标签选择器属性选择器案例-…