一、 SQL注入简介
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。 ===========================================
二、 SQL注入攻击的总体思路
1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型< BR>3.针对不通的服务器和数据库特点进行SQL注入攻击 ===========================================
三、SQL注入攻击实例
比如在一个登录界面,要求输入用户名和密码:
可以这样输入实现免帐号登录:
用户名: ‘ or 1 = 1 – 密 码:
点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)
这是为什么呢? 下面我们分析一下:
从理论上说,后台认证程序中会有如下的SQL语句:
String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '"; 当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’ 分析SQL语句: 条件后面 username=” or 1=1 用户名等于 ” 或 1=1 那么这个条件一定会成功; 然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password='' ….其后果可想而知… ============================================
四、应对方法
下面我针对JSP,说一下应对方法:
=============================================
要引入的包: import java.util.regex.*;
正则表达式: private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
判断是否匹配: Pattern.matches(CHECKSQL,targerStr);
下面是具体的正则表达式: 检测SQL meta-characters的正则表达式 : /(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix 修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i 典型的 SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’) 检测MS SQL Server SQL注入攻击的正则表达式: /exec(\s|\+)+(s|x)p\w+/ix 等等….. ==========================================
比较通用的一个方法: (||之间的参数可以根据自己程序的需要添加) =======================================
public static boolean sql_inj(String str) { String inj_str = "'|and|exec|insert|select|delete|update| count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; String inj_stra[] = split(inj_str,"|"); for (int i=0 ; i < inj_stra.length ; i++ ) { if (str.indexOf(inj_stra)>=0) { return true; } } return false; } ==========================================
=======================================
防止SQL从URL注入:
sql_inj.java代码: =======================================
package sql_inj;
import java.net.*; import java.io.*; import java.sql.*; import java.text.*; import java.lang.String;
public class sql_inj{ public static boolean sql_inj(String str) { String inj_str = "'|and|exec|insert|select|delete|update| count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; //这里的东西还可以自己添加 String[] inj_stra=inj_str.split("\\|"); for (int i=0 ; i < inj_stra.length ; i++ ) { if (str.indexOf(inj_stra)>=0) { return true; } } return false; } } ======================================
===================================
使用javascript在客户端进行不安全字符屏蔽
功能介绍:检查是否含有”‘”,”\\”,”/” 参数说明:要检查的字符串 返回值:0:是 1:不是 函数名是 function check(a) { return 1; fibdn = new Array (”‘” ,”\\”,”/”); i=fibdn.length; j=a.length; for (ii=0; ii<i; ii++) { for (jj=0; jj<j; jj++) { temp1=a.charAt(jj); temp2=fibdn[ii]; if (tem’; p1==temp2) { return 0; } } } return 1;
} ===================================
总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。 凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。
公司简介:
合肥清默网络技术有限公司(以下简称清默网络)坐落于安徽省合肥市,公司主要从事于高端IT培训和IT系统集成。清默自成立以来一直都力求打造中国高端IT培训的第一品牌,专注于培养CISCO网络高端人才。公司是Cisco公司安徽区域的认证和培训授权中心,是一家拥有独立的VUE考场,并且致力于cisco职业认证培训的网络技术有限公司!公司内部有优秀的全IE技术团队,能够提供学员实际操作和实践动手能力的4套CCIE机架(产品设备涉及voice、security、wireless、R&S)以及华东地区最大的cisco书架!我们希望能够给所有想学习和正在学习网络的人提供一个开放的、积极的、优质的学习平台。公司下设了IT系统集成部门,有强大优秀的工程师团队,其中也不乏有获得过cisco双CCIE认证具有300多个工程经验的老工程师。自立于为企业提供最合适的IT解决方案和技术支持!
公司网址:
http://www.qmcisco.com/
http://www.qmcisco.com/news/renzhe.html http://www.qmcisco.com/news/peixun.html http://www.qmcisco.com/news/news.html http://www.qmcisco.com/news/ccna.html http://www.qmcisco.com/news/ccie.html http://www.qmcisco.com/news/jishu.html http://www.qingm.net/
http://www.qingm.net/Speciality.aspx http://www.qingm.net/Study.aspx http://www.qingm.net/News.aspx |