网站运营
位置:首页>> 网站运营>> 使用参数化查询防止SQL注入漏洞

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

作者:heero 来源:heero博客 发布时间:2010-06-26 12:56:00 

标签: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();

0
投稿

猜你喜欢

  • 人的成长总是伴随着痛苦和磨难,这话说的沉重了些。就说这网站推广吧,刚把中文网站推广琢磨出点门道来,突然要推英文站了,人在职场,不进则退,就是
  • 第一、网页的title,是你每次优化的重点。第二、title,description,keyword你写的越多,得到的就越少。第三、页面头部
  • 对于大多数企业局域网来说,路由器已经成为正在使用之中的最重要的安全设备之一。一般来说,大多数网络都有一个主要的接入点。这就是通常与专用防火墙
  • 暂且不提世界人口增长,北极冰川融化、海平面上升,单是不断的荒漠化和环境污染已经让人们的居住环境越来越少了,拥有的各种自然资源也越来越贫乏。在
  • 最近集中精力学习了一下前辈们的网站营运及推广经验,和如何实现盈利的方法,针对目前我所运营的深圳掘吧网不温不火的现状,决定作出一次尝试:去扫街
  • 博客评论投票是一个常见的功能,如果对某网友的评论比较认同,那么可以对其进行“支持”投票。如果感觉评论内容不好,不同意其观点,可以对其投“反对
  • 如果一个网站的HTML代码很容易被人理解,那么他应该也很容易被搜索引擎理解吧,如果容易被搜索引擎理解,那搜索引擎肯定就喜欢这个网站了,所以会
  • 先按官方整合。基本上没有问题。但有些朋友老是在细节出现问题。呵呵。我也是哈。也来和大家分享一下有问题留言但你要把你三方的图发上来。1。检查接
  • 1,文章页的tag的调用解决办法V5.3TAG的调用方式为:TAG:{dede:field.tags/} 这个在内容页模板中使用全局标签{d
  • 了解缓存中毒攻击近来,网络上出现史上最强大的互联网漏洞——DNS缓存漏洞,此漏洞直指我们应用中互联网脆弱的安全系统,而安全性差的根源在于设计
  • 标签做为SEO中最普及的优化手段,在SEO被人们认识的初期,站长因此项设置而明显改善了网站的搜索引擎排名大为兴奋。但随着黑帽SEO的发展,搜
  • 在网站架构设计中,大家一定对 LAMP (Linux Apache Mysql Php) 不陌生。LAMP确实是一个非常优秀的架构,秉承着自
  • 时逢祖国60华诞,小编看完庄严隆重的国庆阅兵式后仍然激动不已,于是就将家里的老照片翻了出来“忆苦思甜&rdquo
  • 1、博大精深的美食文化中国美食自古以来在就在全世界有着重要的地位,拥有6万多种传统菜点、2万多种工业食品、五光十色的筵宴和流光溢彩的风味流派
  • 网页抓取优先策略也称为“页面选择问题”(page Selection),通常是尽可能地首先抓取重要性的网页,这样保证在有限的资源内尽可能地照
  • 11月20日,阿里巴巴集团正式宣布,试运行百日的阿里妈妈网站(www.alimama.com )已获惊人成长,跃居成为中国最大的网上广告交易
  • 昨日下午,易观国际分析师曹飞撰文称《卓越亚马逊将会成为淘宝未来最大的竞争对手》,该文认为,卓越亚马逊作为B2C商业模式的代表,和以平台模式的
  • 李开复(腾讯科技配图)“创新工场现在是房子不小,人不多,这个星期我们雇用了第七个人。”节前,李开复对
  • 作为破坏力较强的黑客攻击手段,DDoS是一种形式比较特殊的拒绝服务攻击。作为一种分布、协作的大规模攻击方式,它往往把受害目标锁定在大型Int
  • 文件名称简介accwiz.exe辅助功能向导append.exe打开指定文件夹中的数据文件arp.exe显示和修改“地址
手机版 网站运营 asp之家 www.aspxhome.com