天天看點

XSS防腳本注入的過濾器

<a href="http://blog.51cto.com/hanchaohan/%5C">了解一些内容,别人的文章</a>

我們這裡隻是一個簡單的例子,不全,我們在springmvc中做一個小的demo,

1.web.xml配置過濾器

<code>&lt;!-- XSS過濾器  --&gt;</code>

<code>&lt;</code><code>filter</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>filter-name</code><code>&gt;XSSFilter&lt;/</code><code>filter-name</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>filter-class</code><code>&gt;</code>

<code>        </code><code>com.hanchao.filter.XssCheckFilter</code>

<code>    </code><code>&lt;/</code><code>filter-class</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>init-param</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>param-name</code><code>&gt;errorPath&lt;/</code><code>param-name</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>param-value</code><code>&gt;/views/error.jsp&lt;/</code><code>param-value</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>init-param</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>param-name</code><code>&gt;excludePaths&lt;/</code><code>param-name</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>param-value</code><code>&gt;/login&lt;/</code><code>param-value</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>init-param</code><code>&gt; </code>

<code>&lt;/</code><code>filter</code><code>&gt;</code>

<code>&lt;</code><code>filter-mapping</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>url-pattern</code><code>&gt;/*&lt;/</code><code>url-pattern</code><code>&gt;</code>

<code>&lt;/</code><code>filter-mapping</code><code>&gt;</code>

2.過濾器代碼:

<code>package</code> <code>com.kongzhong.passport.filter;</code>

<code>import</code> <code>java.io.IOException;</code>

<code>import</code> <code>java.util.Enumeration;</code>

<code>import</code> <code>javax.servlet.Filter;</code>

<code>import</code> <code>javax.servlet.FilterChain;</code>

<code>import</code> <code>javax.servlet.FilterConfig;</code>

<code>import</code> <code>javax.servlet.ServletException;</code>

<code>import</code> <code>javax.servlet.ServletRequest;</code>

<code>import</code> <code>javax.servlet.ServletResponse;</code>

<code>import</code> <code>javax.servlet.http.HttpServletRequest;</code>

<code>import</code> <code>javax.servlet.http.HttpServletResponse;</code>

<code>import</code> <code>com.kongzhong.base.util.KzStringUtil;</code>

<code>public</code> <code>class</code> <code>XSSCheckFilter </code><code>implements</code> <code>Filter {</code>

<code>    </code><code>private</code> <code>FilterConfig config;</code>

<code>    </code><code>private</code> <code>static</code> <code>String errorPath;</code><code>//出錯跳轉的目的地</code>

<code>    </code><code>private</code> <code>static</code> <code>String[] excludePaths;</code><code>//不進行攔截的url</code>

<code>    </code><code>private</code> <code>static</code> <code>String[] safeless = {</code><code>"&lt;script"</code><code>,   </code><code>//需要攔截的JS字元關鍵字</code>

<code>             </code><code>"&lt;/script"</code><code>,</code>

<code>             </code><code>"&lt;iframe"</code><code>,</code>

<code>             </code><code>"&lt;/iframe"</code><code>,</code>

<code>             </code><code>"&lt;frame"</code><code>,</code>

<code>             </code><code>"&lt;/frame"</code><code>,</code>

<code>             </code><code>"set-cookie"</code><code>,</code>

<code>             </code><code>"%3cscript"</code><code>,</code>

<code>             </code><code>"%3c/script"</code><code>,</code>

<code>             </code><code>"%3ciframe"</code><code>,</code>

<code>             </code><code>"%3c/iframe"</code><code>,</code>

<code>             </code><code>"%3cframe"</code><code>,</code>

<code>             </code><code>"%3c/frame"</code><code>,</code>

<code>             </code><code>"src=\"javascript:"</code><code>,</code>

<code>             </code><code>"&lt;body"</code><code>,</code>

<code>             </code><code>"&lt;/body"</code><code>,</code>

<code>             </code><code>"%3cbody"</code><code>,</code>

<code>             </code><code>"%3c/body"</code><code>,</code>

<code>             </code><code>//"&lt;",</code>

<code>             </code><code>//"&gt;",</code>

<code>             </code><code>//"&lt;/",</code>

<code>             </code><code>//"/&gt;",</code>

<code>             </code><code>//"%3c",</code>

<code>             </code><code>//"%3e",</code>

<code>             </code><code>//"%3c/",</code>

<code>             </code><code>//"/%3e"</code>

<code>            </code><code>};</code>

<code>    </code><code>public</code> <code>void</code> <code>doFilter(ServletRequest req, ServletResponse resp,</code>

<code>            </code><code>FilterChain filterChain) </code><code>throws</code> <code>IOException, ServletException {   </code>

<code>        </code><code>Enumeration params = req.getParameterNames();</code>

<code>        </code><code>HttpServletRequest request = (HttpServletRequest) req;</code>

<code>        </code><code>HttpServletResponse response = (HttpServletResponse) resp;</code>

<code>        </code><code>//String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/";</code>

<code>               </code> 

<code>        </code><code>boolean</code> <code>isSafe = </code><code>true</code><code>;</code>

<code>        </code><code>String requestUrl = request.getRequestURI();</code>

<code>        </code><code>//String queryUrl = request.getQueryString();</code>

<code>        </code><code>//System.out.println("params:" + params + " , requestUrl:" + requestUrl + " , queryUrl" + queryUrl);</code>

<code>        </code><code>if</code><code>(isSafe(requestUrl)) {</code>

<code>            </code><code>requestUrl = requestUrl.substring(requestUrl.indexOf(</code><code>"/"</code><code>));</code>

<code>            </code><code>if</code><code>(!excludeUrl(requestUrl)) {</code>

<code>                </code><code>while</code> <code>(params.hasMoreElements()) {</code>

<code>                    </code><code>String cache = req.getParameter((String) params.nextElement());</code>

<code>                    </code><code>if</code><code>(KzStringUtil.isNotBlank(cache)) {</code>

<code>                        </code><code>if</code><code>(!isSafe(cache)) {</code>

<code>                            </code><code>isSafe = </code><code>false</code><code>;</code>

<code>                            </code><code>break</code><code>;</code>

<code>                        </code><code>}</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>        </code><code>} </code><code>else</code> <code>{</code>

<code>            </code><code>isSafe = </code><code>false</code><code>;</code>

<code>        </code><code>}</code>

<code>        </code><code>if</code><code>(!isSafe) {</code>

<code>            </code><code>request.setAttribute(</code><code>"err"</code><code>, </code><code>"您輸入的參數有非法字元,請輸入正确的參數!"</code><code>);</code>

<code>            </code><code>request.getRequestDispatcher(errorPath).forward(request, response);</code>

<code>            </code><code>return</code><code>;</code>

<code>        </code><code>filterChain.doFilter(req, resp);</code>

<code>    </code><code>}</code>

<code>    </code><code>private</code> <code>static</code> <code>boolean</code> <code>isSafe(String str) {</code>

<code>        </code><code>if</code><code>(KzStringUtil.isNotBlank(str)) {    </code>

<code>            </code><code>for</code> <code>(String s : safeless) {</code>

<code>                </code><code>if</code><code>(str.toLowerCase().contains(s)) {</code>

<code>                    </code><code>return</code> <code>false</code><code>;</code>

<code>        </code><code>return</code> <code>true</code><code>;</code>

<code>           </code> 

<code>    </code><code>private</code> <code>boolean</code> <code>excludeUrl(String url) {      </code>

<code>        </code><code>if</code><code>(excludePaths != </code><code>null</code> <code>&amp;&amp; excludePaths.length &gt; </code><code>0</code><code>) {                  </code>

<code>            </code><code>for</code> <code>(String path : excludePaths) {</code>

<code>                </code><code>if</code><code>(url.toLowerCase().equals(path)) {</code>

<code>                    </code><code>return</code> <code>true</code><code>;</code>

<code>        </code><code>return</code> <code>false</code><code>;</code>

<code>    </code><code>public</code> <code>void</code> <code>destroy() {</code>

<code>    </code><code>public</code> <code>void</code> <code>init(FilterConfig config) </code><code>throws</code> <code>ServletException {</code>

<code>        </code><code>this</code><code>.config = config;</code>

<code>        </code><code>errorPath = config.getInitParameter(</code><code>"errorPath"</code><code>);</code>

<code>        </code><code>String excludePath = config.getInitParameter(</code><code>"excludePaths"</code><code>);</code>

<code>        </code><code>if</code><code>(KzStringUtil.isNotBlank(excludePath)) {</code>

<code>            </code><code>excludePaths = excludePath.split(</code><code>","</code><code>);</code>

<code>}</code>

<a href="https://github.com/finn-no/xss-html-filter" target="_blank">https://github.com/finn-no/xss-html-filter</a>

     本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1232119,如需轉載請自行聯系原作者

繼續閱讀