修复SQL注入、XSS等注入类弱点漏洞


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/
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM