asp,jsp,asp.net防注入代码

NET防SQL注入方法

2007年04月04日 11:16

 

 

 

那么,如果我的用户名是:1 or 1=1

那么,你的查询语句将会变成:

 

select * from admin where username=1 or 1=1 and password="&pwd&""

 

这样你的查询语句就通过了,从而就可以进入你的管理界面。

 


所以防范的时候需要对用户的输入进行检查。特别式一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤。

 

需要过滤的特殊字符及字符串有:

 

net  user
xp_cmdshell
/ add
exec  master.dbo.xp_cmdshell
net localgroup administrators
select
count
Asc
char
mid






:
"
insert
delete   from
drop   table
update
truncate
from
%


下面关于解决注入式攻击的防范代码,供大家学习参考!

 


js版的防范SQL注入式攻击代码:

< script language = " javascript " >
<!--
var  url  =  location.search;
var  re = / ^?(.*)(select%20|insert%20|delete%20from%20|count(|drop%20table|update%20truncate%20|asc(|mid(|char(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|"|:|net%20user||%20or%20)(.*)$ / gi;
var  e  =  re.test(url);
if (e) {
    alert(
" 地址中含有非法字符~ " );
    location.href
= " error.asp " ;
}
// -->
< script >

 

 

asp版的防范SQL注入式攻击代码~:

< %
On   Error   Resume   Next
Dim  strTemp




If   LCase (Request.ServerVariables( " HTTPS " ))  =   " off "   Then
strTemp 
=   " http:// "
Else
strTemp 
=   " https:// "
End   If




strTemp 
=  strTemp  &  Request.ServerVariables( " SERVER_NAME " )
If  Request.ServerVariables( " SERVER_PORT " <>   80   Then  strTemp  =  strTemp  &   " : "   &  Request.ServerVariables( " SERVER_PORT " )




strTemp 
=  strTemp  &  Request.ServerVariables( " URL " )
If   Trim (Request.QueryString)  <>   ""   Then  strTemp  =  strTemp  &   " ? "   &   Trim (Request.QueryString)




strTemp 
=   LCase (strTemp)
If   Instr (strTemp, " select%20 " or   Instr (strTemp, " insert%20 " or   Instr (strTemp, " delete%20from " or   Instr (strTemp, " count( " or   Instr (strTemp, " drop%20table " or   Instr (strTemp, " update%20 " or   Instr (strTemp, " truncate%20 " or   Instr (strTemp, " asc( " or   Instr (strTemp, " mid( " or   Instr (strTemp, " char( " or   Instr (strTemp, " xp_cmdshell " or   Instr (strTemp, " exec%20master " or   Instr (strTemp, " net%20localgroup%20administrators " or   Instr (strTemp, " : " or   Instr (strTemp, " net%20user " or   Instr (strTemp, "" or   Instr (strTemp, " %20or%20 " then
Response.Write 
" <script language=javascript> "
Response.Write 
" alert(非法地址!!); "
Response.Write 
" location.href=error.asp; "
Response.Write 
" <script> "
End   If
%
>


 

C# 检查字符串,防SQL注入攻击
这个例子里暂定为=号和号

bool  CheckParams( params   object [] args)
{
     
string [] Lawlesses = { " = " , "" };
     
if (Lawlesses == null || Lawlesses.Length <= 0 ) return   true ;
     
// 构造正则表达式,例:Lawlesses是=号和号,则正则表达式为 .*[=}].* (正则表达式相关内容请见MSDN)
     
// 另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;







     
string  str_Regex = " .*[ " ;
     
for ( int  i = 0 ;i <  Lawlesses.Length - 1 ;i ++ )
         str_Regex
+= Lawlesses[i] + " | " ;
     str_Regex
+= Lawlesses[Lawlesses.Length - 1 ] + " ].* " ;
     
//
      foreach ( object  arg  in  args)
     {
         
if (arg  is   string ) // 如果是字符串,直接检查
         {
             
if (Regex.Matches(arg.ToString(),str_Regex).Count > 0 )
             
return   false ;
         }
         
else   if (arg  is  ICollection) // 如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
         {
             
foreach ( object  obj  in  (ICollection)arg)
             {
                 
if (obj  is   string )
                 {
                     
if (Regex.Matches(obj.ToString(),str_Regex).Count > 0 )
                     
return   false ;
                 }
             }
         }
     }
     
return   true ;

}


 

 

以下是较为简单的防范方法,这些都是大家比较熟悉的方法,我就是转帖过来。希望能给你一点帮助~

 


主要是针对数字型的变量传递:

 

id  =  Request.QueryString( " id " )

If   Not ( isNumeric (id))  Then

    Response.Write 
" 非法地址~ "

    Response.End

End   If


 

以下是正常显示代码~

如何再编码的过程中防范SQL注入式攻击


1、什么是SQL注入式攻击我 们知道Microsoft的SQL Server数据库是支持一次数据库查询执行多条SQL语句的,比如说再查询管理器里面,我们可以输入一条SQL语句

select   *   from  table1  select   *   from  table2

假如所选择的数据库中确实存在table1和table2的话,那么这个SQL语句就能够执行成功,并且能够返回正确的结果。同时,我们知道现在很多系统或者发布在Internet上的网站,管理员为了方便,一般都是直接采用sa的身份来连接数据库的,那么SQL注入式攻击主要就是抓住了系统在这么两个方面的弱点,攻击者把SQL语句插入到web表单输入,或者页面的查询字符串中,从而欺骗服务器执行恶意的SQL命令,以达到攻击的目的。

2.   注入式攻击的详细解释SQL下面我们将以一个简单的用户登陆为例,结合代码详细解释一下SQL注入式攻击,与及他的防范措施。对于一个简单的用户登陆可能的代码如下:

try
{
 
string  strUserName  =   this .txtUserName.Text;
 
string  strPwd  =   this .txtPwd.Text;
 
string  strSql  =   " select * from userinfo where UserName= ""  + strUserName +  ""  and Password= ""  + strPwd +  """ ;
 SqlConnection objDbConn 
=   new  SqlConnection( " 数据库连接字符串 " );
 SqlDataAdapter objAdapter 
=   new  SqlDataAdapter(strSql,objDbConn);
 DataSet objDataSet 
=   null ;
 objAdapter.Fill(objDataSet);
// TODO 对获取的数据进行判断。
}
catch  (System.Exception e)
{
 
this .lblMsg.Text  =  e.Message;
 
this .lblMsg.Visible  =   true ;
}


  在上面这段代码中,如果用户的输入是正常的用户名和密码的话,那么执行都会比较正常,但是,假如输入用户名的时候,输入的是“johny’--”的话,在 SQLServer里面执行的语句将会是“select * from userinfo where UserName=’johny’--‘ and Password=’密码’”,只要数据库中存在johny这个用户的话,那么不管密码是什么,语句都能够执行成功,并且能够顺利通过登陆。还 有更加厉害的,我们知道SQLServer里面有一些系统的存储过程,能够执行操作系统的很多命令,比如xp_cmdshell,假如上面用户登陆的时 候,用户名部分输入的是“johny’ exec xp_cmdshell ‘format d:/s’--”,大家想想一下后果是什么?有恶意的用户,只要把’format d:/s’这个命令稍加改造就能够做很多不合法的事情啦。


3. 如何防范SQL注入式攻击既然我们解释了为什么会产生SQL的注入式攻击,那么我们接下来说说如何来防范这种情况的发生,解决的办法有很多,我们逐个介绍一下。


a) 在进行系统部署的时候,不要采用sa来连接数据库,在数据库中新建一个帐号,对这个帐号的权限进行限制,只允许在指定的数据库里面执行一下添加,修改的权限,这样我们就可以很好地防止通过执行xp_cmdshell来攻击服务器了。


b) 采用用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。在这里大家可能会说,我只是要执行一个简单的查询,难道也要写成一个存储过程吗,这样是不是太麻烦了,其实没有关系,我们只要采用ado.net里面的SqlParameter把上面的代码稍加改造,如下

try
{
 
string  strUserName  =   this .txtUserName.Text;
 
string  strPwd  =   this .txtPwd.Text;
 
string  strSql  =   " select * from userinfo where UserName=@UserName and Password=@Password " ;
 SqlConnection objDbConn 
=   new  SqlConnection( " 数据库连接字符串 " );
 SqlDataAdapter objAdapter 
=   new  SqlDataAdapter(strSql,objDbConn);
 objAdapter.SelectCommand.Parameters.Add(
" @UserName " ,strUserName);
 objAdapter.SelectCommand.Parameters.Add(
" @Password " ,strPwd);
 DataSet objDataSet 
=   null ;
 objAdapter.Fill(objDataSet); 
// TODO 对获取的数据进行判断。
}
catch  (System.Exception e)
{
 
this .lblMsg.Text  =  e.Message;
 
this .lblMsg.Visible  =   true ;


  上面的这段代码,我们就可以比较好地防范SQL 注入式攻击了,原因是SQLServer里面存在一个sp_executesql的系统存储过程,ado里面只要sql语句中用到了 SqlParameter的方式的话,那么sql语句将会通过sp_executesql来执行,具体的情况大家可以用SQL Server里面的Profile来进行跟踪一下,就非常清楚了。通过这种方法,我们就即可以不用写存储过程,有能够很好地防范SQL注入式攻击了对用户的输入进行校验,将用户输入里面存在的单引号进行转义(一个单引号替换成两个单引号),并且过滤里面存在的注释符,与及特殊命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值