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注入的原理
以往在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();
发表评论
-
学软件开发 做职场黑马
2012-10-22 16:06 560职场犹如一座迷宫,在你推门而入的时候,眼前出现很多条路 ... -
动态性语言在Java编程中的运用
2012-10-17 14:38 421多态在现实世界中比比皆是。从描述人的性格和行为的“多面人”、“ ... -
网站服务器遭受攻击后的解决方案
2012-10-17 14:36 746常在河边走,哪有 ... -
移动互联网中的搜索引擎应用
2012-10-14 15:50 591搜索引擎是指根据一定的策略、运用特定的计算机程序从互联 ... -
编程高手告诉你几种流行的编程风格
2012-10-14 15:42 388过去的几年我遇到了很多使用囧然不同风格的开发者,下面是 ... -
移动应用快速开发 企业CIO的当务之急
2012-10-12 15:54 323应用开发方案提供商正竞相协助企业CIO和其它IT高管为包 ... -
网络热议莫言获诺贝尔奖 社区网站成推广主流
2012-10-12 15:51 757莫言获得诺贝尔奖的消息很早就在社交网络上流传,而在其获奖 ... -
告别假期综合症 工作学习进正轨
2012-10-11 08:51 414难得的十一中秋双节已经结束,探亲、旅游人群陆续返回返回 ... -
Android引领手机开发应用潮流
2012-10-11 08:46 374当前Symbian, Windows ... -
网店推广你不可不知的四种方法
2012-10-11 08:42 3001.淘宝直通车 淘宝 ...
相关推荐
二:如果用SQL语句,那就使用参数化,添加Param 三:尽可能的使用存储过程,安全性能高而且处理速度也快 四:屏蔽SQL,javascript等注入(很是主要的),对于每个文件写是不太可能的。所以要找到对所有文件起...
SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细...
本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。...
使用参数化查询(Prepared Statements):使用预编译的SQL语句和参数绑定,而不是直接将用户输入拼接到SQL查询中。这样可以防止恶意代码通过用户输入来修改SQL查询的结构。 输入验证和过滤:对用户输入进行验证和...
SQLMap是一款流行的开源SQL注入工具,用于自动化检测和利用Web应用程序中的SQL注入漏洞。它可以测试目标站点是否存在SQL注入漏洞,并探测数据库类型、操作系统、表名、列名等信息,进而将这些信息自动化地利用来获取...
所谓的SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。穿山甲能够通过一...
所谓的SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。Pangolin能够通过...
Havij是一款自动化的SQL注入工具,它能够帮助渗透测试人员发现和利用Web应用程序的SQL注入漏洞。Havij不仅能够自动挖掘可利用的SQL 查询,还能够识别后台数据库类型、检索数据的用户名和密码hash、转储表和列、从...
SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹、访问底层文件系统、执行命令)。 读者可以通过位于SourceForge的官方网站下载SQLmap源码...
前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程。
开发的时候为了方便快速,经常会使用SQL语句拼接的方式,这往往让不法分子有了可乘之机,利用漏洞进行SQL注入,做一些不可描述的事情 SqlCommand cmd = new SqlCommand(); cmd.CommandText = select * from user ...
Havij是一款自动化的SQL注入工具,它能够帮助渗透测试人员发现和利用Web应用程序的SQL注入漏洞。Havij不仅能够自动挖掘可利用的SQL 查询,还能够识别后台数据库类型、检索数据的用户名和密码hash、转储表和列、从...
主要介绍了asp执行带参数的sql语句实例,参数化SQL语句可以有效的防止SQL注入漏洞,需要的朋友可以参考下
SQL注入 什么是SQL注入 所谓SQL注入,就是通过把SQL命令插入到表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,...最好使用准备好的语句和参数化查
Sqlmap 是一个自动化的 SQL 注入工具,其主要功能是扫描、发现并利用给定的 Url 的 Sql 注入漏洞,目前支持 MySQL、 Oracle、 PostgreSQL、 Microsoft SQL Server、 Microsoft Access 等主流数据库。 Sqlmap 使用 5 ...
10.1.3 使用参数化SQL 10.2 SQL调优 10.2.1 SQL调优的基本原则 10.2.2 索引 10.2.3 全表扫描和索引查找 10.2.4 优化手法 10.3 事务 10.3.1 事务简介 10.3.2 事务的隔离 10.3.3 事务的隔离级别 ...
10.1.3 使用参数化SQL 10.2 SQL调优 10.2.1 SQL调优的基本原则 10.2.2 索引 10.2.3 全表扫描和索引查找 10.2.4 优化手法 10.3 事务 10.3.1 事务简介 10.3.2 事务的隔离 10.3.3 事务的隔离级别 ...
10.1.3 使用参数化SQL 10.2 SQL调优 10.2.1 SQL调优的基本原则 10.2.2 索引 10.2.3 全表扫描和索引查找 10.2.4 优化手法 10.3 事务 10.3.1 事务简介 10.3.2 事务的隔离 10.3.3 事务的隔离级别 ...
10.1.3 使用参数化SQL 10.2 SQL调优 10.2.1 SQL调优的基本原则 10.2.2 索引 10.2.3 全表扫描和索引查找 10.2.4 优化手法 10.3 事务 10.3.1 事务简介 10.3.2 事务的隔离 10.3.3 事务的隔离级别 ...
10.1.3 使用参数化SQL 10.2 SQL调优 10.2.1 SQL调优的基本原则 10.2.2 索引 10.2.3 全表扫描和索引查找 10.2.4 优化手法 10.3 事务 10.3.1 事务简介 10.3.2 事务的隔离 10.3.3 事务的隔离级别 ...