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

SQL 注入資料修復兩大腳本:精確替換 vs 截斷清理 (游標遍歷全庫)

     編輯:關於SqlServer

背景

資料庫遭大規模 XSS 注入,惡意腳本如 <script src=...> 植入大量字串欄位。需全庫掃描清洗。

方案一:精確替換(僅移除注入片段,保留其餘內容)

DECLARE @delStr NVARCHAR(500) = N'';

SET NOCOUNT ON;
DECLARE @tableName SYSNAME, @columnName SYSNAME, @tbId INT, @rowCnt INT, @total INT = 0;
DECLARE @sql NVARCHAR(MAX);

DECLARE curTbl CURSOR LOCAL FAST_FORWARD FOR
    SELECT name, id FROM sysobjects WHERE xtype = 'U';  -- 使用者表

OPEN curTbl;
FETCH NEXT FROM curTbl INTO @tableName, @tbId;

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE curCol CURSOR LOCAL FAST_FORWARD FOR
        SELECT name FROM syscolumns 
        WHERE id = @tbId AND xtype IN (167, 175, 231, 239, 35, 99);  -- 字串類型

    OPEN curCol;
    FETCH NEXT FROM curCol INTO @columnName;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 動態構建 REPLACE 更新
        SET @sql = N'UPDATE [' + @tableName + N'] SET [' + @columnName + N'] = ' +
                   N'REPLACE([' + @columnName + N'], @delStr, N'''') ' +
                   N'WHERE [' + @columnName + N'] LIKE N''%'' + @delStr + N''%''';
        
        EXEC sp_executesql @sql, N'@delStr NVARCHAR(500)', @delStr;
        
        SET @rowCnt = @@ROWCOUNT;
        SET @total += @rowCnt;
        IF @rowCnt > 0
            PRINT '表:' + @tableName + ',欄:' + @columnName + ' 更新 ' + CAST(@rowCnt AS VARCHAR(10)) + ' 筆';
        
        FETCH NEXT FROM curCol INTO @columnName;
    END
    CLOSE curCol; DEALLOCATE curCol;
    FETCH NEXT FROM curTbl INTO @tableName, @tbId;
END
CLOSE curTbl; DEALLOCATE curTbl;
PRINT '全庫共清洗 ' + CAST(@total AS VARCHAR(10)) + ' 筆記錄';
SET NOCOUNT OFF;

優點:精準移除,不傷正常內容。
缺點:游標逐表逐欄,極慢;REPLACE 不支援正則,多變體需多跑。

方案二:截斷清理(從注入起始位置刪除至尾)

DECLARE @delStr NVARCHAR(500) = N'