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

SQL Server 清理資料表中惡意 Script 標籤:游標批次更新字元型欄位

     編輯:關於SqlServer

情境

資料庫遭大量注入 <script src=https://...></script> 等惡意字串,需掃描所有使用者資料表的所有字元型欄位 (char, nchar, varchar, nvarchar, text, ntext) 並移除。

清理腳本

DECLARE @t VARCHAR(255), @c VARCHAR(255)
DECLARE @str VARCHAR(500) = ''  -- 目標惡意字串
DECLARE @str2 VARCHAR(500) = ''                                               -- 替換為空字串

DECLARE table_cursor CURSOR FOR
    SELECT a.name, b.name
    FROM sysobjects a
    JOIN syscolumns b ON a.id = b.id
    JOIN systypes c ON b.xtype = c.xtype
    WHERE a.xtype = 'U'                          -- 使用者資料表
      AND c.name IN ('char','nchar','varchar','nvarchar','text','ntext')

OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @t, @c

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 動態 SQL:將欄位轉為 varchar(8000) 再 REPLACE (text/ntext 需轉型)
    EXEC('UPDATE [' + @t + '] SET [' + @c + '] = REPLACE(CAST([' + @c + '] AS VARCHAR(8000)), ''' + @str + ''', ''' + @str2 + ''')')
    FETCH NEXT FROM table_cursor INTO @t, @c
END

CLOSE table_cursor
DEALLOCATE table_cursor

注意事項

  • text/ntext 型別無法直接 REPLACE,需 CAST(... AS VARCHAR(8000)) (超過 8000 字元會截斷,SQL 2005+ 建議用 VARCHAR(MAX))
  • 大量資料表/欄位執行時間較長,建議離峰時段執行
  • 執行前務必完整備份資料庫
  • 若惡意字串有變體 (大小寫、編碼、空白),需擴充 @str 或改用 REPLACE(..., LOWER(...), ...) 等模糊比對

進階防護

  1. 修補應用程式 SQL Injection 漏洞 (參數化查詢)
  2. 部署 WAF 過濾惡意請求
  3. 資料庫帳號最小權限,移除不必要的 UPDATE 權限
  4. 啟用 SQL Server 稽核 (Audit) 記錄可疑 DML
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved