2

我被告知我们的一个公司网站出现了问题,很快我就可以看到它受到了 SQL 注入攻击。我不管理网站,也无法访问文件(并且知道将来如何防止这种情况发生),但我当前的任务是清理数据库。varcharMicrosoft SQL Server 数据库中的几乎所有列似乎都附加了 HTML 。

有什么方法可以运行一个简单的查询或函数来检查所有列是否有问题的 HTML 并更新所有表中的列?

例如一列是:

---------------------------
|Title
---------------------------
|product1

就是现在

---------------------------
|Title
---------------------------
|product1</title><style>.atpd{position:absolute;clip:rect(400px,auto,auto,400px);}</style><div class=atpd>Apply here <a href=http://abbypaydayloansonline.com >online payday loans</a></div>

提前致谢。

4

2 回答 2

2

这是一种选择,假设有问题的文本总是以开头</title>并且</title>不会自然地出现在数据中。

UPDATE dbo.table_name
  SET Title = LEFT(Title, CHARINDEX('</title>', Title)-1)
  WHERE Title LIKE '%</title>%'
  AND Title LIKE '%abbypaydayloansonline.com%';

如果您需要对跨多​​个表的多个列执行此操作(再次假设它</title>首先出现并且</title>在事件发生之前永远不会自然出现在数据中),则不需要显式游标:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + N'UPDATE ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  + ' SET ' + QUOTENAME(name) + ' = LEFT(' + QUOTENAME(name) 
  + ', CHARINDEX(''</title>'', ' + QUOTENAME(name) + ')-1)
  WHERE ' + QUOTENAME(name) + ' LIKE ''%</title>%''
  AND ' + QUOTENAME(name) + ' LIKE ''%abbypaydayloansonline.com%'''
  + ';' + CHAR(13) + CHAR(10)
FROM sys.columns
WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
AND system_type_id IN (35,99,167,175,231,239,231);

SELECT @sql;
-- EXEC sp_executesql @sql;

在运行之前绝对检查输出。请注意,Management Studio 只会向您显示将要执行的实际命令的一小部分,因此您可能还希望运行此查询以查看将要检查的所有表和列:

SELECT [table] = QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
         + '.' + QUOTENAME(OBJECT_NAME([object_id])),
      [column] = name
FROM sys.columns
WHERE OBJECTPROPERTY([object_id], 'IsMsShipped') = 0
AND system_type_id IN (35,99,167,175,231,239,231)
ORDER BY [table], [column];
于 2013-01-17T19:45:39.520 回答
0

假设您不想手动输入所有查询,我建议您创建一个CURSOR(尽管我讨厌游标)并遍历系统表,如下所示:

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
   c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID

然后您可以运行动态 SQL 来执行 @AaronBertrand 建议的操作。

声明你的游标并将你的变量提取到@table_name 和@column_name 中。然后运行类似(未经测试)的东西:

DECLARE @updateSQL NVARCHAR(MAX)
SET @updateSQL = 'UPDATE ' + @table_name + ' SET ' + @column_name + ' = LEFT(' + @column_name + ', CHARINDEX(''</title>'', ' + @column_name + ')-1)'
EXECUTE (@updateSQL)

祝你好运。

于 2013-01-17T19:49:19.433 回答