使用参数化查询防止SQL注入漏洞

转载 2016年08月30日 18:34:02
摘要:在Web应用开发过程中,SQL注入漏洞是大家都非常关心的问题。本文介绍了应用参数化查询来解决SQL注入问题。

  SQL注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。

  SQL注入的原理

  以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:

?
1
string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" + password + "'";

  其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下,这自然没有问题,但是用户输入是不可信的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。

  假设password的值是"1' or '1' = '1",userName的值随便取,比如是"abc",那变量sql的值就是:

?
1
"SELECT TOP 1 * FROM [User] WHERE UserName = 'abc' AND Password = '1' or '1' = '1'"

  由于'1' = '1'恒为真,因此只要User表中有数据,不管UserName、Password的值是否匹配,这条SQL命令准能查出记录来。就这样,登录系统就被破解了。

  以往的防御方式

  以前对付这种漏洞的方式主要有三种:

  • 字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
  • 字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
  • 存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。可在这看:http://jingyan.baidu.com/article/642c9d34ee73d6644b46f766.html

  参数化查询

  近年来,自从参数化查询出现后,SQL注入漏洞已成明日黄花。

  参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。

  在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。

  在ASP程序中使用参数化查询

  ASP环境下的参数化查询主要由Connection对象Command对象完成。

  Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也仅能使用匿名参数。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var conn = Server.CreateObject("ADODB.Connection");
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");
conn.Open();
 
var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = conn;
cmd.CommandType = 1;
cmd.CommandText = "SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?";
cmd.Parameters.Append(cmd.CreateParameter("@UserName", 200, 1, 20, "user01"));
cmd.Parameters.Append(cmd.CreateParameter("@Password", 200, 1, 16, "123456"));
 
var rs = cmd.Execute();
Response.Write(rs("UserId").value);
 
rs.Close();
conn.Close();

  在ASP.NET程序中使用参数化查询

  ASP.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SqlConnection conn = new SqlConnection("server=(local)\\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb");
conn.Open();
 
SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password");
cmd.Connection = conn;
cmd.Parameters.AddWithValue("UserName", "user01");
cmd.Parameters.AddWithValue("Password", "123456");
 
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
 
reader.Close();
conn.Close();

  MySQL的参数格式与SQL Server有点区别,是以“?”加上参数名

?
1
2
3
4
5
6
7
8
9
10
11
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;");
conn.Open();
MySqlCommand cmd = new MySqlCommand(“SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1″);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456″);
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();

Yii2数据安全查询,防止sql注入漏洞

1 $id = Yii::$app->request->get('id','');//get获取参数 1.1 直接把获取的$id代入(有问题) 1 2 3 4...
  • xmlife
  • xmlife
  • 2016年12月18日 23:47
  • 2876

yii2模糊查询并且防SQL注入

yii2模糊查询并且防SQL注入
  • qq_36373262
  • qq_36373262
  • 2016年12月15日 09:44
  • 820

Yii2数据安全查询,防止sql注入漏洞

1 $id = Yii::$app->request->get('id','');//get获取参数 1.1 直接把获取的$id代入(有问题) 1 2 3 4...
  • xmlife
  • xmlife
  • 2016年12月18日 23:47
  • 2876

yii2模糊查询并且防SQL注入

博主前天在修改之前的网站代码时,因为之前写代码完全没有考虑过网站安全,所以对最基本的防SQL注入没有任何预防,所以需要对网站代码很多地方都要进行修改。而yii2框架对防SQL注入提供了接口,所以修改起...
  • panjican
  • panjican
  • 2016年07月25日 12:45
  • 3680

sql参数绑定防止注入

假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. [php] view ...
  • resilient
  • resilient
  • 2016年09月20日 10:24
  • 1833

防SQL注入的参数化查询

在做机房收费系统的时候,曾经利用过传递参数的形式来将值传递给SQL语句或者存储过程,因为这样可以通过参数化的查询来帮助抵御“SQL 注入”式攻击,这种攻击者会将命令插入SQL语句,从而危机服务器的安全...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2014年09月20日 14:12
  • 2226

yii2 随笔(七)依赖注入——(3)yii2的依赖注入

原文地址:http://ivhong.com/?p=124(ivhong.com 是我的博客主址) yii2的依赖注入的核心代码在 yii\di,在这个包(文件夹)下面有3个文件,分别是Cont...
  • wang350
  • wang350
  • 2016年03月28日 17:20
  • 883

参数化查询为什么能够防止SQL注入

转自:http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html  很多人都知道SQL注入,也知道SQL参数化查询可以防止SQL...
  • fengxing11
  • fengxing11
  • 2016年09月09日 13:58
  • 643

参数化命令(防止SQL注入)

1. 参数化命令相关知识点:(防止SQL注入) DAL类: public DataTable StudentDAL(string name,string gender) ...
  • weixin_36024609
  • weixin_36024609
  • 2017年03月19日 14:24
  • 426

YII2框架学习 安全篇(一) XSS攻击和防范(上)

在如今的web开发中,网络安全,信息安全应该是最重要的一环。常见的攻击主要有四类,XSS攻击、CSRF攻击、SQL注入和文件上传漏洞。在接下来的安全篇里,我会依次说明YII框架是如何应对这些攻击的。本...
  • m0_37645820
  • m0_37645820
  • 2017年06月15日 21:02
  • 772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用参数化查询防止SQL注入漏洞
举报原因:
原因补充:

(最多只允许输入30个字)