云顶国际,云顶国际登录官网

    欢迎访问云顶国际登录官网~

  1. 加入收藏
  2. 设为主页
  3. 学校简介
北大青鸟

三分钟了解北大青鸟

×
  • 北大青鸟大数据课程
  • 北大青鸟网络工程师
  • 北大青鸟web设计专业
  • 北大青鸟PHP专业
  • 北大青鸟启蒙星课程

参数化查询解决SQL注入漏洞问题

责任编辑:云顶国际登录官网来源:云顶国际登录官网数据库技术教程发布时间:2012-10-15 08:56
导读:使用参数化查询防止SQL注入漏洞。
SQL注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。
  SQL注入的原理

  以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:
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的值就是:
"SELECT
TOP 1 * FROM [User] WHERE UserName = 'abc' AND Password = '1' or '1' = '1'"

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

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

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

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

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

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

  Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也能使用匿名参数。
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,就可以用有名字的参数了,格式是“@”字符加上参数名。
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有点区别,是以“?”加上参数名。
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();

本文标题:参数化查询解决SQL注入漏洞问题,责任编辑:云顶国际登录官网,来源:武汉宏鹏,于2012年10月15日08时56分发布于云顶国际登录官网。云顶国际宏鹏鲁广校区,是北大青鸟武汉电脑学校,专业IT计算机培训,拥有软件/网络/安卓/Web前端/Java课程.北大青鸟地址:光谷广场鲁巷数码港.电话:027-87807717

专业老师指导

专业老师指导

赵老师

从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业。

培训咨询客服

培训咨询客服

陈老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑。

本文地址:
文章标题:
  • 北大青鸟Java软件开发
  • 北大青鸟UI设计课程_零基础可学
  • 北大青鸟动漫设计_武汉设计学校
  • 北大青鸟数字艺术_武汉电脑学校
在线咨询
×
在线咨询更多问题

如您有任何疑问
在线咨询随时为您解答或拨打咨询热线:17740513250

×
  • 姓 名*
  • 手 机*
  • QQ号/微信号
  • 所报学科 *
  • 其他备注
  • 温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。