| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
- package com.key.common.plugs.xss;
- import com.blogspot.radialmind.html.HTMLParser;
- import com.blogspot.radialmind.xss.XSSFilter;
- import com.itextpdf.text.log.SysoCounter;
- import java.io.StringReader;
- import java.io.StringWriter;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.regex.Pattern;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- /**
- * XSS保护
- *
- * @author storezhang
- */
- public class XssHttpWrapper extends HttpServletRequestWrapper {
- private HttpServletRequest orgRequest;
- public XssHttpWrapper(HttpServletRequest request) {
- super(request);
- orgRequest = request;
- }
- /**
- * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
- * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
- * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
- */
- @Override
- public String getParameter(String name) {
- String value = super.getParameter(xssEncode(name));
- if (value != null) {
- value = xssEncode(value);
- }
- return value;
- }
- /**
- * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
- * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> getHeaderNames 也可能需要覆盖
- */
- @Override
- public String getHeader(String name) {
- String value = super.getHeader(xssEncode(name));
- if (value != null) {
- value = xssEncode(value);
- }
- return value;
- }
-
-
- /**
- *
- * @param name
- * @return
- */
- public String[] getParameterValues(String name) {
- String[] values = super.getParameterValues(name);
- if (values != null) {
- for (int i = 0; i < values.length; i++) {
- values[i] = xssEncode(values[i]);
- }
- }
- return values;
- }
- /**
- * @return
- */
- /*public Map getParameterMap() {
- HashMap paramMap = (HashMap) super.getParameterMap();
- paramMap = (HashMap) paramMap.clone();
- for (Iterator iterator = paramMap.entrySet().iterator(); iterator.hasNext(); ) {
- Map.Entry entry = (Map.Entry) iterator.next();
- String[] values = (String[]) entry.getValue();
- for (int i = 0; i < values.length; i++) {
- if(values[i] instanceof String){
- values[i] = xssEncode((String)values[i]);
- }
- }
- entry.setValue(values);
- }
- return paramMap;
- }*/
- /**
- * 从request中获得参数Map,并返回可读的Map
- *
- * @param request
- * @return
- */
- public Map<String, String[]> getParameterMap(HttpServletRequest request) {
- // 参数Map
- Map<String, String[]> properties = request.getParameterMap();
- Map<String,String[]> returnMap = new HashMap();
- Iterator entries = properties.entrySet().iterator();
- Map.Entry entry;
- String name = "";
- String[] value ;
- while (entries.hasNext()) {
- entry = (Map.Entry) entries.next();
- name = (String) entry.getKey();
- Object valueObj = entry.getValue();
- if(null == valueObj){
- value = new String[]{};
- }else if(valueObj instanceof String[]){
- value = (String[])valueObj;
- }else{
- value = new String[]{valueObj.toString()};
- }
- returnMap.put(name, value);
- }
- return returnMap;
- }
- /**
- * 获取最原始的request
- *
- * @return
- */
- public HttpServletRequest getOrgRequest() {
- return orgRequest;
- }
- /**
- * 获取最原始的request的静态方法
- *
- * @return
- */
- public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
- if (req instanceof XssHttpWrapper) {
- return ((XssHttpWrapper) req).getOrgRequest();
- }
- return req;
- }
- public String escape(String s)
- {
- StringBuilder sb = new StringBuilder(s.length() + 16);
- for (int i = 0; i < s.length(); i++)
- {
- char c = s.charAt(i);
- switch (c)
- {
- case '>':
- sb.append('>');// 全角大于号
- break;
- case '<':
- sb.append('<');// 全角小于号
- break;
- case '\'':
- sb.append('‘');// 全角单引号
- break;
- case '\"':
- sb.append('“');// 全角双引号
- break;
- case '\\':
- sb.append('\');// 全角斜线
- break;
- case '%':
- sb.append('%'); // 全角冒号
- break;
- default:
- sb.append(c);
- break;
- }
- }
- return sb.toString();
- }
- /**
- * 将容易引起xss漏洞的半角字符直接替换成全角字符
- *
- * @param s
- * @return
- */
- private static String xssEncode(String s) {
- if (s == null || s.isEmpty()) {
- return s;
- }
- StringReader reader = new StringReader(s);
- StringWriter writer = new StringWriter();
- try {
- HTMLParser.process(reader, writer, new XSSFilter(), true);
- return writer.toString();
- } catch (NullPointerException e) {
- return s;
- } catch (Exception ex) {
- ex.printStackTrace(System.out);
- }
- return null;
- }
- /**
- * 将容易引起xss漏洞的半角字符直接替换成全角字符
- *
- * @param s
- * @return
- */
- /* public String xssEncode(String s)
- {
- if (s == null || s.isEmpty())
- {
- return s;
- }
- String result = stripXSS(s);
- if (null != result)
- {
- result = escape(result);
- }
- return result;
- }*/
- /**
- * 插件之所以报 mismatched tree node: EOF expecting错误是因为其对注入的脚本格式有校验
- * @param
- * @return
- */
- /*private String stripXSS(String value)
- {
- if (value != null)
- {
- // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to
- // avoid encoded attacks.
- // value = ESAPI.encoder().canonicalize(value);
- // Avoid null characters
- value = value.replaceAll("", "");
- // Avoid anything between script tags
- Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid anything in a src='...' type of expression
- scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- // Remove any lonesome </script> tag
- scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- // Remove any lonesome <script ...> tag
- scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid eval(...) expressions
- scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid expression(...) expressions
- scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid javascript:... expressions
- scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid vbscript:... expressions
- scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- // Avoid onload= expressions
- scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- scriptPattern = Pattern.compile("<iframe>(.*?)</iframe>", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- scriptPattern = Pattern.compile("</iframe>", Pattern.CASE_INSENSITIVE);
- value = scriptPattern.matcher(value).replaceAll("");
- // Remove any lonesome <script ...> tag
- scriptPattern = Pattern.compile("<iframe(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
- value = scriptPattern.matcher(value).replaceAll("");
- }
- return value;
- }*/
- }
|