在判断用户输入的用户名和密码是否和数据库中的相同时,更需要注意的就是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>"); } } |