ASP.NET中如何防范SQL注入式攻击

[ 1124 查看 / 7 回复 ]

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。
    随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水平和经验参差不齐,相当一部分的开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行必要的合法性判断,导致了攻击者可以提交一段数据库查询代码,根据程序返回的结果,获得一些他想得到的数据。
    SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现。
    SQL注入过程
第一步:判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注入问题,如:http://news.xxx.com.cn/162414739931.shtml就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://www.google.cn/webhp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。
第二步:寻找SQL注入点。完成上一步的片断后,就要寻找可利用的注入漏洞,通过输入一些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。
第三步:猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜测过程可以通过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。
第四步:寻找WEB管理后台入口。通常WEB后台管理的界面不面向普通用户
开放,要寻找到后台的登陆路径,可以利用扫描工具快速搜索到可能的登陆地址,依次进行尝试,就可以试出管理台的入口地址。
第五步:入侵和破坏。成功登陆后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。
SQL注入攻击的特点:
    变种极多,有经验的攻击者会手动调整攻击参数,致使攻击数据的变种是不可枚举的,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。
    攻击过程简单,目前互联网上流行众多的SQL注入攻击工具,攻击者借助这些工具可很快对目标WEB系统实施攻击和破坏。
    危害大,由于WEB编程语言自身的缺陷以及具有安全编程能力的开发人员少之又少,大多数WEB业务系统均具有被SQL注入攻击的可能。而攻击者一旦攻击成功,可以对控制整个WEB业务系统,对数据做任意的修改,破坏力达到及至。
分享 转发
TOP

要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。  ⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:
  第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。
  第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。
  第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
  ⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
  ⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
  ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
  在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。
  ⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。
  ⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
TOP

什么是SQL注入?  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
  SQL注入
  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
  防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试。可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。
  第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
  我们通过上面的三步完成了对数据库的修改。
  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。
TOP

asp.net sql注入实验

1.1实验准备(1)登录界面
这是测试页面的主体部分。单击登陆按钮时,进行登录验证。进行验证的sql语句为:
cmd.CommandText = "SELECT * FROM [test].[dbo].[user] where [user]='"+username+"' and [pswd]='"+pswd+"'";
后台代码为:
public partial class _Default : System.Web.UI.Page
{
    string username;//存储用户输入的用户名
    string pswd;//存储用户输入的密码
    SqlConnection conn;// SqlConnection实例
    SqlCommand cmd;// SqlCommand实例
    protected void Page_Load(object sender, EventArgs e)
    {
        conn = new SqlConnection();
        conn.ConnectionString = SqlDataSource1.ConnectionString;
        conn.Open();//打开数据库连接
    cmd = new SqlCommand();
        cmd.Connection = conn;
     
        cmd.CommandType = CommandType.Text;
   
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        username = tusername.Text;//获取用户输入的用户名
        pswd = tpassword.Text;//获取用户输入的密码
        cmd.CommandText = "SELECT * FROM [test].[dbo].[user] where [user]='"+username+"' and [pswd]='"+pswd+"'";//查询字符串
       
      if( cmd.ExecuteScalar()!=null)
            Response.Redirect("Welcom.aspx");//如果用户名密码正确,跳转到欢迎界面
        else
            TextBox1.Text = "用户名或密码错误";//错误,显示错误信息。
    }
}
(2)欢迎界面
只显示一条语句:welcom
1.2正常测试
(1)在登录界面输入正确的用户名和密码。
结果跳转到欢迎界面
(2)输入不正确的密码
1.3 注入测试
正常情况下,这样的登录验证看起来没什么问题。我们来看一下单击登陆时的查询语句:
cmd.CommandText="SELECT * FROM [test].[dbo].[user] where [user]='xuanhun' and [pswd]='123456'"
被验证的变量都在两个单引号中间,and语句要求前后都为真结果才为真,但是我们可以想到如果是or语句的话,那么只有结果只要有一个为真的话,那么整个语句就可顺利进行。如果查询语句是这样的话:
cmd.CommandText="SELECT * FROM [test].[dbo].[user] where [user]='xuanhun' and [pswd]='123456' or ‘a’=’a’"
结果会怎么样呢? or ‘a’=’a’肯定为真,那么就意味着“where [user]='xuanhun' and [pswd]='123456' or ‘a’=’a’"为真,如果这样的话,无论我们输入设么样的用户名密码都可以通过验证。下面测试一下我们的设想。
结果是:
证明注入成功。
1.4 总结
现在总结一下构成注入漏洞的原因:因为变量的值在两个单引号中间,要想执行我们添加的语句,必须使语句在单引号之外。我们输入密码aa之后加了单引号aa’,这样[pswd]=''的第一个单引号和aa后的单引号闭合,使得后面的语句可以执行,但还有后面一个单引号,我们用后一个’a前面的单引号和它闭合。这样语句变成了where [user]='xuanhun' and [pswd]='aa' or ‘a’=’a’,执行是没问题了。问题的根源在于没有对输入做过滤,用用户输入的单引号闭合了原来的单引号。
asp.net sql注入实验(2)(转载请注明作者及出处)
作者:玄魂(QQ:717532978)
跨页传递在asp时代最简单的做法是查询字符串。这种做法在asp.net 2.0已经不是推荐的做法了,但对于简单数据传输还是一种简单的便利的做法。今天我们就通过查询字符串进一步了解sql注入的注入漏洞判断的相关知识。
一.实验准备:page1:传递参数
Page2: 接收并处理参数.
       
二.相关代码:
(1)page1传递参数的代码
protected void Button1_Click1(object sender, EventArgs e)
    {
        Response.Redirect("page2.aspx?name=”+textbox_name.Text.Tostring()+ “&password=”+ textbox_password.Text.Tostring());
}
(2) page2接收并处理
username.Text = Request.QueryString["name"].ToString();
        tpassword.Text = Request.QueryString["password"].ToString();
        username = tusername.Text;
        pswd = tpassword.Text;
        cmd.CommandText = "SELECT * FROM [test].[dbo].[user] where [user]='" + username + "' and [pswd]='" + pswd + "'";
        if (cmd.ExecuteScalar() != null)
            Response.Write("hao");
        //Response.Redirect("Welcom.aspx");
        else
            TextBox1.Text = "用户名或密码错误";
运行情况:
用查询字符串,传递的参数会在地址栏显示出来:
http://localhost:1239/WebSite/page2.aspx?name=xuanhun&password=123456
根据这个形式的地址,我们讨论一个简单的注入漏洞判断的原理。
三.
1.数字型
查询语句类似为:Select * from 表名 where 字段=23。因为数字型没有引号,直接加查询语句测试是否可以执行
①http://localhost:1239/WebSite/page2.aspx?id=23。这是正常网页。查询语句为
Select * from 表名 where 字段=23
②http://localhost:1239/WebSite/page2.aspx?id=23 and 1=1。因为and 1=1为真,所以如果返回的页面和①同,说明我们插入的语句执行了。查询语句为:Select * from 表名 where 字段=23 and 1=1.
③http://localhost:1239/WebSite/page2.aspx?id=23 and 1=2。因为and 1=2为假,查询语句为:Select * from 表名 where 字段=23 and 1=2。
这就是经典的1=1、1=2测试法的原理。可以注入的表现:
① 正常显示(这是必然的,不然就是程序有错误了) ② 正常显示,内容基本与①相同 ③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)
  不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。
2.字符型。
查询语句类似为:Select * from 表名 where 字段=’xuanhun’。
测试不过是先屏蔽单引号再用上面的方法来检测漏洞。
比如我们上面的测试页面:http://localhost:1239/WebSite/page2.aspx?name=xuanhun&password=123456
查询语句为:Select * from [user] where [name]=’xuanhun’and [pswd]=’123456’。
字符型可以直接在单引号看程序的错误信息,如http://localhost:1239/WebSite/page2.aspx?name=xuanhun&password=123456’返回错误信息:
“/WebSite”应用程序中的服务器错误。
--------------------------------------------------------------------------------
字符串 '123456'' 后的引号不完整。 '123456'' 附近有语法错误。
再屏蔽单引号看结果:http://localhost:1239/WebSite/page2.aspx?name=xuanhun&password=123456’and ‘a’=’a’- -
页面正常。
http://localhost:1239/WebSite/page2.aspx?name=xuanhun&password=123456’and ‘a’=’b’- -
页面错误。
3.搜索型。
查询语句类似为:Select * from 表名 where 字段like ’%关键字%’
要屏蔽单引号和百分号再用上面的方法测试,注入也是一样。
例如:select * from [user] where [username] like ‘%a%’ and 1=1--
原理跟上面讲的相同,就不详细介绍了。
TOP

asp.net sql防止sql注入收藏
view plaincopy to clipboardprint?

  • 字符串处理

字符串处理view plaincopy to clipboardprint?


view plaincopy to clipboardprint?

  • <PRE class=csharp name="code">  #region 过滤危险字符

  • public
    string safety(string sql)
  •     {
  •         sql = sql.Trim();
  •         sql = sql.Replace("<", "");
  •         sql = sql.Replace(">", "");
  •         sql = sql.Replace(" ", "");
  •         sql = sql.Replace("*", "");
  •         sql = sql.Replace("'", "");
  •         sql = sql.Replace("%", "");

  • //.........

  • return sql;
  •     }
  •     #endregion</PRE>
  • <PRE class=csharp name="code"> </PRE>
  • <PRE class=csharp name="code"> </PRE>
  • <PRE class=csharp name="code"><PRE class=csharp name="code">public
    static
    string DelSQLStr(string str)
  • {

  • if(str == null || str == "")

  • return
    "";
  •     str = str.Replace(";","");
  •     str = str.Replace("'","");
  •     str= str.Replace("&","");
  •     str= str.Replace("%20","");
  •     str= str.Replace("--","");
  •     str= str.Replace("==","");
  •     str= str.Replace("<","");
  •     str= str.Replace(">","");
  •     str= str.Replace("%","");

  • return str;
  • }</PRE>
  • </PRE>
  • <PRE class=csharp name="code"> </PRE>
  • <PRE class=csharp name="code"> </PRE>
  • <PRE class=csharp name="code"><PRE class=csharp name="code">using System;


  • namespace Theme.Services.Public
  • {

  • /// <SUMMARY></SUMMARY>

  • /// SqlstrAny 的摘要说明。

  • /// 

  • public
    class ProcessRequest
  • {

  • public ProcessRequest()
  •   {

  • //

  • // TODO: 在此处添加构造函数逻辑

  • //
  •   }

  •   #region SQL注入式攻击代码分析

  • /// <SUMMARY></SUMMARY>

  • /// 处理用户提交的请求

  • /// 

  • public
    void StartProcessRequest()
  •   {

  • try
  •   {

  • string getkeys = "";

  • string sqlErrorPage = System.Configuration.ConfigurationSettings.AppSettings["CustomErrorPage"].ToString();

  • if (System.Web.HttpContext.Current.Request.QueryString != null)
  •     {


  • for(int i=0;i

  • /// 分析用户请求是否正常

  • /// 

  • /// <PARAM name="Str" />传入用户提交数据

  • /// <RETURNS></RETURNS>返回是否含有SQL注入式攻击代码

  • private
    bool ProcessSqlStr(string Str)
  •   {

  • bool ReturnValue = true;

  • try
  •   {

  • if (Str != "")
  •     {

  • string SqlStr = "and |exec |insert |select |delete |update |count | * |chr |mid |master |truncate |char |declare ";

  • string[] anySqlStr = SqlStr.Split('|');

  • foreach (string ss in anySqlStr)
  •     {

  • if (Str.IndexOf(ss)>=0)
  •       {
  •       ReturnValue = false;
  •       }
  •     }
  •     }
  •   }

  • catch
  •   {
  •     ReturnValue = false;
  •   }

  • return ReturnValue;
  •   }
  •   #endregion

  • }
  • }


  • // System.Configuration.ConfigurationSettings.AppSettings["CustomErrorPage"].ToString(); 这个为用户自定义错误页面提示地址,

  • //在Web.Config文件时里面添加一个 CustomErrorPage 即可

  • //<!-- 防止SQL数据库注入攻击的出错页面自定义地址 -->

  • //    <ADD key="CustomErrorPage" value="../Error.HTML"></ADD>



  • </PRE>
  • </PRE>
  • <PRE class=csharp name="code"> </PRE>
  • <PRE class=csharp name="code"> </PRE>
TOP

ASP.NET 中如何防范SQL注入式攻击

ASP.NET 中如何防范SQL注入式攻击一、什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。 ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子: System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")。Append(txtLogin.Text)。Append("' AND password='")。Append(txtPassword.Text)。Append("'"); ⑶ 攻击者在用户名字和密码输入框中输入"'或'1'='1"之类的内容。 ⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'. ⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。 ⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。 如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。 系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。 二、如何防范? 好在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。 ⑴ 对于动态构造SQL查询的场合,可以使用下面的技术: 第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。 第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' —— AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。 第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。 ⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。 ⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。 ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。 在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。 ⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入 的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。 ⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理
TOP

SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入或页面请示的查询字符串,欺骗服务器执行恶意的SQL命令。
在某些表单中,用户输入的内容可能直接用来构成SQL命令,如果不加防范的话,很容易受到SQL注入式攻击。
下面是一个常见的SQL注入式攻击过程示例:
1、ASP.NET登录页面,有两个文本输入框TXT_USERID、TXT_PASSWORD用来输入用户名和密码,一个登录按扭进行验
证登录。
2、单击“登录”按扭后根据文本框构造动态SQL命令,并根据是否返回记录为登录成功的标志。代码如下:
SqlConnection con=new SqlConnection(@ConfigurationSettings.AppSettings["server"]);
jmpassword Password=new jmpassword();
string password=Password.EncryptPassword(txtpassword.Text.ToString(),"SHA1")
+Password.EncryptPassword(txtpassword.Text.ToString(),"MD5");
SqlCommand comm=new SqlCommand("select count(*) from verify where id='"+txtuserid.Text+"' and password='"+password+"'",con);
con.Open();
int jl=(Int32)comm.ExecuteScalar();
con.Close();
if(jl>0)
{
  代码段
}
else
{
  代码段
}
3、攻击者在用户名输入框中输入”LH‘ or ‘1’=‘1“,密码框为空,单击登录
4、经过SQL注入攻击后生成的SQL命令变成了如下代码:
    select count(*) from verify where id=‘LH‘ or ‘1’=1 and password=‘’
  这样,SQL语句的逻辑含义改变了,服务器执行后已经不能真正验证用户身份,系统就错误地授权给攻击者
  还可以出现危害更大的代码,如文本框输入”LH‘;DROP TABLE VERIFY;--“,SQL语句将生成为:
  select count(*) from verify where id=‘LH‘; DROP TABLE VERIFY;-- and password=‘’

SQL注入攻击防范措施
1、将SQL中使用的一些特殊符号,如“‘”,“—”,“/*”,“%”等,用Replace()方法过滤掉,缺少了这些符号,攻击代码也就变得没有意义
2、限制文本框输入字符的长度
3、检查用户输入的合法性,确信输入的内容只包含合法的数据
4、充分利用正则表达式来检验数据的合法性。数据检查应当在客户端和服务器端都执行,之所以要执行服务器端难,是为了弥补客户
端验证机制脆弱的安全性
5、使用带参数的SQL语句形式
    参数提供了一种有效的方法来组织随SQL语句传递的值,以及向存储过程传递的值。
    通过确保从外部接收的值仅作为值传递,而不是作为SQL语句的一部分传递,可以防止参数受到SQL注入式攻击
6、保持异常信息的私有性。
    攻击者经常利用服务器产生异常时出现的信息,例如故意输入一些可能使程序产生异常的信息。因为异常信息中可能包含关于应用程
    序或数据源的特定信息,所以请不要将系统异常的内容返回用户。如果必须向用户发送信息,则返回包含很少信息的自定义信息。
    例如:“连接失败。请与系统管理员联系。”,并记录特定信息以便于管理员使用。
总结:SQL注入式攻击的漏洞比较常见,造成的问题也比较严重,但只要有针对性地使用上面的方法,对输入信息进行控制,可以防止
          这些攻击。
例:
在页面上利用验证控件RegularExpressionValidator对用户名和密码输入框进行验证
1、设置RegularExpressionValidator控件的ValidationExpression属性值为正则表达
      式:^\w+$,表示验证格式为//由数字、26个英文字母或者下划线组成的字符串
2、将RegularExpressionValidator控件的ControlToValidate属性与要验证的文本框
      控件进行绑定
3、将RegularExpressionValidator控件的ErrorMessage属性设置验证出错时的错误
      提示信息
TOP

......

TOP