--HeShiwei 2014-5-15

什么是SQL注入 

SQL注入,指的是用户通过向登录框输入恶意字符,利用代码的字符串拼接漏洞进行网站注入攻击,最终导致整个网站用户表信息泄露的攻击方式。黑客就是利用了程序员的字符串拼接sql语句。这个漏洞在几年前很流行,因为利用它实在是太简单。随着近几年程序员安全意识提高,注入漏洞早已不见踪影。

  假如你去面试,HR看到写的程序还在用字符串拼接,基本没戏。但是我们的学校依然教拼接字符串。用winform或 wpf做的XX管理系统,问题也不大因为用的人不多。一旦用asp.Net做网站,还拼接sql语句。后果可想而知。为此专门以Sql Server为例做了一个非常简单的登录验证,说明此问题的严重性:

这是一个典型的登录案例:

private string strConn = "server=.\\sqlexpress;database=School;uid=sa;pwd=123456";

private void btnConfirm_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(txtUserName.Text.Trim())
|| String.IsNullOrEmpty(txtPassWord.Text.Trim()))
{
MessageBox.Show("输入错误,请检查!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
} //创建连接对象
using (SqlConnection conn = new SqlConnection(strConn))
{
//创建命令对象
using (SqlCommand cmd = conn.CreateCommand())
{
SqlDataReader dr = null;
cmd.CommandText = "select * from UserInfo where uName='"+txtUserName.Text.Trim()+"' and uPass='" + txtPassWord.Text.Trim() + "'"; //尝试连接、执行
try
{
conn.Open();
dr = cmd.ExecuteReader();
}
catch (Exception ex)
{
MessageBox.Show("数据库错误:"+ex.Message);
return;
} //是否存在数据(存在数据表示登录成功)
if (dr.HasRows)
{
//指针指向第一条数据
dr.Read(); MessageBox.Show("登录成功 当前登录用户:"+dr.GetString());
}
else
{
MessageBox.Show("此用户不存在!");
} }
}

下面是用户表(UserInfo)的数据:

当我们在任何一个文本框输入万能字符串:

' or ''='

发现一个奇怪的现象:

为什么会这样,我们看设断点,看看拼出了什么样的sql语句:

select * from UserInfo where uName='admin' and uPass='' or ''=''

还有一种情况:

看看凭借出了什么样的sql语句:

select * from UserInfo where uName='admin'--' and uPass='这里随意输!'

'--'后面都是被注释的。所以真正执行的是:

select * from UserInfo where uName='admin'
这样一来,只要知道任意一个用户名就能登录系统。

这就是最最简单的一种sql注入漏洞,由此可见程序员一旦不幸使用sql拼接,登录验证就是一摆设。

注入漏洞的防范措施:使用参数化查询。

using (SqlCommand cmd = conn.CreateCommand())
{
SqlDataReader dr = null;
//使用参数代替值
cmd.CommandText = "select * from UserInfo where uName=@name and uPass=@pass";
//建立参数对象
cmd.Parameters.Add(new SqlParameter("@name", txtUserName.Text.Trim()));
cmd.Parameters.Add(new SqlParameter("@pass", txtPassWord.Text.Trim()));
try
{
conn.Open();
dr = cmd.ExecuteReader();
}
catch (Exception ex)
{
MessageBox.Show("数据库错误:"+ex.Message);
return;
} if (dr.HasRows)
{
dr.Read(); MessageBox.Show("登录成功 当前登录用户:"+dr.GetString());
}
else
{
MessageBox.Show("此用户不存在!");
} }

上面的登录验证太简单,附上一个带15分钟内限定登录次数的。 

更正之前《登录小案例》密码错3次15分钟内不准登录

附:SQL语句

create database School
go
use School
go
create table UserInfo
(
uId int constraint pk_UserInfo_uId primary key(uId) identity(1,1),
uName nvarchar(32) not null constraint uq_UserInfo_uName unique(uName),
uPass varchar(16) not null constraint ck_UserInfo_uPass check(len(uPass)>=3),
uEmail varchar(32) null,
uErrTimes int not null constraint df_UserInfo_uErrTimes default(0),
uLastErrTime datetime not null constraint df_UserInfo_uLastErrTime default('1990-1-1')
)
go
insert into UserInfo
values
('admin','','137233130@qq.com',default,default),
('admin1','','137233130@qq.com',default,default),
('admin2','','137233130@qq.com',default,default) select * from UserInfo

浅谈SQL注入漏洞以及防范策略的更多相关文章

  1. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  2. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  3. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...

  4. 浅谈 SQL 注入(注入篇)

    一.SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web ...

  5. 浅谈SQL注入

    先看一个sql语句: select * from admin where username='(此处为用户输入的数据)'; 在没有任何过滤的情况下,如果用户输入:' or 1=1 -- 这条语句就为: ...

  6. 利用SQL注入漏洞登录后台的实现方法

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  7. 代码审计(1):sql注入漏洞

    挖掘经验:sql注入经常出现在登录界面.获取HTTP请求头.订单处理等地方.而登录界面的注入现在来说大多是发生在HTTP头里面的client-ip和x-forward-for,一般用来记录登录的ip地 ...

  8. [转]SQL注入漏洞及绑定变量浅谈

    1.一个问题引发的思考 大家在群里讨论了一个问题,奉文帅之命写篇作文,且看: String user_web = "user_web" String sql = "upd ...

  9. 利用“参数赋值”防范SQL注入漏洞攻击

    <<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...

随机推荐

  1. WEB-INF目录与META-INF目录的作用(转载)

    /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...

  2. 2.6.1 XML配置:创建XML文件

    (1) 工程名右击---New--file  --  newfile窗口中:filename中输入testng.xml testng.xml 文件中打开后,切换到source 标签中.进行编辑. 内容 ...

  3. lua 随机数 math.random()和math.randomseed()用法

    用法一:  不给范围,就随机算一个0~1之间的小数: 用法二:给一个参数,就取1~n之间的随机数 用法三:给两个参数,就取m~n之间的随机数 math.randomseed()用法:     由于C中 ...

  4. python下matplotlib、numpy、pandas联合作图逐步深入分析

    1.代码1: from pandas import Series,DataFrame from numpy.random import randn import numpy as np import ...

  5. 题解 【洛谷P1035】[NOIP2002普及组]级数求和

    [NOIP2002普及组]级数求和 这个题……用循环也是可以的,不过我写了两种循环的题解,供各位dalao参考!O(∩_∩)O谢谢! for循环版本: #include<bits/stdc++. ...

  6. 调用 url_launcher 模块打开外部浏 览器 打开外部应用 拨打电话 发送短信

    1.Flutter url_launcher 模块    Flutter url_launcher 模块可以让我们实现打开外部浏览器.打开外部应用.发送短信.拨打电话等功能.    https://p ...

  7. 励志成为优产的母猪--------猜数游戏 ,历史记录,pickle保存,队列deque

    # pickle 可以处理复杂的序列化语法.(例如自定义的类的方法,游戏的存档等),存档以文件的形式保存 参见 https://www.cnblogs.com/abobo/p/8080447.html ...

  8. codeforces 711 D.Directed Roads(tarjan 强连通分量 )

    题目链接:http://codeforces.com/contest/711/problem/D 题目大意:Udayland有一些小镇,小镇和小镇之间连接着路,在某些区域内,如果从小镇Ai开始,找到一 ...

  9. [python]Python 字典(Dictionary) update()方法

    update() 函数把字典dict2的键/值对更新到dict里.如果后面的键有重复的会覆盖前面的语法dict.update(dict2) dict = {'Name': 'Zara', 'Age': ...

  10. 断点调试,issubclass和ininstance的使用

    一等公民 只要可以把一个东西赋值给一个变量,这个东西就叫一等公民 断点调试 在想要加断点的地方用鼠标点击一下,你会看到一个红色圆圈 变红的地方,程序执行到,就会暂停 断电应该加载报错之前 绿色箭头表示 ...