亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java預(yù)防SQL注入的具體實(shí)踐方法

 更新時(shí)間:2025年01月22日 08:35:44   作者:Planter  
在?Java?中預(yù)防?SQL?注入的核心是?避免直接拼接?SQL?語(yǔ)句,并通過(guò)參數(shù)化查詢(xún)、ORM?框架和嚴(yán)格的輸入驗(yàn)證來(lái)實(shí)現(xiàn)安全防護(hù),以下是具體實(shí)踐方法,感興趣的小伙伴跟著小編一起來(lái)看看吧

1. 強(qiáng)制使用 PreparedStatement(參數(shù)化查詢(xún))

原理:將 SQL 語(yǔ)句結(jié)構(gòu)與用戶(hù)輸入數(shù)據(jù)分離,確保輸入內(nèi)容始終作為“數(shù)據(jù)”處理,而非可執(zhí)行的代碼。

正確示例:

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (Connection conn = dataSource.getConnection();
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    
    pstmt.setString(1, username); // 自動(dòng)轉(zhuǎn)義特殊字符(如 ' -> \')
    pstmt.setString(2, password);
    
    try (ResultSet rs = pstmt.executeQuery()) {
        // 處理結(jié)果
    }
}

錯(cuò)誤做法(高危!):

// 直接拼接 SQL(存在注入風(fēng)險(xiǎn)?。?
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);

2. 使用 ORM 框架(如 Hibernate/JPA)

ORM 框架會(huì)自動(dòng)生成參數(shù)化查詢(xún),減少手寫(xiě) SQL 的注入風(fēng)險(xiǎn)。

Hibernate 示例:

// 使用 Hibernate Criteria API
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);

query.where(
    cb.equal(root.get("username"), username),
    cb.equal(root.get("password"), password)
);

User user = session.createQuery(query).uniqueResult();

HQL 參數(shù)化:

String hql = "FROM User WHERE username = :username";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("username", username);
User user = query.uniqueResult();

3. 輸入驗(yàn)證與過(guò)濾

白名單校驗(yàn):

// 校驗(yàn)用戶(hù)名是否符合規(guī)則(僅允許字母、數(shù)字、下劃線)
if (!username.matches("^[a-zA-Z0-9_]{4,20}$")) {
    throw new IllegalArgumentException("Invalid username");
}

轉(zhuǎn)義特殊字符(備用方案):

如果必須拼接 SQL(如動(dòng)態(tài)表名),需嚴(yán)格過(guò)濾:

// 使用 Apache Commons Text 轉(zhuǎn)義
String safeInput = StringEscapeUtils.escapeSql(input); // 僅適用于簡(jiǎn)單場(chǎng)景,不推薦依賴(lài)!

4. 避免動(dòng)態(tài)拼接 SQL

高危場(chǎng)景:動(dòng)態(tài)表名、列名等無(wú)法通過(guò) PreparedStatement 參數(shù)化。
安全做法:使用白名單校驗(yàn)合法值:

// 動(dòng)態(tài)表名校驗(yàn)(只允許預(yù)定義的合法表名)
Set<String> validTables = Set.of("users", "products");
if (!validTables.contains(tableName)) {
    throw new IllegalArgumentException("Invalid table name");
}
String sql = "SELECT * FROM " + tableName; // 此時(shí)拼接是安全的

5. 數(shù)據(jù)庫(kù)配置與權(quán)限

  • 最小權(quán)限原則:應(yīng)用使用的數(shù)據(jù)庫(kù)賬號(hào)應(yīng)僅擁有 SELECTINSERT、UPDATE 等必要權(quán)限,禁止 DROP、GRANT 等高危操作。

  • 禁用敏感函數(shù):如 MySQL 的 LOAD_FILE、INTO OUTFILE。

6. 其他安全措施

隱藏錯(cuò)誤信息:

try {
    // 執(zhí)行數(shù)據(jù)庫(kù)操作
} catch (SQLException e) {
    // 生產(chǎn)環(huán)境返回通用錯(cuò)誤,避免泄露細(xì)節(jié)
    logger.error("Database error", e);
    throw new RuntimeException("Internal server error");
}

使用安全工具:

  • OWASP ESAPI:提供安全的 SQL 轉(zhuǎn)義方法。

  • SQL 注入掃描工具:集成 sqlmapSonarQube 進(jìn)行代碼審計(jì)。

總結(jié):Java 防御 SQL 注入的核心規(guī)則

場(chǎng)景

安全做法

高風(fēng)險(xiǎn)做法(避免?。?/p>

執(zhí)行 SQL 查詢(xún)

使用 PreparedStatement 參數(shù)化

拼接字符串生成 SQL

動(dòng)態(tài)表名/列名

白名單校驗(yàn)合法值

直接拼接用戶(hù)輸入

輸入驗(yàn)證

正則表達(dá)式白名單過(guò)濾

僅在前端驗(yàn)證或不做驗(yàn)證

錯(cuò)誤信息處理

記錄日志,返回通用錯(cuò)誤提示

返回詳細(xì)數(shù)據(jù)庫(kù)錯(cuò)誤信息

ORM 框架

優(yōu)先使用 Hibernate/JPA 的 Criteria 或 HQL

手動(dòng)拼接 HQL 或 JPQL

關(guān)鍵點(diǎn)

  • 絕不信任用戶(hù)輸入:所有外部輸入(包括 HTTP 請(qǐng)求參數(shù)、Cookie、Headers)均需驗(yàn)證和轉(zhuǎn)義。

  • 代碼審查:定期檢查項(xiàng)目中是否存在 Statement 或字符串拼接 SQL 的代碼。

  • 依賴(lài)更新:確保數(shù)據(jù)庫(kù)驅(qū)動(dòng)和 ORM 框架保持最新版本,修復(fù)已知漏洞。

以上就是Java預(yù)防SQL注入的具體實(shí)踐方法的詳細(xì)內(nèi)容,更多關(guān)于Java預(yù)防SQL注入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解SpringBoot?JPA常用注解的使用方法

    詳解SpringBoot?JPA常用注解的使用方法

    這篇文章主要介紹了SpringBoot?JPA常用注解的使用方法,spring?boot作為當(dāng)前主流的技術(shù),來(lái)看看常用的注解怎么用,如果有錯(cuò)誤的地方還請(qǐng)指正,需要的朋友可以參考下
    2023-03-03
  • Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    Java中String和StringBuffer及StringBuilder?有什么區(qū)別

    這篇文章主要介紹了Java中String和StringBuffer及StringBuilder?有什么區(qū)別,String?是?Java?語(yǔ)言非?;A(chǔ)和重要的類(lèi),更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • Scala中的mkString的具體使用方法

    Scala中的mkString的具體使用方法

    這篇文章主要介紹了Scala中的mkString的具體方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 如何在Spring Boot中建立連接及測(cè)試

    如何在Spring Boot中建立連接及測(cè)試

    對(duì)于剛接觸MQTT的開(kāi)發(fā)者來(lái)說(shuō),了解如何在Spring Boot項(xiàng)目中集成MQTT客戶(hù)端并建立連接是邁向?qū)嶋H應(yīng)用的重要一步,今天,我將分享一個(gè)詳細(xì)的入門(mén)指南,帶你一步步在Spring Boot中建立MQTT連接,并通過(guò)JUnit進(jìn)行簡(jiǎn)單的單元測(cè)試,感興趣的朋友一起看看吧
    2024-12-12
  • SpringBoot實(shí)現(xiàn)文件的上傳、下載和預(yù)覽功能

    SpringBoot實(shí)現(xiàn)文件的上傳、下載和預(yù)覽功能

    在Spring Boot項(xiàng)目中實(shí)現(xiàn)文件的上傳、下載和預(yù)覽功能,可以通過(guò)使用Spring MVC的MultipartFile接口來(lái)處理文件上傳,并使用HttpServletResponse或Resource來(lái)實(shí)現(xiàn)文件下載和預(yù)覽,下面是如何實(shí)現(xiàn)這些功能的完整示例,需要的朋友可以參考下
    2024-08-08
  • Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法

    Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot接收單個(gè)String入?yún)⒌慕鉀Q方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java處理按鈕點(diǎn)擊事件的方法

    java處理按鈕點(diǎn)擊事件的方法

    下面小編就為大家?guī)?lái)一篇java處理按鈕點(diǎn)擊事件的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • spring啟動(dòng)后保證創(chuàng)建的對(duì)象不被垃圾回收器回收

    spring啟動(dòng)后保證創(chuàng)建的對(duì)象不被垃圾回收器回收

    最近看到一個(gè)問(wèn)題是,spring在啟動(dòng)后如何保證創(chuàng)建的對(duì)象不被垃圾回收器回收?。所以本文結(jié)合jvm的垃圾回收機(jī)制和spring中的源代碼做出自己的一點(diǎn)猜測(cè)。有需要的朋友們可以參考借鑒。
    2016-09-09
  • xxl-job如何濫用netty導(dǎo)致的問(wèn)題及解決方案

    xxl-job如何濫用netty導(dǎo)致的問(wèn)題及解決方案

    本篇文章講解xxl-job作為一款分布式任務(wù)調(diào)度系統(tǒng)是如何濫用netty的,導(dǎo)致了怎樣的后果以及如何修改源碼解決這些問(wèn)題,netty作為一種高性能的網(wǎng)絡(luò)編程框架,十分受大家喜愛(ài),今天就xxl-job濫用netty這一問(wèn)題給大家詳細(xì)下,感興趣的朋友一起看看吧
    2021-05-05
  • 詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask

    詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask

    這篇文章主要介紹了詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論