java防范跨站脚本攻击(XSS)

时间:2022-10-28 23:28:35

网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加filter对数据参数进行处理。

1、在github上下载lucy-xss-servlet-filter:https://github.com/naver/lucy-xss-servlet-filter

2、打开项目lucy-xss-servlet-filter,将下载代码输出为jar包.

      项目输出为jar包参见教程:http://blog.csdn.net/yahohi/article/details/6888559

3、将生成的jar包和lucy-xss-servlet-filter引用的jar包放入漏洞网站的/WEB-INFO/lib目录或tomcat的lib目录。

4、在漏洞网站的web.xml中添加对lucy-xss-servlet-filter的引用。

...
    <filter>
        <filter-name>xssEscapeServletFilter</filter-name>
        <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>xssEscapeServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
...

5、在classess目录下放入lucy-xss-servlet-filter-rule.xml 。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <config xmlns="http://www.navercorp.com/lucy-xss-servlet">
 3    <defenders>
 4        <!-- XssPreventer 등록 -->
 5        <defender>
 6            <name>xssPreventerDefender</name>
 7            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
 8        </defender>
 9 
10        <!-- XssSaxFilter 등록 -->
11        <defender>
12            <name>xssSaxFilterDefender</name>
13            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
14            <init-param>
15                <param-value>lucy-xss-sax.xml</param-value>   <!-- lucy-xss-filter의 sax용 설정파일 -->
16                <param-value>false</param-value>        <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
17            </init-param>
18        </defender>
19 
20        <!-- XssFilter 등록 -->
21        <defender>
22            <name>xssFilterDefender</name>
23            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
24            <init-param>
25                <param-value>lucy-xss.xml</param-value>    <!-- lucy-xss-filter의 dom용 설정파일 -->
26                <param-value>false</param-value>         <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
27            </init-param>
28        </defender>
29    </defenders>
30 
31     <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. -->
32     <default>
33         <defender>xssPreventerDefender</defender>
34     </default>
35 
36     <!-- global 필터링 룰 선언 -->
37     <global>
38         <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 
39                 또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
40         <params>
41             <param name="globalParameter" useDefender="false" />
42             <param name="globalPrefixParameter" usePrefix="true" useDefender="false" />
43         </params>
44     </global>
45 
46     <!-- url 별 필터링 룰 선언 -->
47     <url-rule-set>
48        
49        <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. -->
50        <url-rule>
51            <url disable="true">/disableUrl1.do</url>
52        </url-rule>
53        
54         <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
55         <url-rule>
56             <url>/url1.do</url>
57             <params>
58                 <param name="url1Parameter" useDefender="false" />
59                 <param name="url1PrefixParameter" usePrefix="true" useDefender="false" />
60             </params>
61         </url-rule>
62         
63         <!-- url2 내의 url2Parameter1만 필터링 되지 않으며 url2Parameter2는 xssSaxFilterDefender를 사용해 필터링 한다.  -->
64         <url-rule>
65             <url>/url2.do</url>
66             <params>
67                 <param name="url2Parameter1" useDefender="false" />
68                 <param name="url2Parameter2">
69                     <defender>xssSaxFilterDefender</defender>
70                 </param>
71             </params>
72         </url-rule>
73     </url-rule-set>
74 </config>

 

6、重启tomcat测试网站,在参数中注入脚本不再提示XSS警告,而是直接出错。

问题解决。这样的好处是不用改动原网站。

 

参考:

WEB安全实战(五)XSS 攻击的另外一种解决方案(推荐) - CSDN博客

java(ssh)项目防止XSS攻击方法总结