我收到通知说我们公司网站遇到了问题,很快我就发现它有SQL注入攻击。我不管理网站,也无法访问这些文件(并知道将来如何防止这种情况),但我目前的任务是清理数据库。似乎在Microsoft SQL Server数据库中几乎所有varchar
列都附加了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>
提前致谢。
答案 0 :(得分: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;
,则不要#39; t需要一个显式游标:
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];
在运行之前绝对检查输出。请注意,Management Studio仅显示将要执行的实际命令的一小部分,因此您可能还希望运行此查询以查看将要检查的所有表和列:
{{1}}
答案 1 :(得分: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)
祝你好运。