"목마른 사람이 우물을 판다"고 했던가요..
일단 삽입이 되도록
하는 구문을 분석하여서 이를 바탕으로 스크립트만 삭제하는 구문을 작성하려고 하였습니다. char,
nchar, varchar, nvarchar 는 너무 쉽게 변경이 가능했지만 문제는 text, ntext
같은 대용량의 유니코드 형식의 데이터에서 스크립트를 삭제하는 부분이였습니다.
그래도 문제는 발생하였습니다. 문자열을 신문을 집어 넣은건지 상당히 큰 text
타입의 데이터를 만나버리고 말았던 것이였습니다.
결국 VBScript 를
이용해서 다시 작업을 하도록 변경하였습니다. (사실 SQL 쿼리 수정보다 VBScript가 더
쉽게 생각되었습니다.;)
' ***************************************************************************************
' 디비 변조데이터 복구 스크립트
' 버 젼 : v1.0
' ***************************************************************************************
Option Explicit
'On Error Resume Next
' 삭제할 자바스크립트 구문
' 다중입력이 가능하며, 다중입력시 | 로 입력하시기 바랍니다.
Const strReplace = "<script src=http://ojkqn.cn></script>|<script src=http://wefd4.cn>|"
Const strDBServerIP = "127.0.0.1" ' 접속할 데이터베이스 서버 IP
Const strSQLuser = "sa" ' 접속할 데이터베이스 아이디
Const strSQLpass = "1230" ' 접속할 데이터베이스 패스워드
Const strSQLBD = "pubs" ' 접속할 데이터베이스 이름
Dim CRLF, TAB :TAB = CHR( 9 ):CRLF = CHR( 13 ) & CHR( 10 )
Dim AdCn,connectionstring,SQL,DBdata,arrDBData, arrDBData2
Dim SQL_Tables, SQL_Tables_Exists_Javascript, ColumnsArrDBdata, ColumnsTotal, TableArrDBdata, TableTotal, SQL_tmp
Dim i, j, db_table, db_column, db_xtype, db_type, db_owner, db_len
Dim TablecolumnCheck, SQL_Tables_Replace_Javascript
Dim KeyName, Key_code, Key_entry, arr_Replacetxt, Replacetxt
arr_Replacetxt = split(strReplace,"|")
SQL_Tables = "select o.name, c.name, c.xtype, type = (select t.name from systypes t where t.name <> 'sysname' and t.xtype=c.xtype ) , owner = user_name(uid) " & _
" ,Len = (select case when t.name in (N'nchar', N'nvarchar') then c.length/2 else c.length end from systypes t where t.name <> 'sysname' and t.xtype=c.xtype ) " & _
" from dbo.syscolumns c " & _
" Left Join (select name,id,uid from dbo.sysobjects where xtype='U' " & _
" and (case when (OBJECTPROPERTY(id, N'IsMSShipped')=1) then 1 else OBJECTPROPERTY(id, N'IsSystemTable') end)=0 ) o " & _
" on c.id=o.id where o.name is not null and c.xtype in (35, 99, 167, 175, 231, 239) " & _
" order by o.name, c.name "
' 35 -- text
' 99 -- ntext
' 167 -- varchar
' 175 -- char
' 231 -- nvarchar
' 239 -- nchar
connectionstring = "Provider=SQLOLEDB.1;Data Source= "&strDBServerIP&";Initial Catalog="&strSQLBD&";user id = '"&strSQLuser&"';password='"&strSQLpass&"' "
SQL = SQL_Tables
Set AdCn = CreateObject("ADODB.Connection")
AdCn.open = connectionstring
set DBdata = AdCn.Execute(SQL)
IF Not DBdata.Eof then
ColumnsArrDBdata = DBdata.GetRows()
ColumnsTotal = UBound(ColumnsArrDBdata, 2)+1
else
ColumnsTotal = 0
end if
DBdata.Close
Set DBdata = Nothing
wscript.echo "컬럼갯수 : "&ColumnsTotal
If ColumnsTotal>0 then
For i=1 to ColumnsTotal
db_table = ColumnsArrDBdata(0,i-1)
db_column = ColumnsArrDBdata(1,i-1)
db_xtype = ColumnsArrDBdata(2,i-1)
db_type = ColumnsArrDBdata(3,i-1)
db_owner = ColumnsArrDBdata(4,i-1)
db_len = ColumnsArrDBdata(5,i-1)
SQL = "select count(*) From ["&db_owner&"].["&db_table&"] where CHARINDEX('<script',"&db_column&") > 0 "
set DBdata = AdCn.Execute(SQL)
IF Not DBdata.Eof then
arrDBData = DBdata.GetRows()
TablecolumnCheck = arrDBData(0,0)
else
TablecolumnCheck = 0
end if
DBdata.Close
Set DBdata = Nothing
if TablecolumnCheck > 0 then
If db_xtype <> 35 and db_xtype <> 99 then
For each Replacetxt in arr_Replacetxt
wscript.echo "["&db_owner&"].["&db_table&"] 에서 "&db_column&" 컬럼에 대한 "&Replacetxt&" 삭제중..."
SQL = "Update ["&db_owner&"].["&db_table&"] Set "&db_column&" = replace("&db_column&",'"&Replacetxt&"','')"
AdCn.Execute(SQL)
Next
Else
SQL = "select name from syscolumns where id in (select id from sysobjects where name = '"&db_table&"') "
SQL = SQL&"and colid in (select sik.colid from sysindexkeys sik join sysobjects so on sik.id = so.id where sik.indid = 1 and so.name = '"&db_table&"')"
set DBdata = AdCn.Execute(SQL)
IF Not DBdata.Eof then
arrDBData2 = DBdata.GetRows()
KeyName = arrDBData2(0,0)
else
KeyName = ""
end if
DBdata.Close
Set DBdata = Nothing
If Len(KeyName) > 0 then
SQL = "select "&KeyName&","&db_column&" From ["&db_owner&"].["&db_table&"] "
set DBdata = AdCn.Execute(SQL)
IF Not DBdata.Eof then
TableArrDBdata = DBdata.GetRows()
TableTotal = UBound(TableArrDBdata, 2)+1
else
TableTotal = 0
end if
DBdata.Close
Set DBdata = Nothing
If TableTotal > 0 then
for j=1 to TableTotal
Key_code = TableArrDBdata(0,j-1)
Key_entry = TableArrDBdata(1,j-1)
Key_entry = Replace(Key_entry,"'","''")
For each Replacetxt in arr_Replacetxt
Key_entry = Replace(Key_entry,Replacetxt,"")
Next
wscript.echo "["&db_owner&"].["&db_table&"] 에서 "&db_column&" 컬럼에 대한 삭제중..."
SQL = "update ["&db_owner&"].["&db_table&"] Set "&db_column&" = '"&Key_entry&"' where "&KeyName&"="&Key_code
AdCn.Execute(SQL)
Next
End if
End if
End if
End if
next
Else
wscript.echo "컬럼이 없습니다."
end if
AdCn.Close
set AdCn=Nothing
내용은 무척 간단합니다. 컬럼중에 text,
ntext, varchar, char, nvarchar, nchar 에 해당하는 것들에 대해서 "<script"
라는 구문이 포함되어 있으면 삭제작업을 하는 것으로 text, ntext 타입에 대해서만
특별히 ado를 이용해서 처리하였습니다.
있습니다.수정1. 컬럼명이 [컬럼명] 과 같은형식의 컬럼도 처리하도록 수정.
수정2. 내용이 없는 항목에 대한 구문오류 우회토록 수정.
Recent Comments