原来有个帖子说被挂马,http://topic.csdn.net/u/20081013/12/6c257f73-c8ba-43cc-8f94-02236db90cfb.html
用replace解决的,现在其中一个ntext类型的字段也被挂马了,直接用replace说是参数1的数据类型ntext无效,怎么替换呢?

解决方案 »

  1.   

    http://blog.chinaunix.net/u/484/showart_1071250.html
      

  2.   

    --更新text字段的值
    create table PE_Soft(SoftIntro text,ChannelID integer) 
    insert into PE_Soft 
    select  'aaa ',1004 
    union all 
    select  'bbb ',1003 
    union all 
    select  'ccc ',1002 declare @ptr binary(16) 
    select @ptr=textptr(SoftIntro) from PE_Soft where ChannelID=1002 
    updatetext PE_Soft.SoftIntro @ptr null 0  'testing ' 
    select * from PE_Soft drop table PE_Soft
      

  3.   

    --text字段的替换处理--创建数据测试环境
    create table test(id varchar(3),txt text)
    insert into test
    select '001','A*B'
    go--定义替换的字符串
    declare @s_str varchar(8000),@d_str varchar(8000)
    select @s_str='*'         --要替换的字符串
            ,@d_str='+'                --替换成的字符串--字符串替换处理
    declare @p varbinary(16),@postion int,@rplen int
    select @p=textptr(txt)
            ,@rplen=len(@s_str)
            ,@postion=charindex(@s_str,txt)-1
    from test where id='001'while @postion>0
    begin
            updatetext test.txt @p @postion @rplen @d_str
            select @postion=charindex(@s_str,txt)-1 from test
    end--显示结果
    select * from testgo
    --删除数据测试环境
    drop table test
      

  4.   

    --测试数据
    CREATE TABLE tb(col ntext)
    INSERT tb VALUES(REPLICATE( '0001,0002,0003,0004,0005,0006,0007,0008,0009,0100,'
    +'220000001,302000004,500200006,700002008,900002120,',800))
    DECLARE @p binary(16)
    SELECT @p=TEXTPTR(col) FROM tb
    UPDATETEXT tb.col @p NULL 0 tb.col @p
    GO--替换处理定义
    DECLARE @s_str nvarchar(1000),@r_str nvarchar(1000)
    SELECT @s_str='00'  --要替换的字符串
    ,@r_str='0000'  --替换成该字符串DECLARE @p varbinary(16)
    DECLARE @start int,@s nvarchar(4000),@len int
    DECLARE @s_len int,@step int,@last_repl int,@pos int--替换处理参数设置
    SELECT 
    --用于要判断每次截取数据,最后一个被替换数据位置的处理
    @s_len=LEN(@s_str), --设置每次应该截取的数据的长度,防止REPLACE后数据溢出
    @step=CASE WHEN LEN(@r_str)>LEN(@s_str)
    THEN 4000/LEN(@r_str)*LEN(@s_str)
    ELSE 4000 END--替换处理的开始位置
    SELECT @start=PATINDEX('%'+@s_str+'%',col),
    @p=TEXTPTR(col),
    @s=SUBSTRING(col,@start,@step),
    @len=LEN(@s),
    @last_repl=0
    FROM tb
    WHERE PATINDEX('%'+@s_str+'%',col)>0
    AND TEXTVALID('tb.col',TEXTPTR(col))=1
    WHILE @len>=@s_len
    BEGIN
    --得到最后一个被替换数据的位置
    WHILE CHARINDEX(@s_str,@s,@last_repl)>0
    SET @last_repl=@s_len
    +CHARINDEX(@s_str,@s,@last_repl) --如果需要,更新数据,同时判断下一个取数位置的偏移量
    IF @last_repl=0
    SET @last_repl=@s_len
    ELSE
    BEGIN
    SELECT @last_repl=CASE
    WHEN @len<@last_repl THEN 1
    WHEN @len-@last_repl>=@s_len THEN @s_len 
    ELSE @len-@last_repl+2 END,
    @s=REPLACE(@s,@s_str,@r_str),
    @pos=@start-1
    UPDATETEXT TB.col @p @pos @len @s
    END
    --获取下一个要处理的数据
    SELECT @start=@start+LEN(@s)-@last_repl+1,
    @s=SUBSTRING(col,@start,@step),
    @len=LEN(@s),
    @last_repl=0
    FROM tb
    END
    GO--显示处理结果
    SELECT datalength(col),* FROM tb
    DROP TABLE tb
      

  5.   

    两个支持text字段内文字替换的存储过程
    csdn realgz
    (http://topic.csdn.net/u/20080505/20/d2dffbbe-6d6b-41cf-b29a-41149540eafa.html?seed=562172452)if object_id('sp_replaceTextWithMultiColPk') is not null 
    drop  proc sp_replaceTextWithMultiColPk 
    go create procedure sp_replaceTextWithMultiColPk 
    @tableName sysname,@colName sysname,@oldStr nvarchar(512),@newStr nvarchar(512),@whereStr nvarchar(200)='' 
    /* 
    为一个表内的text做统一替换的存储过程 
    缺点:慢,而且事实上还没办法支持任意表,而且代码看起来难受 
    因为 varchar的长度有限,当然还可以扩展,不过在sql 2005 里已经没这个问题了,懒得再写。   
    realgz 2008-05-05 */ 
    as 
    begin 
    set nocount on 
    declare @cursor nvarchar(4000),@fetch nvarchar(4000),@insert nvarchar(4000),@where nvarchar(4000) 
    declare @replaceExec nvarchar(4000),@checkExec nvarchar(4000) 
    declare @rpPtr varbinary(16),@rpPostion int,@rpLen int 
    if object_id('tempdb..#key') is not null 
    drop table #key --获得主键列表 
    select   sc.name keyName  into #key  from  
    sysobjects so  
    join  sysindexes idx on so.parent_obj=idx.id  
    join sysindexkeys idk on so.parent_obj=idk.id and idx.indid = idk.indid  
    join syscolumns sc on so.parent_obj=sc.id and idk.colid=sc.colid  
    where so.xtype='PK' and so.parent_obj =object_id(@tableName) and idx.status & 0x800>0 
      
      if @@rowcount  < 1 
    begin 
    raiserror ('表不符合要求或者没有这个表',12,1) 
    return 
    end 
    --增加键值列 
    alter table #key add keyValue sql_variant 
    alter table #key add primary key(keyName) --替换的长度 
    select @rpLen=len(@oldStr),@oldStr='%'+@oldStr+'%' --游标声明语句 
    select @cursor ='declare #c cursor static  for   select textptr('+@colname+'),PATINDEX ('''+replace(@oldStr,'''','''''')+''','+@colname+')-1' 
    select @cursor = @cursor +',['+keyName+']'  from #key   select @cursor = @cursor +' from ' +@tablename+' '+@whereStr   --为游标的提取生成语句 
    select @fetch='',@insert='',@where='' 
    select @fetch = @fetch +'declare @'+keyName +' sql_variant '+char(13) from #key 
    select @fetch = @fetch +'fetch next  from #c into @rpPtr,@rpPostion' 
    select @fetch = @fetch +',@'+keyName +char(13)  from #key  --把游标提取出来的值放到临时表的语句 
    select @insert = @insert +' insert into #key(keyName,keyValue ) ' 
    select @insert = @insert + ' select '''+replace(keyName,'''','''''')+''',@'+keyName+' union all'  +char(13)  from #key  
    select @insert = left(@insert,len(@insert)-10)   
    select @fetch=@fetch +@insert   
    --每次获得游标行对应text指针的语句 
    select @where =' where 1=1' 
    select @where =@where +' and ['+keyName+']= (select keyValue from #key where keyName = '''+replace(keyName,'''','''''')+''')' from #key 
      
    --改写的sql 
    select @replaceExec =  'updatetext '+@tablename+'.'+@colname+' @rpPtr @rpPostion  @rpLen @NewStr' --检查是否存在目标的sql 
    select @checkExec =' select @rpPostion = PATINDEX ('''+replace(@oldStr,'''','''''')+''','+@colname+')-1 from ' +@tablename+@where   --声明游标 
    exec sp_executesql @cursor  
    truncate table #key  
    open #c  --提取第一行 
    exec sp_executesql @fetch,N'@rpPtr varbinary(16) output,@rpPostion int  output',@rpPtr output,@rpPostion  output 
    --print @fetch 
      
    while @@fetch_status=0 
    begin 
      
    --只要@rpPostion>0 证明还需要替换  
      while @rpPostion>0 
      begin 
    --替换  
      
    exec sp_executesql @replaceExec,N' @rpPtr varbinary(16),@rpPostion int,@rpLen int,@newStr nvarchar(512)',@rpPtr,@rpPostion,@rpLen,@NewStr --重新判断是否需要替换 
    exec sp_executesql @checkExec,N'@rpPostion int output',@rpPostion output 
      end 
    truncate table #key  --提取下一行 
    exec sp_executesql @fetch,N'@rpPtr varbinary(16) output,@rpPostion int output',@rpPtr output,@rpPostion  output 
    end 
    close #c 
    deallocate #c 
    if object_id('tempdb..#key') is not null 
    drop table #key 
    set nocount off  
    end go
      

  6.   

    --如果小於8000 可以轉換成VARCHAR(8000) 2005 VARCHAR(MAX)來處理
    IF OBJECT_ID('TEMPDB..#')IS NOT NULL DROP TABLE #
    GO
    CREATE TABLE #([NAME] TEXT)
    INSERT # SELECT '張三'
    INSERT # SELECT '李四'
    SELECT REPLACE(CAST([NAME] AS VARCHAR(8000)),'張','王') FROM #
    /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    王三
    李四(影響 2 個資料列)*/
      

  7.   

    这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:[email protected], 7X24 为您的网站和服务器保驾护航。