在資料庫開發中,字符串過濾是防範 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
dbo.f_checkString,攔截注入嘗試雖然字符過濾能提高安全性,但現代最佳實踐建議:
此函數適用於 SQL Server 2000/2005/2008 及更新版本,是早期專案快速加固的有效手段。