如何防 SQL 注入?

一、什麼是 SQL 注入?

SQL 注入(英語:SQL injection),也稱 SQL 注入或 SQL 注碼,是發生於應用程序與數據庫層的安全漏洞。簡而言之,是在輸入的字符串之中注入 SQL 指令,在設計不良的程序當中忽略了字符檢查,那麼這些注入進去的惡意指令就會被數據庫服務器誤認爲是正常的 SQL 指令而執行,因此遭到破壞或是入侵。

有部分人認爲 SQL 注入是隻針對 Microsoft SQL Server,但只要是支持處理 SQL 指令的數據庫服務器,都有可能受到此種手法的攻擊。

二、應用程序注入的高風險情況有哪些?

三、SQL 注入的作用原理是什麼?

四、SQL 注入可能造成哪些傷害?

五、在 Java 開發中如何避免 SQL 注入?

Java 防 SQL 注入代碼如下:

public class SqlUtil {
    /**
     * 定義常用的 sql關鍵字
     */
    public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare ";
    /**
     * 僅支持字母、數字、下劃線、空格、逗號、小數點(支持多個字段排序)
     */
    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
    /**
     * 檢查字符,防止注入繞過
     */
    public static String escapeOrderBySql(String value) {
        if (StringUtil.isNotEmpty(value) && !isValidOrderBySql(value)) {
            throw new UtilException("參數不符合規範,不能進行查詢");
        }
        return value;
    }
    /**
     * 驗證 order by 語法是否符合規範
     */
    public static boolean isValidOrderBySql(String value) {
        return value.matches(SQL_PATTERN);
    }
    /**
     * SQL關鍵字檢查
     */
    public static void filterKeyword(String value) {
        if (StringUtil.isEmpty(value)) {
            return;
        }
        String[] sqlKeywords = StringUtil.split(SQL_REGEX, "\\|");
        for (String sqlKeyword : sqlKeywords) {
            if (StringUtil.indexOfIgnoreCase(value, sqlKeyword) > -1) {
                throw new UtilException("參數存在SQL注入風險");
            }
        }
    }
}

完整源代碼:
https://github.com/developers-youcong/yc-framework/blob/main/yc-common/yc-common-core/src/main/java/com/yc/common/core/base/utils/sql/SqlUtil.java

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/0iUObj6aAYJ69xlGETBITA