避免SQL注入漏洞的實用技巧

隨着互聯網業務的迅速發展,Web應用就成為了人們工作、生活中不可缺少的一部分。而 Web 應用的開發求快、求快速迭代,常常導致 Web 應用中 SQL 注入等漏洞的出現。SQL 注入攻擊能夠破壞數據庫完整性、泄露敏感數據、進行惡意操作等,嚴重危害了 Web 應用的安全性。因此,如何避免 SQL 注入漏洞,保障 Web 應用的安全性成為了 Web 開發中的一大難點。

一、選擇合適的數據庫訪問API

使用安全的、經過充分測試的數據庫訪問 API 是防止 SQL 注入攻擊的基礎。正規的數據庫API都會提供SQL防注入的解決方案,比如基於C/C++封裝的mysql庫提供的`mysql_real_escape_string`方法可以對字符串類型進行安全的SQL過濾。在這裡,我們以Java語言為例,介紹JDBC API下的預編譯語句來避免SQL注入問題的發生。下面是一個基於JDBC API預編譯語句的代碼樣例:

    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    try {
        conn = DriverManager.getConnection(url, name, password);
        String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
        pst = conn.prepareStatement(sql);
        pst.setString(1, username);
        pst.setString(2, password);
        rs = pst.executeQuery();
        while (rs.next()) {
            //處理結果集
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }

            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

通過將SQL語句預定義好,再將值與語句分離開來,可以明確標識哪些地方是需要轉義的。這樣可以避免惡意輸入中有SQL突破到我們的SQL命令而執行。同樣的預編譯語句由於在執行的時候會先進性語法樹編譯後才執行,因此也節省了函數調用+SQL執行的時間,效率上也更能滿足實際應用需求。

二、輸入驗證和過濾

輸入驗證和過濾是 Web 開發中防止 SQL 注入漏洞的重要手段。通過有效的驗證和過濾,可以防止惡意用戶構造惡意的 SQL 語句,從而保障 Web 應用的安全性。下面我們分別介紹輸入驗證和過濾的一些實用技巧。

a. 輸入驗證

輸入驗證是指在用戶提交數據之前,對用戶提交的數據進行格式檢查和邏輯檢查。在 Web 應用中,輸入驗證的實現主要有兩種方式:前端驗證和後端驗證。

前端驗證通常使用 JavaScript 來實現。前端驗證的優點是可以在用戶輸入數據時就進行實時驗證,提高了用戶體驗。但前端驗證也有一定缺點,比如前端校驗可以被繞開,因此不能單獨依賴前端驗證保證安全;前端驗證也不能保證驗證邏輯的完整性。因此,前端驗證只應該作為補充,後端驗證才是保障數據安全的最重要的手段。

後端驗證通常使用正則表達式、字符串轉換等算法來實現。通過對數據進行格式化和轉換,可以保證數據符合規定的格式,在存儲到數據庫時,也就避免了 SQL 注入漏洞帶來的風險。下面是一個基於Java的輸入合法性校驗示例代碼:

/**
 * 驗證當前字符串是否為合法的郵箱
 *
 * @param email 郵箱字符串
 * @return 是否為合法郵箱
 */
public static boolean isValidEmail(String email) {
    if (email == null || email.length() == 0) {
        return false;
    }
    String regex = "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@"
            + "(([0-9]{1,3}\\.){3}[0-9]{1,3}"
            + "|"
            + "([a-zA-Z]{2,4}|[0-9]{1,3})(\\.[a-zA-Z]{2,4}){1,2})$";
    return email.matches(regex);
}

b. 輸入過濾

輸入過濾是指在 Web 應用中,通過將一些特定的字符進行屏蔽或者替換來避免 SQL 注入漏洞的發生。輸入過濾主要分為兩類:字符過濾和關鍵字過濾。

字符過濾通常使用一些正則表達式來實現,通過將一些特定的字符進行屏蔽或者替換來達到過濾掉惡意 SQL 注入語句的目的。字符過濾通常是以黑名單的方式實現,即指定一些需要過濾掉的字符,比如「』」、「-」等。

關鍵字過濾是指將 SQL 語句中的一些關鍵字進行過濾或者替換。關鍵字過濾通常是以白名單的方式實現,即只允許指定的關鍵字出現在 SQL 語句中。關鍵字過濾也可以通過正則表達式進行實現,比如將 SQL 語句中的「select」替換成「s_e_l_e_c_t」。

三、使用 ORM 框架

ORM(Object Relational Mapping)框架是一種在面向對象編程語言和關係數據庫之間建立映射的編程技術,簡單來說就是將數據庫表映射成對象,通過對象操作數據庫表。ORM 框架是一種非常優秀的數據庫訪問方式,不僅可以提高代碼的復用性、可維護性和可擴展性,還可以有效地避免 SQL 注入漏洞的發生。下面我們以 Java 語言為例,介紹如何使用 MyBatis ORM 框架避免 SQL 注入漏洞。

MyBatis 是一個優秀的 ORM 框架,它可以將 SQL 語句和數據庫訪問過程進行解耦,同時支持動態 SQL 語句,在實際的 Web 開發中得到了廣泛的應用。下面是使用 MyBatis ORM 框架的代碼示例:


<mapper namespace="com.example.UserMapper">
    <select id="getUserByNameAndPassword" parameterType="com.example.User"
        resultType="com.example.User">
        SELECT * FROM users WHERE username = #{username} AND password = #{password}
    </select>
</mapper>

// Java 代碼
public class UserMapper {
    public User getUserByNameAndPassword(User user) throws Exception {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        try {
            return sqlSession.selectOne("com.example.UserMapper.getUserByNameAndPassword", user);
        } finally {
            sqlSession.close();
        }
    }
}

使用 MyBatis ORM 框架可以將 SQL 語句和 Java 代碼進行分離,避免了 SQL 注入漏洞的發生。同時,MyBatis 也支持預編譯語句和輸入過濾等功能,更加安全可靠。在使用 MyBatis ORM 框架時,需要注意的是語句的動態拼接,盡量不要使用字符串拼接的方式,這樣容易導致 SQL 注入漏洞的發生。

原創文章,作者:OSIFY,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370225.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OSIFY的頭像OSIFY
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相關推薦

  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是數據庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901解析

    本文將對Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901進行詳細解析,並提供相關代碼示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    編程 2025-04-27
  • Python漏洞挖掘全指南

    本文將從多個方面詳細闡述Python漏洞挖掘的相關知識,幫助開發工程師了解並掌握漏洞挖掘的基礎知識和實戰技巧。 一、漏洞類型 漏洞是指誤用或設計上的錯誤,可導致產品、應用或系統中存…

    編程 2025-04-27
  • Python實用技巧:如何將數據轉換成字典?

    在Python運用中,字典是一種非常常見的數據類型,它可以存儲具有鍵、值對的數據,可以方便快捷地對數據進行查找和保存,因此常常被用來作為數據的主要存儲方式。在Python中,我們可…

    編程 2025-04-27
  • Coremail 漏洞詳解

    Coremail是國內主流的企業郵件服務器軟件,2018年曝出多個漏洞。本文將詳細闡述Coremail漏洞的危害,漏洞種類和利用方法。同時提供完整的代碼示例,幫助讀者更加深入地了解…

    編程 2025-04-25
  • SQL Server Not In概述

    在今天的軟件開發領域中,數據庫查詢不可或缺。而SQL Server的”Not In”操作符就是這個領域中非常常用的操作符之一。雖然”Not In…

    編程 2025-04-25
  • GORM SQL注入詳解

    GORM是一個非常優秀的Go語言ORM框架,它的目標是簡化數據庫操作,提高開發效率,但是在使用的過程中,也難免會遇到SQL注入的問題。本文將從多個方面來詳細解析GORM SQL注入…

    編程 2025-04-25

發表回復

登錄後才能評論