防止xss攻击与sql注入

时间:2022-04-09 13:53:29

XSS

xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。Xss脚本攻击类型分为:非持久型xss攻击、持久型xss攻击。

1.非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

2.持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。

 

防止Xss攻击:过滤表单提交的数据,将可疑的内容去掉。

1.继承HttpServletRequestWrapper类,使用装饰模式重写HttpServletRequest的获取参数方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package  com.soufun.wap.servlet;
 
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletRequestWrapper;
 
import  org.apache.commons.lang.StringEscapeUtils;
 
public  class  XSSRequestWrapper  extends  HttpServletRequestWrapper {
     public  XSSRequestWrapper(HttpServletRequest servletRequest) {
         super (servletRequest);
     }
 
     @Override
     public  String[] getParameterValues(String parameter) {
         String[] values =  super .getParameterValues(parameter);
         if  ( "pageChildren" .equals(parameter)) {
             return  values;
         }
         if  (values ==  null ) {
             return  null ;
         }
         int  count = values.length;
         String[] encodedValues =  new  String[count];
         for  ( int  i =  0 ; i < count; i++) {
             encodedValues[i] = stripXSS(values[i]);
         }
         return  encodedValues;
     }
 
     @Override
     public  String getParameter(String parameter) {
         String value =  super .getParameter(parameter);
         return  stripXSS(value);
     }
 
     private  String stripXSS(String value) {
         if  ( null  != value) {
             value = value.replaceAll( "<" "<" ).replaceAll( ">" ">" );
             value = value.replaceAll( "\\(" "(" ).replaceAll( "\\)" ")" );
             value = value.replaceAll( "'" "'" );
             value = value.replaceAll( "eval\\((.*)\\)" "" );
             value = value.replaceAll( "[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']" "\"\"" );
             value = value.replaceAll( "script" "" );
             value = StringEscapeUtils.escapeSql(value);
         }
         return  value;
     }
}

2.创建拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package  com.soufun.wap.filter;
 
import  java.io.IOException;
 
import  javax.servlet.Filter;
import  javax.servlet.FilterChain;
import  javax.servlet.FilterConfig;
import  javax.servlet.ServletException;
import  javax.servlet.ServletRequest;
import  javax.servlet.ServletResponse;
import  javax.servlet.http.HttpServletRequest;
 
import  com.soufun.wap.servlet.XSSRequestWrapper;
 
public  class  SqlXssFilter  implements  Filter {
 
     public  void  init(FilterConfig config)  throws  ServletException {
     }
 
     public  void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  throws  IOException, ServletException {
         HttpServletRequest req = (HttpServletRequest) request;
         chain.doFilter( new  XSSRequestWrapper(req), response);
     }
 
     public  void  destroy() {
     }
}

  

3.配置拦截器

1
2
3
4
5
6
7
8
< filter >
     < filter-name >sqlXssFilter</ filter-name >
     < filter-class >com.soufun.wap.filter.SqlXssFilter</ filter-class >
</ filter >
< filter-mapping >
     < filter-name >sqlXssFilter</ filter-name >
     < url-pattern >/*</ url-pattern >
</ filter-mapping >

 

SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

防止sql注入的方法主要有:

1.使用存储过程

2.校验输入的字符串

3.参数化sql

在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。