2

私たちの会社の Web サイトに問題があるとの通知を受けました。SQL インジェクション攻撃があったことがすぐにわかりました。私は Web サイトを管理しておらず、ファイルにアクセスすることもできません (そして、将来これを防ぐ方法を知っています) が、私の現在のタスクはデータベースをクリーンアップすることです。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>がデータに自然に表示されないと仮定した場合の1つのオプションがあります。

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 に答える