Index: forgon-core/src/main/java/com/forgon/xss/util/XSSFilterUtil.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/xss/util/XSSFilterUtil.java (revision 0) +++ forgon-core/src/main/java/com/forgon/xss/util/XSSFilterUtil.java (revision 26897) @@ -0,0 +1,143 @@ +package com.forgon.xss.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; + +/** + * xss工具类 + * @author forgon + * @since 2019-08-28 + */ +public class XSSFilterUtil { + private static List patterns = null; + + private static List getXSSPatternList() { + List ret = new ArrayList(); + + ret.add(new Object[] { "<(no)?script[^>]*>.*?", + Pattern.CASE_INSENSITIVE }); + ret.add(new Object[] { "eval\\((.*?)\\)", + Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL }); + ret.add(new Object[] { "expression\\((.*?)\\)", + Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL }); + ret.add(new Object[] { "(javascript:|vbscript:|view-source:)*", + Pattern.CASE_INSENSITIVE }); + ret.add(new Object[] { "<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>", + Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL }); + ret.add(new Object[] { + "(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\(.*?\\)|window\\.open\\()*", + Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL }); + ret.add(new Object[] { + "<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|οnerrοr=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+", + Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL }); + return ret; + } + + private static List getPatterns() { + + if (patterns == null) { + + List list = new ArrayList(); + + String regex = null; + Integer flag = null; + int arrLength = 0; + + for (Object[] arr : getXSSPatternList()) { + arrLength = arr.length; + for (int i = 0; i < arrLength; i++) { + regex = (String) arr[0]; + flag = (Integer) arr[1]; + list.add(Pattern.compile(regex, flag)); + } + } + + patterns = list; + } + + return patterns; + } + + public static String stripXSS(String value) { + + if (null == value) { + return value; + } + if (StringUtils.isNotBlank(value)) { + + Matcher matcher = null; + + for (Pattern pattern : getPatterns()) { + matcher = pattern.matcher(value); + // 匹配 + if (matcher.find()) { + // 删除相关字符串 + value = matcher.replaceAll(""); + } + } + //value = StringFilter.StringFilter(value); + } + // 预防SQL盲注 + String[] pattern = { "%", "select", "insert", "delete", "from", + "count\\(", "drop table", "update", "truncate", "asc\\(", + "mid\\(", "char\\(", "xp_cmdshell", "exec", "master", + "netlocalgroup administrators", "net user", "or", "and" }; + for (int i = 0; i < pattern.length; i++) { + value = value.replace(pattern[i].toString(), ""); + } + return value; + } + + public static void main(String[] args) { + + String value = null; + value = XSSFilterUtil + .stripXSS("
select ***//||&;/*-+ <>$###@%$#@$%^#$^%$&^(&*)*\\''count or %% ..... ,,,, "); + System.out.println("type-1: '" + value + "'"); + + value = XSSFilterUtil + .stripXSS(""); + System.out.println("type-2: '" + value + "'"); + + value = XSSFilterUtil.stripXSS(""); + System.out.println("type-3: '" + value + "'"); + + value = XSSFilterUtil.stripXSS(" eval(abc);"); + System.out.println("type-4: '" + value + "'"); + + value = XSSFilterUtil.stripXSS(" expression(abc);"); + System.out.println("type-5: '" + value + "'"); + + value = XSSFilterUtil + .stripXSS(""); + System.out.println("type-6: '" + value + "'"); + + value = XSSFilterUtil + .stripXSS(""); + System.out.println("type-7: '" + value + "'"); + + value = XSSFilterUtil + .stripXSS(""); + System.out.println("type-8: '" + value + "'"); + + value = XSSFilterUtil + .stripXSS("