在判断用户输入的用户名和密码是否和数据库中的相同时,更需要注意的就是SQL注入式攻击,

SQL注入式攻击是指利用设计上的漏洞,在目标服务器上运行SQL命令以及进行其他方式的攻击。

下面是一个简单的例子:

在登录的时候,我在用户名一栏输入℉бrrest,那么所执行的SQL语句就是:

SELECT COUNT(*) FROM db_student WHERE StuUserName='℉бrrest';

通过上面的语句可以在数据库中查询中一条StuUserName字段名为℉бrrest的用户信息,

但是如果我在文本框中输入℉бrrest or ’1′=’1′,

这样我们再来执行SQL语句:

SELECT COUNT(*) FROM db_student WHERE StuUserName='℉бrrest' OR '1'='1';

这样一条SQL语句就能够查找出db_student表中的所有记录,这就是传说中的SQL注入。

接下来介绍两种防止SQL注入式攻击的方法:

方法一、使用SqlCommand.Parameters属性传参过滤非法字符。一个简单登录页面事例代码:

            SqlConnection Con = new SqlConnection(ConfigurationManager.AppSettings["conStr"]);//连接字符串
            Con.Open();//打开数据库
            string strlogin = "select count(*) from tb_student where StuUsername=@name and StuPassword=@pwd";
            SqlCommand com = new SqlCommand(strlogin, Con);//创建SqlCommand对象
 
            com.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50));//设置参数名,类型,长度
            com.Parameters["@name"].Value = TextBox1.Text;//设置参数值
            com.Parameters.Add(new SqlParameter("@pwd", SqlDbType.NVarChar, 50));
            com.Parameters["@pwd"].Value = TextBox2.Text;
 
            if (Convert.ToInt32(com.ExecuteScalar()) > 0)
            {
                Response.Write("<script>alert('登录成功!')</script>");
                Response.Redirect("stu_award.aspx");
            }
            else
            {
                Response.Write("<script>alert('用户名或密码错误,请重新输入!')</script>");
                TextBox1.Text = "";
                TextBox2.Text = "";
                TextBox3.Text = "";
            }

方法二、使用LING防止SQL注入式攻击

LING to SQL在用户数据存取时,清除了SQL注入式攻击的存在,LING在每次执行查询时都加上了具体的参数,

例如我依然是在文本框中输入℉бrrest or ’1′=’1′,则LING会产生以下语句:

SELECT [t0].[StuUserName],[t0].[StuPassword],
 
FROM [dbo].[tb_student] AS [t0]
 
WHERE [t0].[StuUserName]=@p0

可以看出,WHERE子句被自动加上了参数,跟第一种方法原理类似,下面是一段事例代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        string name = TextBox1.Text;//获取登录名
        string pass = TextBox2.Text;//获取密码
        LinqDataDataContext ldc=new LinqDataDataContext();//创建LINQ对象
        //创建LINQ查询语句,查询到满足指定登录名和密码的用户
        var result = from v in ldc.userManage
                     where v.StuUsername == name && v.StuPassword == pass
                     select v;
        if (result.Count() > 0)//查询到指定用户
        {
            RegisterStartupScript("", "<script>alert('登录成功!')</script>");
        }
        else   //未查询到指定用户
        {
            RegisterStartupScript("", "<script>alert('登录失败!')</script>");
        }
    }
 
 
 
 posted on 2013-06-26 09:40  纳米程序员  阅读(361)  评论(0编辑  收藏  举报