2008.12.10 22:52
안녕하세요 HOSTWAY입니다.
SQL Injection으로 인해 <Scrtip 구문이 삽입이 되어 피해를 입은 테이블에 대해서 자동으로 수정을 해주는 커서 입니다.
크게 자료형 vchar와 text로 나누어져 있습니다. 자료형 별로 나누어 2번씩 업데이트 해주시면 되겠습니다.
* 사용전 반드시 백업을 해주시기 바라며 DATABASE에 대해서 지식이 있는 개발자 분들이 사용해 주시면 되겠습니다.
감사합니다.
-----------------------------------
-- 적용하기 전 백업을 꼭 해주세요
-- EXEC 앞에 있는 주석 --를 제거해주시고 쓰시면 되겠습니다.
-- 참고사항으로 소유권 문제로 안될수 있으므로 쿼리 분석기의 바꾸기 기능으로
-- dbo를 사용자 계정으로 바꿔주시면 됩니다.
-- 감사합니다.
-----------------------------------
DECLARE @curr_sysobjid varchar(100), @curr_sysobj varchar(500),@curr_columns_id varchar(100), @curr_columns_name varchar(100),@curr_columns_xtype varchar(50)
DECLARE sysobjects_cursor CURSOR
FOR
SELECT id,name FROM sysobjects WHERE xtype='U'
OPEN sysobjects_cursor
FETCH NEXT FROM sysobjects_cursor INTO @curr_sysobjid,@curr_sysobj
WHILE(@@FETCH_STATUS <> -1)
BEGIN
IF(@@FETCH_STATUS <> -2)
BEGIN
-- 컬럼명 출력용 커서----
PRINT @curr_sysobjid + ' ' + @curr_sysobj
EXEC('DECLARE columns_cursor CURSOR FOR SELECT id,name,xtype FROM syscolumns WHERE id =' + @curr_sysobjid)
OPEN columns_cursor
FETCH NEXT FROM columns_cursor INTO @curr_columns_id,@curr_columns_name,@curr_columns_xtype
WHILE(@@FETCH_STATUS<> -1)
BEGIN
IF(@@FETCH_STATUS <> -2)
BEGIN
IF(type_name(@curr_columns_xtype) = 'varchar' or type_name(@curr_columns_xtype) = 'nvarchar')
BEGIN
-- 자료형이 varchar거나 nvarchar일때
-- update할때
--EXEC('UPDATE dbo.' + @curr_sysobj + ' SET ' + @curr_columns_name + ' = ' + 'replace(' + @curr_columns_name + ',substring(' + @curr_columns_name + ',charindex(' + '''<script src=''' + ',' + @curr_columns_name +'), len(' + @curr_columns_name + ')),' + '''''' +')' + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
----------------
-- SELECT할때
--EXEC('SELECT ' + @curr_columns_name + ',replace(' + @curr_columns_name + ',substring(' + @curr_columns_name + ',charindex(' + '''<script src=''' + ',' + @curr_columns_name +'), len(' + @curr_columns_name + ')),' + '''''' +')' + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
----------------
PRINT @curr_columns_name
END
IF(type_name(@curr_columns_xtype) = 'ntext' or type_name(@curr_columns_xtype) = 'text')
BEGIN
-- 자료형이 text 나 ntext일때 CONVERT함수로 text,ntext 자료형을 varchar로 변경한다.
-- UPDATE할때
--EXEC('UPDATE dbo.' + @curr_sysobj + ' SET ' + @curr_columns_name + ' = ' + 'replace(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',substring(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',charindex(' + '''<script src=''' + ',' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' +'), len(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ')),' + '''''' +')' + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
-------------
-- SELECT할때
--EXEC('SELECT ' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',replace(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',substring(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ',charindex(' + '''<script src=''' + ',' + @curr_columns_name +'), len(' + 'CONVERT(varchar(8000),' + @curr_columns_name + ')' + ')),' + '''''' +')' + ' FROM dbo.' + @curr_sysobj + ' WHERE ' + @curr_columns_name + ' LIKE ' + '''%<script src=%''')
-------------
PRINT @curr_columns_name
END
END
FETCH NEXT FROM columns_cursor INTO @curr_columns_id,@curr_columns_name,@curr_columns_xtype
END
CLOSE columns_cursor
DEALLOCATE columns_cursor
---------------------
-- PRINT 'SELECT id,name FROM ' + @curr_sysobj + ' WHERE id =' + @curr_sysobjid
FETCH NEXT FROM sysobjects_cursor INTO @curr_sysobjid,@curr_sysobj
END
END
CLOSE sysobjects_cursor
DEALLOCATE sysobjects_cursor