Sql 注入漏洞攻击
2012-11-27 08:52
309 查看
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S(Browser/Server,浏览器/客户端)模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据进行合法性判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL
Injection,即SQL注入。(摘自百度百科)
正如上面所说,SQL注入漏洞正是通过一段巧妙的SQL语句,从程序返回的结果中获得有用的信息,从而侵入系统。下面就由一个小小的案例登陆程序来向大家演示一下简单的SQL注入。
这个登陆程序由两个textbox(用户名,密码)和一个登陆按钮组成,首先应先建立一个数据库,用于存储用户名和密码,再与程序进行连接,通过由textbox传过来的值与数据库的值进行比较查询,我们通常会这样来写这段代码:
string username = txtUserName.Text;
string password = txtPassword.Text;
using (SqlConnection conn = new SqlConnection(ConStr))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText = "select count(*) from T_Users where UserName="+"'"+username+"'"+"and Password="+"'"+password+"'";
if ((int)cmd.ExecuteScalar() != 0)
{
MessageBox.Show("登陆成功!");
}
else
{
MessageBox.Show("登陆失败!");
IncErrortimes();
}
}
}
通过字符串拼接的方式,将程序中的字符串变量username,password与select结合起来,如果有返回值则说明登陆成功,否则登陆失败。这样看似没有什么问题,假如数据库有用户名为:admin,密码为123456的用户,输入后会显示登陆成功,输入其他的自然会显示失败,然而,有一种方式,会使得我们不需要知道密码,就可以登陆,因为它的验证方式是通过字符串拼接来完成的,因此我们可以在密码框内这样写:1'
or '1' = '1 试试看,神奇的事情发生了!程序弹出了登陆成功的对话框,这是什么原因呢?原来,我们写的SQL语句与密码一结合,会产生这样一个语句:
select count(*) from T_Users where UserName='admin' and password='1' or '1' = '1'
不管我们输入的是什么用户名,这条SQL语句执行后始终会返回数据,使得用户名与密码形同虚设。这样就达到SQL注入攻击的目的。想想,如果在正式的公司或网站有这样的漏洞,那么黑客利用此漏洞,入侵系统,会带来多大的损失啊。
那么,既然这样,我们怎么解决呢?呵呵,既然知道问题出在哪,就肯定有解决方案,针对这一漏洞,我们用的是参数化查询语句,即:select count(*) from T_Users where UserName=@UserName andPasssword=@Password ,然后,在后面往其中加入参数,代码如下:
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText = "select count(*) from T_Users where UserName=@UserName andPassword=@Password";
cmd.Parameters.Add(new SqlParameter("UserName",username));
cmd.Parameters.Add(new SqlParameter("Password",password));
if ((int)cmd.ExecuteScalar() != 0)
{
MessageBox.Show("登陆成功!");
}
else
{
MessageBox.Show("登陆失败!");
IncErrortimes();
}
}
这样,利用参数化查询,将参数放入SQL语句,不会进行字符串的拼接,SQL注入便不攻自破。由此,我们可以看得出来,常说的漏洞,其实看起来也并非想像的那么深奥复杂,只要你用心,也可以找出程序的漏洞,黑客其实并不神秘,只不过他们技术过硬,能从别人精心设计的程序中找到BUG,从而达到入侵的目的。
Injection,即SQL注入。(摘自百度百科)
正如上面所说,SQL注入漏洞正是通过一段巧妙的SQL语句,从程序返回的结果中获得有用的信息,从而侵入系统。下面就由一个小小的案例登陆程序来向大家演示一下简单的SQL注入。
这个登陆程序由两个textbox(用户名,密码)和一个登陆按钮组成,首先应先建立一个数据库,用于存储用户名和密码,再与程序进行连接,通过由textbox传过来的值与数据库的值进行比较查询,我们通常会这样来写这段代码:
string username = txtUserName.Text;
string password = txtPassword.Text;
using (SqlConnection conn = new SqlConnection(ConStr))
{
conn.Open();
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText = "select count(*) from T_Users where UserName="+"'"+username+"'"+"and Password="+"'"+password+"'";
if ((int)cmd.ExecuteScalar() != 0)
{
MessageBox.Show("登陆成功!");
}
else
{
MessageBox.Show("登陆失败!");
IncErrortimes();
}
}
}
通过字符串拼接的方式,将程序中的字符串变量username,password与select结合起来,如果有返回值则说明登陆成功,否则登陆失败。这样看似没有什么问题,假如数据库有用户名为:admin,密码为123456的用户,输入后会显示登陆成功,输入其他的自然会显示失败,然而,有一种方式,会使得我们不需要知道密码,就可以登陆,因为它的验证方式是通过字符串拼接来完成的,因此我们可以在密码框内这样写:1'
or '1' = '1 试试看,神奇的事情发生了!程序弹出了登陆成功的对话框,这是什么原因呢?原来,我们写的SQL语句与密码一结合,会产生这样一个语句:
select count(*) from T_Users where UserName='admin' and password='1' or '1' = '1'
不管我们输入的是什么用户名,这条SQL语句执行后始终会返回数据,使得用户名与密码形同虚设。这样就达到SQL注入攻击的目的。想想,如果在正式的公司或网站有这样的漏洞,那么黑客利用此漏洞,入侵系统,会带来多大的损失啊。
那么,既然这样,我们怎么解决呢?呵呵,既然知道问题出在哪,就肯定有解决方案,针对这一漏洞,我们用的是参数化查询语句,即:select count(*) from T_Users where UserName=@UserName andPasssword=@Password ,然后,在后面往其中加入参数,代码如下:
using (SqlCommand cmd =conn.CreateCommand())
{
cmd.CommandText = "select count(*) from T_Users where UserName=@UserName andPassword=@Password";
cmd.Parameters.Add(new SqlParameter("UserName",username));
cmd.Parameters.Add(new SqlParameter("Password",password));
if ((int)cmd.ExecuteScalar() != 0)
{
MessageBox.Show("登陆成功!");
}
else
{
MessageBox.Show("登陆失败!");
IncErrortimes();
}
}
这样,利用参数化查询,将参数放入SQL语句,不会进行字符串的拼接,SQL注入便不攻自破。由此,我们可以看得出来,常说的漏洞,其实看起来也并非想像的那么深奥复杂,只要你用心,也可以找出程序的漏洞,黑客其实并不神秘,只不过他们技术过硬,能从别人精心设计的程序中找到BUG,从而达到入侵的目的。
相关文章推荐
- 黑马程序员--学习笔记之SQL注入漏洞攻击
- SQL 注入防漏洞攻击
- SQL防漏洞注入攻击小结
- 黑马程序员--ADO.NET学习之SQL注入漏洞攻击
- Sql通用防注入系统3.1β版的跨站漏洞
- Dvbbs7.1 sp1 SQL版savepost.asp注入漏洞分析、利用及防范
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 在 Java 中防止 SQL 注入攻击(SQL Injection)的方法
- 一次nmidahena.com/1.js 式sql 注入攻击的处理经历
- SQL 注入天书 - ASP 注入漏洞全接触
- 数据恢复-SQL被注入攻击程序的应对策略(ORA-16703)
- SQL注入漏洞全接触
- [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优
- SQL 注入攻击的解决办法
- web安全、XSS、CSRF、注入攻击、文件上传漏洞
- 通用的PHP防注入漏洞攻击的过滤函数代码
- Java Web 防范 SQL 注入攻击
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- 详解SQL 注入、XSS 攻击、CSRF 攻击
- PHP SQL 注入攻击的技术实现以及预防办法