當前位置:首頁 » 編程語言 » druid防sql注入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

druid防sql注入

發布時間: 2022-10-10 05:13:41

1. 解決druid連接池執行sql為什麼拋出異常:java.sql.sqlexception:statement is clo

DRUID是阿里巴巴開源上一個資料庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池(據說是目前最好的連接池,不知道速度有沒有BoneCP快)。

2. druiddatasource 最大連接數120能支撐多少台伺服器訪問

druid連接池配置

package demo.test;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DBUtil {

private static DataSource ds = null;

static {
try{
InputStream in = DBUtil.class.getClassLoader()
.getResourceAsStream("ds.properties");
Properties props = new Properties();
props.load(in);
ds = DruidDataSourceFactory.createDataSource(props);
}catch(Exception ex){
ex.printStackTrace();
}
}

public static Connection openConnection() throws SQLException{
return ds.getConnection();
}

}

ds.properties內容:

driverClassName = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username = ******
password = ******

initialSize = 5
maxActive = 10
minIdle = 3
maxWait = 60000
removeAbandoned = true
removeAbandonedTimeout = 180
timeBetweenEvictionRunsMillis = 60000
minEvictableIdleTimeMillis = 300000
validationQuery = SELECT 1 FROM DUAL
testWhileIdle = true
testOnBorrow = false
testOnReturn = false
poolPreparedStatements = true
= 50
filters = stat

基於Spring的配置:

<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 資料庫基本信息配置 -->
<property name="driverClassName" value="${oracle.driver}" />
<property name="url" value="${oracle.url}" />
<property name="username" value="${oracle.username}" />
<property name="password" value="${oracle.password}" />
<!-- 初始化連接數量 -->
<property name="initialSize" value="${druid.initialSize}" />
<!-- 最大並發連接數 -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- 最大空閑連接數 -->
<property name="maxIdle" value="${druid.maxIdle}" />
<!-- 最小空閑連接數 -->
<property name="minIdle" value="${druid.minIdle}" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="${druid.maxWait}" />
<!-- 超過時間限制是否回收 -->
<property name="removeAbandoned" value="${druid.removeAbandoned}" />
<!-- 超過時間限制多長; -->
<property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<!-- 用來檢測連接是否有效的sql,要求是一個查詢語句-->
<property name="validationQuery" value="${druid.validationQuery}" />
<!-- 申請連接的時候檢測 -->
<property name="testWhileIdle" value="${druid.testWhileIdle}" />
<!-- 申請連接時執行validationQuery檢測連接是否有效,配置為true會降低性能 -->
<property name="testOnBorrow" value="${druid.testOnBorrow}" />
<!-- 歸還連接時執行validationQuery檢測連接是否有效,配置為true會降低性能 -->
<property name="testOnReturn" value="${druid.testOnReturn}" />
<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
<property name="" value="${druid.}" />
<!--屬性類型是字元串,通過別名的方式配置擴展插件,常用的插件有:
監控統計用的filter:stat
日誌用的filter:log4j
防禦SQL注入的filter:wall -->
<property name="filters" value="${druid.filters}" />
</bean>

啟用Web監控統計功能需要在Web應用的web.xml中加入以下內容:

<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>

訪問監控頁面:http://ip:port/projectName/druid/index.html

3. 資料庫連接池的Java連接池

在Java中開源的資料庫連接池有以下幾種 :
1、C3P0:是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate 一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。
2、Proxool:是一個Java SQL Driver驅動程序,提供了對選擇的其它類型的驅動程序的連接池封裝。可以非常簡單的移植到現存的代碼中,完全可配置,快速、成熟、健壯。可以透明地為現存的JDBC驅動程序增加連接池功能。
3、Jakarta DBCP:DBCP是一個依賴Jakartacommons-pool對象池機制的資料庫連接池。DBCP可以直接的在應用程序中使用。
4、DDConnectionBroker:是一個簡單、輕量級的資料庫連接池。
5、DBPool:是一個高效、易配置的資料庫連接池。它除了支持連接池應有的功能之外,還包括了一個對象池,使用戶能夠開發一個滿足自己需求的資料庫連接池。
6、XAPool:是一個XA資料庫連接池。它實現了javax.sql.XADataSource並提供了連接池工具。
7、Primrose:是一個Java開發的資料庫連接池。當前支持的容器包括Tomcat4&5、Resin3與JBoss3。它同樣也有一個獨立的版本,可以在應用程序中使用而不必運行在容器中。Primrose通過一個WEB介面來控制SQL處理的追蹤、配置,以及動態池管理。在重負荷的情況下可進行連接請求隊列處理。
8、SmartPool:是一個連接池組件,它模仿應用伺服器對象池的特性。SmartPool能夠解決一些臨界問題如連接泄漏(connection leaks)、連接阻塞、打開的JDBC對象(如Statements、PreparedStatements)等。SmartPool的特性包括: 支持多個pool 自動關閉相關聯的JDBC對象 在所設定time-outs之後察覺連接泄漏 追蹤連接使用情況 強制啟用最近最少用到的連接 把SmartPool「包裝」成現存的一個pool 9、MiniConnectionPoolManager:是一個輕量級JDBC資料庫連接池。它只需要Java1.5(或更高)並且沒有依賴第三方包。
10、BoneCP:是一個快速、開源的資料庫連接池。幫用戶管理數據連接,讓應用程序能更快速地訪問資料庫。比C3P0/DBCP連接池速度快25倍。
11、Druid:Druid不僅是一個資料庫連接池,還包含一個ProxyDriver、一系列內置的JDBC組件庫、一個SQL Parser。
支持所有JDBC兼容的資料庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。
Druid針對Oracle和MySql做了特別優化,比如: Oracle的PS Cache內存佔用優化 MySql的ping檢測優化 Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。
簡單SQL語句用時10微秒以內,復雜SQL用時30微秒。
通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter,就是通過Druid的SQL Parser分析語義實現的

4. druid和hikaridatasource哪個好

1.性能方面 hikari>druid>tomcat-jdbc>dbcp>c3p0 。hikari的高性能得益於最大限度的避免鎖競爭。

2.druid功能最為全面,sql攔截等功能,統計數據較為全面,具有良好的擴展性。

3.

5. Druid的數據連接

Druid支持所有JDBC兼容的資料庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存佔用優化,MySql的ping檢測優化。 阿里巴巴是一個重度使用關系資料庫的公司,我們在生產環境中大量的使用Druid,通過長期在極高負載的生產環境中實際使用、修改和完善,讓Druid逐步發展成最好的資料庫連接池。Druid在監控、可擴展性、穩定性和性能方面都有明顯的優勢。
首先,強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。
監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息。
SQL執行的耗時區間分布。什麼是耗時區間分布呢?比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分布,能夠非常清楚知道SQL的執行耗時情況。
監控連接池的物理連接創建和銷毀次數、邏輯連接的申請和關閉次數、非空等待次數、PSCache命中率等。
其次,方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日誌等等。
Druid內置提供了用於監控的StatFilter、日誌輸出的Log系列Filter、防禦SQL注入攻擊的WallFilter。
阿里巴巴內部實現了用於資料庫密碼加密的CirceFilter,以及和Web、Spring關聯監控的DragoonStatFilter。
第三,Druid集合了開源和商業資料庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。
ExceptionSorter。當一個連接產生不可恢復的異常時,例如Oracle error_code_28 session has been killed,必須立刻從連接池中逐出,否則會產生大量錯誤。只有Druid和JBoss DataSource實現了ExceptionSorter。
PSCache內存佔用優化對於支持游標的資料庫(Oracle、SQL Server、DB2等,不包括MySql),PSCache可以大幅度提升SQL執行性能。一個PreparedStatement對應伺服器一個游標,如果PreparedStatement被緩存起來重復執行,PreparedStatement沒有被關閉,伺服器端的游標就不會被關閉,性能提高非常顯著。在類似「SELECT * FROM T WHERE ID = ?」這樣的場景,性能可能是一個數量級的提升。但在Oracle JDBC Driver中,其他的資料庫連接池(DBCP、JBossDataSource)會佔用內存過多,極端情況可能大於1G。Druid調用OracleDriver提供管理PSCache內部API。
LRU是一個性能關鍵指標,特別Oracle,每個Connection對應資料庫端的一個進程,如果資料庫連接池遵從LRU,有助於資料庫伺服器優化,這是重要的指標。Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環境下性能可能還好,但在真實環境中則就不好了 。 Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。
簡單SQL語句用時10微秒以內,復雜SQL用時30微秒。
通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。 Druid提供Filter-Chain模式的插件框架,通過編寫Filter配置到DruidDataSource中就可以攔截JDBC的各種API,從而實現擴展。Druid提供了一系列內置Filter。

6. 為什麼說Druid是「最好的資料庫連接池」

1、可以監控資料庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析資料庫訪問性能有幫助。

2、資料庫密碼加密。直接把資料庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。

3、SQL執行日誌,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。

4、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。

7. Druid如何不依賴框架實現對sql的監控

1.1 % Processor Time指處理器用來執行非閑置線程時間的百分比。通過此計數器可以確定伺服器當前CPU使用百分比。
1.2 % Privileged Time是在特權模式下進程線程執行代碼所花時間的百分比。當調用 Windows 系統服務時,此服務經常在特權模式運行,以便獲取對系統專有數據的訪問。

8. SpringBoot 防止SQL注入、XSS攻擊、CSRF/CROS惡意訪問

一、SQL 注入問題


SQL 注入即是指 web 應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在 web 應用程序中事先定義好的查詢語句的結尾上添加額外的 SQL 語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的數據信息。

簡單來說,就是將大部分 SQL 語句當參數傳入系統中,從而獲取系統中的數據。下面簡單舉例說明

系統中有這樣一條信息 SQL 語句執行,分頁查詢所有用戶,每頁查詢 20 條,並且根據指定欄位進行排序,也就是說排序欄位也是參數傳遞過來的

SQL 注入問題分析:

這樣很簡單的一句話 SQL,就可以把系統搞炸掉,這種方式可以實現刪庫跑路

以上語句會把整個 test 資料庫所有內容都刪掉

盡量用預編譯機制,少用字元串拼接的方式傳參,它是 sql 注入問題的根源。

有些特殊字元,比如:%作為 like 語句中的參數時,要對其進行轉義處理。

需要對所有的異常情況進行捕獲,切記介面直接返回異常信息,因為有些異常信息中包含了 sql 信息,包括:庫名,表名,欄位名等。攻擊者拿著這些信息,就能通過 sql 注入隨心所欲地攻擊你的資料庫了。目前比較主流的做法是,有個專門的網關服務,它統一暴露對外介面。用戶請求介面時先經過它,再由它將請求轉發給業務服務。這樣做的好處是:能統一封裝返回數據的返回體,並且如果出現異常,能返回統一的異常信息,隱藏敏感信息。此外還能做限流和許可權控制。

使用 sqlMap 等待代碼檢測工具,它能檢測 sql 注入漏洞。

需要對資料庫 sql 的執行情況進行監控,有異常情況,及時郵件或簡訊提醒。

對生產環境的資料庫建立單獨的賬號,只分配 DML 相關許可權,且不能訪問系統表。切勿在程序中直接使用管理員賬號。

建立代碼 review 機制,能找出部分隱藏的問題,提升代碼質量。

對於不能使用預編譯傳參時,要麼開啟 druid 的 filter 防火牆,要麼自己寫代碼邏輯過濾掉所有可能的注入關鍵字。

XSS 攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶載入並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序通常是 JavaScript,但實際上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻擊成功後,攻擊者可能得到包括但不限於更高的許可權(如執行一些操作)、私密網頁內容、會話和 cookie 等各種內容。

通常情況下,被用來盜用 Cookie、破壞頁面結構、重定向到其他網站等

對用戶輸入的表單信息進行檢測過濾

CSRF - Cross-Site Request Forgery - 跨站請求偽造:

攻擊可以在受害者毫不知情的情況下以受害者名義偽造請求發送給受攻擊站點,從而在未授權的情況下執行在許可權保護之下的操作,CORS - Cross Origin Resourse-Sharing - 跨站資源共享,惡意訪問內網敏感資源。

有效的解決辦法是通過多種條件屏蔽掉非法的請求,例如 HTTP 頭、參數等:

防止大規模的惡意請求,niginx 反向代理可以配置請求頻率,對 ip 做限制。nginx 可以很方便地做訪問控制,特別是一些偶發性的大量惡意請求,需要屏蔽處理。

屏蔽 ip 地址

屏蔽 user-agent

屏蔽代理 ip

有兩種情形會需要屏蔽代理 ip:一是代理 ip 訪問,二是負載均衡(real-ip 請求負載均衡伺服器,再代理給後端 server)

創建 包裝器,這是實現 XSS 過濾的關鍵,在其內重寫了 getParameter,getParameterValues,getHeader 等方法,對 http 請求內的參數進行了過濾

9. 如何使用Druid監控sql

Druild包獲取
Maven工程中添加druid依賴包:
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
</dependency>
Druid使用
替換C3P0連接池
Web工程原先採用C3P0連接池的配置:
<!-- 配置數據源-C3PO -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="false" />
<property name="maxIdleTime" value="${cpool.maxIdleTime}" />
<property name="checkoutTimeout" value="${cpool.checkoutTimeout}" />
<property name="initialPoolSize" value="${cpool.minPoolSize}" />
<property name="minPoolSize" value="${cpool.minPoolSize}" />
<property name="maxPoolSize" value="${cpool.maxPoolSize}" />
<property name="acquireIncrement" value="${cpool.acquireIncrement}" />
<property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}" />
</bean>
改成Druid連接池DruidDataSource
<!-- 配置數據源-druid -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="20" />
</bean>
StatViewServlet配置
Druid內置提供了一個StatViewServlet用於展示Druid的統計信息。
這個StatViewServlet的用途包括:
提供監控信息展示的html頁面
提供監控信息的JSON API
StatViewServlet是一個標準的javax.servlet.http.HttpServlet,需要配置在你web應用中的WEB-INF/web.xml中。
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
配置完之後,可以通過如下格式的地址在瀏覽器訪問查看。
http:/<host>:<port>/<context>/druid

10. druid 怎麼配置防禦sql注入攻擊

使用PDO或者MySQLi,有很多封裝好的方便的Class。 例如使用PHP-PDO-MySQL-Class · GitHub(這個Class使用上比較類似Python的MySQLdb)的話,這樣就是安全的: 直接拼接字元串則是危險的: