我的数据库最近被SQL注入攻击,在我的数据库的所有表的所有列中的数据中留下标记。是否有快速方法在所有表格上运行REPLACE
UPDATE
?类似的东西:
UPDATE [all tables] SET [all columns]=REPLACE([all columns], '<script>....</script>', '')
答案 0 :(得分:2)
不,SQL Server中没有任何内容可以让您这样做。
然而,间接 - 有一种方法:你可以检查系统目录视图并枚举所有列 - 也只限于那些(N)VARCHAR /(N)CHAR列 - 你可以拥有你的第一个T-SQL语句从这些系统目录视图生成UPDATE语句列表。
使用该T-SQL语句列表,您可以运行实际命令来清理数据库 - 这将触及数据库中所有表中所有面向字符的列。
SELECT
'UPDATE ' + sch.name + '.' + t.name + ' SET ' + c.name + ' = REPLACE("<script>....</script>", "")'
FROM
sys.columns c
INNER JOIN
sys.tables t ON c.object_id = t.object_id
INNER JOIN
sys.schemas sch ON t.schema_id = sch.schema_id
WHERE
t.is_ms_shipped = 0
AND c.user_type_id IN (167, 175, 231, 239)
这将生成一个UPDATE
语句列表,然后您可以将这些语句复制并粘贴到第二个SSMS窗口中,然后运行它们来更新列。
UPDATE dbo.T_ServicePSSAAudit SET RunType = REPLACE(RunType, '<script>....</script>', '')
UPDATE dbo.T_PromoStatus SET StatusText = REPLACE(StatusText, '<script>....</script>', '')
UPDATE dbo.T_PromoStatus SET StatusCode = REPLACE(StatusCode, '<script>....</script>', '')
UPDATE dbo.T_DSLSpeed SET CaptionCode = REPLACE(CaptionCode, '<script>....</script>', '')
UPDATE dbo.T_DVPTransfer SET RequestType = REPLACE(RequestType, '<script>....</script>', '')
UPDATE dbo.T_Promo SET Description = REPLACE(Description, '<script>....</script>', '')
您可以在sys.types
目录视图中找到所有已定义的系统类型 - 我只抓取user_type_id
,char
,nchar
和varchar
的{{1}}值nvarchar
在此示例中。
答案 1 :(得分:0)
一种方法是通过浏览元数据。数据库中的sys.tables
表可以为您提供所有表的列表:
select *
from sys.tables
然后,您可以使用sys.columns
表来获取这些表中的列。然后,您需要生成SQL以在循环中进行更新,例如。
在这里查看有关在SQL Server 2005中查询数据库架构的一般信息:http://msdn.microsoft.com/en-us/library/ms345522(v=SQL.90).aspx