首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MSSQL 自定義函數:字符串過濾與 SQL 注入防護實戰

     編輯:關於SqlServer

前言

在資料庫開發中,字符串過濾是防範 SQL 注入攻擊的第一道防線。本文將詳細介紹如何在 MSSQL 中建立自定義函數來過濾危險字符,並展示在儲存過程中呼叫該函數的完整範例。

建立字符串過濾函數

以下函數 f_checkString 可移除單引號、雙引號、冒號、連字號等常見 SQL 注入特徵字符:

CREATE FUNCTION f_checkString(@temp VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN
    SET @temp = REPLACE(@temp, '''', '')   -- 移除單引號
    SET @temp = REPLACE(@temp, '"', '')    -- 移除雙引號
    SET @temp = REPLACE(@temp, ':', '')    -- 移除冒號
    SET @temp = REPLACE(@temp, '-', '')    -- 移除連字號
    RETURN @temp
END

參數說明:

  • @temp VARCHAR(4000):輸入參數,最大長度 4000 字符
  • RETURNS VARCHAR(4000):返回同類型、同長度的淨化後字符串

實戰應用:用戶登入驗證儲存過程

在登入驗證流程中,先對用戶名與密碼進行過濾,再執行查詢比對:

CREATE PROCEDURE sp_CheckUser
    @username VARCHAR(20),  -- 用戶名
    @password VARCHAR(20)   -- 密碼
AS
BEGIN
    DECLARE @str VARCHAR(20),
            @result INT,
            @status INT

    -- 過濾非法字符串
    SELECT @username = dbo.f_checkString(@username)
    SELECT @password = dbo.f_checkString(@password)

    -- 查詢用戶資料
    SELECT @str = [password], @status = status
    FROM usersInfo
    WHERE username = @username

    IF @@ROWCOUNT = 0
        SET @result = -1  -- 用戶名錯誤
    ELSE
    BEGIN
        IF @status = 1
            SET @result = -3  -- 帳號被鎖定
        ELSE
        BEGIN
            IF @str = @password
                SET @result = 0   -- 登入成功
            ELSE
                SET @result = -2  -- 密碼錯誤
        END
    END

    SELECT @result
END

關鍵邏輯解析

  1. 參數淨化:在查詢前呼叫 dbo.f_checkString,攔截注入嘗試
  2. 狀態檢查:先判斷帳號是否存在,再檢查鎖定狀態,最後驗證密碼
  3. 返回碼設計:使用負數區分不同錯誤類型,便於前端處理

安全建議

雖然字符過濾能提高安全性,但現代最佳實踐建議:

  • 優先使用參數化查詢(Parameterized Queries)
  • 採用最小權限原則,資料庫帳號僅授予必要權限
  • 定期進行滲透測試與代碼審計
  • 啟用SQL Server 稽核記錄可疑操作

此函數適用於 SQL Server 2000/2005/2008 及更新版本,是早期專案快速加固的有效手段。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved