2016-11-04 10:18:35
通过拦截请求修复SQL注入、XSS等注入类弱点漏洞
先对什么是注入类攻击做一个简单的介绍。
当你在输入框中输入一个查询时,返回的请求是类似于
SELECT * from tablename WHERE XXX="String"(String是你输入的内容)
而所谓的注入类就是:
SELECT * from tablename WHERE XXX="String" or 1=1 DELETE * from * WHERE "*"
因为1=1 是成立的,所以后面的删除语句也会执行,结果就是清空了数据库,当然作为搞灰产的人来说一般不会去做清空,只是返回出所有的数据库内的信息,通过这些信息去做些工作。
这里有两个重点需要说明:
1.在页面上通过js或者样式来限制输入长度是没有用的,因为可以直接从URL当中执行。
比如http://
middle.jsp?userid=String" or 1=1 DELETE * from * WHERE "*
一样可以实现注入,并不是一定要从输入框中操作。所以一般不会对输入框的输入长度做限制,除了为了好看,并不会起到实际性的作用。
2.要明确,我们是通过对请求内输入的内容做验证,来完成拦截注入的目标。所以,我们不是拦截整个请求。怎么做到这样呢?通过将输入的内容参数化,对参数进行验证。所以不能采用SQL拼接的方式来构建请求,实际上就现在而言,什么情况下都应该采用预编译的模式而不是SQL拼接的方式。至于为什么,虽然是显而易见的但是还是明确下。不管是SQL拼接的方式或者没有对输入内容参数化,那么都只能对请求本身做验证,但是请求本身就是个SQL语句,那么所有请求就都过去了呀。对于XSS也是同样的。
通用类:
1 //使用到的包,用来做正则验证 2 import java.util.regex.Matcher; 3 import java.util.regex.Pattern; 4 5 /* 6 * request check 7 * @author keep 8 * @since JDK1.6 9 * @history 2016-10-17 keep set 10 */ 11 12 public class SqlRequestCheck{ 13 public static boolean check(String getit){ 14 //返回为布尔类型,方便引用时使用,getit即请求中用户输入的内容 15 String pattern = "^[|]+[&]+[;]+[:]+[%]+[+]+[CR]+[LF]+[SELECT]+[FROM]+[UPDATE]+[UNION]+[DELETE]+[WHERE]+[or]$";//正则表达式 16 // 创建 Pattern 对象,即reg 17 Pattern r = Pattern.compile(pattern); 18 // 现在创建 matcher 对象 19 Matcher m = r.matcher(getit); 20 boolean rs = m.find(); 21 if (rs == true){ 22 //如果结果为true则输入的内容中包含这些非法字符 23 // System.out.println(m.replaceAll("输入中存在非法字符!!!!"));看情况使用 24 return false; 25 } 26 return true; 27 } 28 }
引用的方式:
方式一 对于返回值为空的函数
1 SqlRequestCheck sqlr=new SqlRequestCheck(); 2 //input是代表输入内容的参数,如果验证非真则不执行之后的程序 3 if(!sqlr.check(input)){ 4 System.out.println("输入非法字符!"); 5 return; 6 } 7 }
方式二 对于返回值为不能空的函数
1 SqlRequestCheck sqlr=new SqlRequestCheck(); 2 //input是代表输入内容的参数,如果验证非真则不执行之后的程序 3 if(!sqlr.check(input)){ 4 System.out.println("输入非法字符!"); 5 return null;//此时有些事限制不能出现布尔类型的,故直接返回null就好了 6 } 7 }
转载请注明出处:
http://www.cnblogs.com/stefankeep/
