首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

防护XSS攻击

2013-12-26 
防范XSS攻击?方法一、过滤特殊字符如script、img、iframe……示例代码:import java.io.IOExceptionimpor

防范XSS攻击

?

方法一、过滤特殊字符

如<script>、<img>、<iframe>……

示例代码:

import java.io.IOException;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.regex.Pattern;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;/** * 防止XSS(Cross Site Script)攻击的Filter *  *  */public class XSSDefendFilter implements Filter {public  static List<String> arrTagList = new ArrayList<String>();// public static boolean filterSwitch =// com.travelsky.caair.common.Para.xssFilterB2C;public XSSDefendFilter() {super();if (arrTagList.size() == 0) {// 过滤敏感HTML TAGarrTagList.add("<script");arrTagList.add("<embed");arrTagList.add("<style");arrTagList.add("<frame");arrTagList.add("<object");arrTagList.add("<iframe");arrTagList.add("<frameset");arrTagList.add("<meta");arrTagList.add("<xml");arrTagList.add("<applet");arrTagList.add("<link");arrTagList.add("onload");arrTagList.add("<img");arrTagList.add("<a");arrTagList.add("onmouse");arrTagList.add("onblur");arrTagList.add("onchange");arrTagList.add("onclick");arrTagList.add("ondblclick");arrTagList.add("onkey");arrTagList.add("onfocus");arrTagList.add("onselect");}}public void init(FilterConfig cfg) throws ServletException {// TODO Auto-generated method stub}@SuppressWarnings("unchecked")public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubboolean flag = false;Enumeration en = request.getParameterNames();String prtName = "-";String prtValue = "-";while (en.hasMoreElements()) {prtName = (String) en.nextElement();prtValue = request.getParameter(prtName);if (prtValue != null) {if (judgeTagByRegular(prtValue.toLowerCase())) {System.out.println("ERROR Filter:" + prtName + "="+ prtValue);flag = true;break;}}}if (!flag) {chain.doFilter(request, response);} else {// Error Process,如果有错误,大家自己定向到一个位置System.out.println("ERROR Filter:"+ ((HttpServletRequest) request).getRequestURI());((javax.servlet.http.HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath()+ "/index.jsp");}}/** * 对arrTagList 的tag 用正则表达式封装 *  * @param obj * @return */private boolean judgeTagByRegular(String obj){Pattern pattern = Pattern.compile("(.*\\s*)((<\\s*script\\s*)|(<\\s*embed\\s*)|(<\\s*style\\s*)|(<\\s*img\\s*)|(<\\s*image\\s*)|(<\\s*frame\\s*)|(<\\s*object\\s*)|(<\\s*iframe\\s*)|(<\\s*a\\s*)|(<\\s*frameset\\s*)|(<\\s*meta\\s*)|(<\\s*xml\\s*)|(<\\s*applet\\s*)|(\\s*onmouse\\s*)|(<\\s*link\\s*)|(\\s*onload\\s*)|(\\s*onblur\\s*)|(\\s*onchange\\s*)|(\\s*onclick\\s*)|(\\s*ondblclick\\s*)|(\\s*onfocus\\s*)|(\\s*onkey\\s*)|(\\s*onselect\\s*)|(\\s*alert\\s*\\())(.*\\s*)",Pattern.CASE_INSENSITIVE);return pattern.matcher(obj).matches();}@SuppressWarnings("unused")private boolean judgeHasTag(String obj) {for (int i = 0; i < arrTagList.size(); i++) {String tt = arrTagList.get(i).toString();if (obj.indexOf(tt) >= 0) {return true;}}return false;}/* * (non-Java-doc) *  * @see javax.servlet.Filter#destroy() */public void destroy() {// TODO Auto-generated method stub}}

? 此方法有一定局限性,有很多可以绕过的方式:

<scRIpt><scr%00ript><scr\nript>eval('<scr'+'ipt>')< script >...

?

方法二:还可以使用HTML和URL编码来避免问题。

? ?可以使用apache-lang包中的提供的方法,如下:

System.out.println(StringEscapeUtils.escapeHtml("<iframe src='http://www.baidu.com'/>"));System.out.println(StringEscapeUtils.escapeHtml("<script>alert('ok');</script>"));

? ? 使用以上方法会得到下面的结果:

&lt;iframe src='http://www.baidu.com'/&gt;&lt;script&gt;alert('ok');&lt;/script&gt;

?

? ? 这样经过html转义就可以防止html元素代码执行。方式XSS攻击。

热点排行