資料庫遭大規模 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'