|
@@ -8,6 +8,7 @@ import java.util.Arrays;
|
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -77,4 +78,112 @@ public class StrUtils {
|
|
|
.collect(Collectors.joining("\n"));
|
|
.collect(Collectors.joining("\n"));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param value
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public static String stripXSS(String value) {
|
|
|
|
|
+ if (value != null) {
|
|
|
|
|
+ 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 οnlοad= 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;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static 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
|
|
|
|
|
+ */
|
|
|
|
|
+ public static String xssEncode(String s) {
|
|
|
|
|
+ if (s == null || s.isEmpty()) {
|
|
|
|
|
+ return s;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String result = stripXSS(s);
|
|
|
|
|
+ if (null != result) {
|
|
|
|
|
+ result = escape(result);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|