1.什么是SQL注入,为什么要防止SQL注入
SQL注入是通过用户提交的数据,拼装成了恶意的数据库执行语句,从而对服务器端造成安全问题的一个漏洞。举个例子,比如在登录页面,正常的情况下,比如我账号输入 zhangsan
密码输入 147258
,然后点击登录,服务器端执行的SQL语句可能是。
select ID,UserName,Account from Users where Account = 'zhangsan' and Password = '147258'
那比如我用户名输入了'or 1 =1--
SQL语句就可能变成这样了。
select ID,UserName,Account from Users where Account = '' or 1=1 -- and Password = ''
这里我们能看到 实际执行的SQL语句为。select ID,UserName,Account from Users where Account = '' or 1=1
条件为真,--
在SQL中 是注释符号。所以连密码都不需要直接就可以登录成功了。在看一个比较严重的例子。
比如我输入了。';drop table Users;--
或者我知道你的数据库名字 ';use master go drop database MyBlog;--
那么实际执行的SQL语句为。
select ID,UserName,Account from Users where Account ='';drop table Users;--and Password = ''
select ID,UserName,Account from Users where Account ='';use master go drop database MyBlog;--and Password = ''
如果写代码的时候没有注意这些,黑客很可能通过这些漏洞进行攻击,造成巨大的损失。
2.如何防治SQL注入
防止SQL注入一般有三种方法。
- 过滤原则:对用户输入的数据进行判断,用黑名单,或者白名单的方式验证,或者替换危险字符。
- 2.写数据存储过程:这个还是有一定的风险有可能会有漏网之鱼,还有就是查询太多的话,存储过程也会写的特别的多,但是写存储过程会提高查询的效率,有一定好处。
- 3.使用参数化查询语句进行查询,这也是本文重点介绍的一种方式。
请看示例。
string Account =Request.Form["Account"];
string sql = "select id,Name,Account from User where Account = @Account";
SqlParameter[] values = new SqlParameter[] { //参数化查询, 防止sql注入
new SqlParameter("@Account",Account),
};
DataTable datatable = DBHelper.GetDataTable(sql, values);
这里把用户传到后台的账号Account
赋值给 @Account
这样一来,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。另外GetDataTable是一个封装好的方法。代码如下。
public static DataTable GetDataTable(string sql, params SqlParameter[] values)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.AddRange(values);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
}
}
把需要的参数放到SqlParameter[]数组里,方便其他层的代码调用。
Study hard and make progress every day.
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg
网友评论