深入浅出SQL注入
原文:深入浅出SQL注入
之前在做学生信息管理系统和机房收费系统的时候,对于SQL注入的问题已经是司空见惯,但是并没有真正的地形象生动的理解SQL注入到底是什么玩意儿.直到这次做牛腩才在牛老师的举例之下,明白了原来SQL注入是真的很危险啊.
问题提出:
我们先来构造一个简单的添加新闻类别的程序,在动态网页上添加一个TextBox控件,一个Button控件,一个GridView控件。布局如下图所示:
然后为控件编写代码如下:
先来看SQLHelper类中用来执行sql语句的函数
<span style="font-size:18px;">public int ExecuteNonQuery(string sql)
{
int res;
try
{
cmd = new SqlCommand(sql,GetConn());
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally {
if (conn.State ==ConnectionState.Open)
{
conn.Close();
}
}
return res;
}</span>
然后是用来进行插入数据的函数Insert
<span style="font-size:18px;"> public bool Insert(string caName)
{
bool flag = false;
string sql = "insert intocategory(name) values('"+caName +"')";
int res =sqlhelper.ExecuteNonQuery(sql);
if (res > 0)
{
flag = true;
}
return flag;
}</span>
最后是在页面代码中编写按钮的单击事件代码
<span style="font-size:18px;"> protected void Button1_Click(object sender,EventArgs e)
{
string caName = TextBox1.Text;
bool b = newCategoryDAO().Insert(caName);
Response.Write(b);
GridView1.DataSource = newCategoryDAO().SelectAll();
GridView1.DataBind();
}</span>
调试没问题之后,运行程序,结果如下图
当我们在输入框中输入“奇闻异事')delete category where id=5--”之后,单击按钮,结果如下:
当时我看到这个结果的时候,很是震惊,就这么轻易的把数据库里的数据删除了?这是为什么呢?我们把代码中的SQL语句提取出来,然后将输入的内容也放进去,来分析一下原因,如下图
这只是SQL注入的一个简单的例子而已,还有好多种形式的SQL注入。只要能够获取你的数据库表名(对于高手来说,这个so
easy),而且你的代码没有经过安全性优化,那么我就可以随意更改甚至删除你的数据,上面的只是删除了一条记录,如果把语句改成delete category,那么整个表的数据将会被清空,后果很严重啊。
解决方案:
一种办法就是将输入的内容参数化,即将原本拼接SQL语句的方式变成向SQL语句中传入参数。具体来讲,就是将Insert函数改造一下,并且将SQLHelper类中的相应函数也改写一下,代码如下:
先来看SQLHelper的函数如何改写:
<span style="font-size:18px;">public int ExecuteNonQuery(string sql ,SqlParameter [] paras)
{
int res;
using (cmd =new SqlCommand (sql ,GetConn ()))
{
cmd.Parameters.AddRange(paras );
res =cmd .ExecuteNonQuery ();
}
return res;
}</span>
然后是Insert函数的优化代码:
<span style="font-size:18px;"> public bool Insert(string caName)
{
bool flag = false;
string sql = "insert into category(name) values(@caName)";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@caName",caName )
};
int res = sqlhelper.ExecuteNonQuery(sql, paras);
if (res > 0)
{
flag = true;
}
return flag;
}</span>
优化之后调试没问题,运行程序,结果如下:
我们在输入框中输入“奇闻异事')delete category where id=2--”,然后单击按钮,会出现什么结果呢?请看下图:
到现在为止,相信你对SQL注入一定有了一个直观的认识和理解,当初做系统的时候只是知道在输入框中输入奇数个英文状态下的单引号,会让你的系统报错甚至死掉,并不知道还可以通过拼接SQL语句对内部数据库进行操作,从而对SQL注入的危害性没有那么深刻的认识,现在终于明白了原来问题很严重啊!
深入浅出SQL注入的更多相关文章
- 渗透攻防Web篇-深入浅出SQL注入
1 背景 京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致. 2 手工检测 2.1 前 ...
- EntityFramework Core 2.0执行原始查询如何防止SQL注入?
前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
随机推荐
- Parse 和 Swift 搭建一个像 Instagram
如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用? [编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客 ...
- hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others) ...
- hdu4864Task(馋)
主题链接: 啊哈哈.点我 题目: Task Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Putty是一个专业的SSH连接客户端
http://www.putty.ws/PuTTY-LinuxVPS Putty是一个专业的SSH连接客户端,当然可以用来连接Linux操作系统的VPS.下文是Putty连接工具的使用方法与详细教程, ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...
- linux_shell_类似sql的orderby 取最大值
{} {} {} {} {} {} {} {} {} {} 需求场景 ,通过shell 筛选 每分钟的最大一条输出(最后一条) : .info | head
- Objective-C马路成魔【14-关键C语言功能】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 这里介绍一 ...
- UML九种图汇总
UML视频读,该文件开始起草.我不知道如何下手啊!我想先UML九图和总结的关系,然后开始用它的文件. 首先在地图上. UML的九种图各自是:用例图.类图.对象图.状态图.活动图.协作图.序列图.组件图 ...
- Hadoop上传文件的报错
baidu了很多,都说防火墙,datanode没有正常启动的问题,可是检查了都是正常,后来还是在老外的网站上找到了解决的方法 修改了/etc/security/limits.conf文件,上传成功 这 ...
- 采用tcpdump攫Android网络数据包
1 空灵的原理 tcpdump(需Root用户执行)拦截和显示发送或收到过网络连接到该机器的TCP/IP和其它数据包.简单说就监控手机进出网络数据. 2 方法优劣 2.1长处 1.手机数据包无遗漏 2 ...