Servelt学习:SQL注入漏洞及其避免方法
2012-03-23 19:49
267 查看
SQL注入漏洞是指执行查询语句时在正常的查询语句之后加入 or 1='1'
例如将语句select * FROM [Students].[dbo].[User] where name='admin' and passwd='123'改写为
select * FROM [Students].[dbo].[User] where name='admin' and passwd='123' or 1='1'时便可以查询出数据表中全部内容(甚至name与passwd值可以随意乱填)
正常情况时得到正确的查询结果:
![](http://hi.csdn.net/attachment/201203/23/0_13325013155Zg5.gif)
用户名或密码错误则无法获得查询结果
![](http://hi.csdn.net/attachment/201203/23/0_13325014080xp8.gif)
而在正常的查询语句之后加入or 1='1'却可以得到整个表的查询结果
![](http://hi.csdn.net/attachment/201203/23/0_1332501553GU5v.gif)
黑客有可能利用SQL漏洞对网站进行攻击。其可以在用户名称栏中随意输入字符,密码栏中输入XXX' or 1='1便可以进入网站。
例如:
![](http://hi.csdn.net/attachment/201203/23/0_13325035964D64.gif)
(数据库中无该用户)
![](http://hi.csdn.net/attachment/201203/23/0_1332503363dN11.gif)
(由于SQL漏洞,页面成功跳转)
解决方法:
不要用户名和密码同时进行验证,而是通过用户名去查询数据库,返回一个密码。然后用该密码与用户输入密码进行比较,如果相同则用户合法,否则为非法用户。
将查询语句:
改为:
例如将语句select * FROM [Students].[dbo].[User] where name='admin' and passwd='123'改写为
select * FROM [Students].[dbo].[User] where name='admin' and passwd='123' or 1='1'时便可以查询出数据表中全部内容(甚至name与passwd值可以随意乱填)
正常情况时得到正确的查询结果:
![](http://hi.csdn.net/attachment/201203/23/0_13325013155Zg5.gif)
用户名或密码错误则无法获得查询结果
![](http://hi.csdn.net/attachment/201203/23/0_13325014080xp8.gif)
而在正常的查询语句之后加入or 1='1'却可以得到整个表的查询结果
![](http://hi.csdn.net/attachment/201203/23/0_1332501553GU5v.gif)
黑客有可能利用SQL漏洞对网站进行攻击。其可以在用户名称栏中随意输入字符,密码栏中输入XXX' or 1='1便可以进入网站。
例如:
![](http://hi.csdn.net/attachment/201203/23/0_13325035964D64.gif)
(数据库中无该用户)
![](http://hi.csdn.net/attachment/201203/23/0_1332503363dN11.gif)
(由于SQL漏洞,页面成功跳转)
解决方法:
不要用户名和密码同时进行验证,而是通过用户名去查询数据库,返回一个密码。然后用该密码与用户输入密码进行比较,如果相同则用户合法,否则为非法用户。
将查询语句:
ps=ct.prepareStatement("select top 1 * from [Students].[dbo].[User] where name='"+u+"'and passwd='"+p+"'");
rs=ps.executeQuery(); if(rs.next()) { //跳转到welcome res.sendRedirect("Wel?user="+u+"&pass="+p); //HttpSession hs=req.getSession(true); //hs.setAttribute("uname",u); }else { res.sendRedirect("login");//写需要跳转的servlet的那个url }
改为:
ps=ct.prepareStatement("select top 1 passwd from [Students].[dbo].[User] where name='"+u+"'"); rs=ps.executeQuery(); if(rs.next()) { String dbPasswd=rs.getString(1); System.out.println(dbPasswd); if(dbPasswd.equals(p)) { System.out.println(dbPasswd); res.sendRedirect("Wel?user="+u+"&pass="+p); HttpSession hs=req.getSession(true); hs.setAttribute("uname",u); } }else//说明用户名不存在 { res.sendRedirect("login");//写需要跳转的servlet的那个url }
相关文章推荐
- 【黑马程序员】参数化查询,避免sql注入漏洞攻击(学习笔记)
- [ExtJS5学习笔记]第七节 Extjs5的组件components及其模板事件方法学习
- Web开发常见的几个漏洞解决方法 ---SQL注入
- C#抽象类及其方法的学习
- 求阶乘,下面的方法可以避免数据溢出,很值得学习。
- Java学习笔记——内部类及其调用方法
- 【安全牛学习笔记】手动漏洞挖掘-SQL注入
- [ExtJS5学习笔记]第七节 Extjs5的组件components及其模板事件方法学习
- 利用SQL注入漏洞登录后台的实现方法
- ASP漏洞+SQL注入的入侵方法
- C#抽象类及其方法的学习
- C#抽象类及其方法的学习
- Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法
- Java学习第十七课(Object及其部分方法的应用)
- [ExtJS5学习笔记]第七节 Extjs5的组件components及其模板事件方法学习
- 【安全牛学习笔记】初识sql注入漏洞原理
- 深度学习优化方法:梯度下降法及其变形
- ASP漏洞+SQL注入的入侵方法
- Android 学习出现的一些error 及其解决方法(持续更新中...)
- SQL注入漏洞及防止方法