在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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
以下是正常显示代码~ 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; }
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; }
|
请发表评论