更新每个表中的每一列

时间:2010-10-10 11:11:52

标签: .net sql-server-2005 tsql sql-injection

我的数据库最近被SQL注入攻击,在我的数据库的所有表的所有列中的数据中留下标记。是否有快速方法在所有表格上运行REPLACE UPDATE?类似的东西:

UPDATE [all tables] SET [all columns]=REPLACE([all columns], '<script>....</script>', '')

2 个答案:

答案 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_idcharncharvarchar的{​​{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