排序过滤优化,只允许特定字符。
This commit is contained in:
@@ -31,8 +31,9 @@ import com.jeesite.common.lang.StringUtils;
|
|||||||
* 2.自制的base62 编码
|
* 2.自制的base62 编码
|
||||||
* 3.Commons-Lang的xml/html escape
|
* 3.Commons-Lang的xml/html escape
|
||||||
* 4.JDK提供的URLEncoder
|
* 4.JDK提供的URLEncoder
|
||||||
* @author calvin
|
* 5、XSS、SQL、orderBy 过滤器
|
||||||
* @version 2013-01-15
|
* @author calvin、ThinkGem
|
||||||
|
* @version 2022-2-17
|
||||||
*/
|
*/
|
||||||
public class EncodeUtils {
|
public class EncodeUtils {
|
||||||
|
|
||||||
@@ -270,7 +271,7 @@ public class EncodeUtils {
|
|||||||
}
|
}
|
||||||
if (logger.isInfoEnabled() && !value.equals(oriValue)){
|
if (logger.isInfoEnabled() && !value.equals(oriValue)){
|
||||||
logger.info("xssFilter: {} <=<=<= {} source: {}", value, text,
|
logger.info("xssFilter: {} <=<=<= {} source: {}", value, text,
|
||||||
request != null ? request.getRequestURL() : StringUtils.EMPTY);
|
request != null ? request.getRequestURL() : "common");
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -279,16 +280,18 @@ public class EncodeUtils {
|
|||||||
|
|
||||||
// 预编译SQL过滤正则表达式
|
// 预编译SQL过滤正则表达式
|
||||||
private static Pattern sqlPattern = Pattern.compile(
|
private static Pattern sqlPattern = Pattern.compile(
|
||||||
"(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|((extractvalue|updatexml|if|mid|database)([\\s]*?)\\()|"
|
"(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|((extractvalue|updatexml|if|mid|database|rand|user)([\\s]*?)\\()|"
|
||||||
+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|case when|sleep|union|load_file)\\b)",
|
+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|"
|
||||||
|
+ "drop|execute|case when|sleep|union|load_file)\\b)",
|
||||||
Pattern.CASE_INSENSITIVE);
|
Pattern.CASE_INSENSITIVE);
|
||||||
|
private static Pattern orderByPattern = Pattern.compile("[a-z0-9_\\.\\, ]*", Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SQL过滤,防止注入,传入参数输入有select相关代码,替换空。
|
* SQL过滤,防止注入,传入参数输入有select相关代码,替换空。
|
||||||
* @author ThinkGem
|
* @author ThinkGem
|
||||||
*/
|
*/
|
||||||
public static String sqlFilter(String text){
|
public static String sqlFilter(String text){
|
||||||
return sqlFilter(text, null);
|
return sqlFilter(text, "common");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* SQL过滤,防止注入,传入参数输入有select相关代码,替换空。
|
* SQL过滤,防止注入,传入参数输入有select相关代码,替换空。
|
||||||
@@ -297,10 +300,17 @@ public class EncodeUtils {
|
|||||||
public static String sqlFilter(String text, String source){
|
public static String sqlFilter(String text, String source){
|
||||||
if (text != null){
|
if (text != null){
|
||||||
String value = text;
|
String value = text;
|
||||||
|
if ("orderBy".equals(source)) {
|
||||||
|
Matcher matcher = orderByPattern.matcher(value);
|
||||||
|
if (!matcher.matches()) {
|
||||||
|
value = StringUtils.EMPTY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
Matcher matcher = sqlPattern.matcher(value);
|
Matcher matcher = sqlPattern.matcher(value);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
value = matcher.replaceAll(StringUtils.EMPTY);
|
value = matcher.replaceAll(StringUtils.EMPTY);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (logger.isWarnEnabled() && !value.equals(text)){
|
if (logger.isWarnEnabled() && !value.equals(text)){
|
||||||
logger.info("sqlFilter: {} <=<=<= {} source: {}", value, text, source);
|
logger.info("sqlFilter: {} <=<=<= {} source: {}", value, text, source);
|
||||||
return StringUtils.EMPTY;
|
return StringUtils.EMPTY;
|
||||||
@@ -310,38 +320,38 @@ public class EncodeUtils {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
// public static void main(String[] args) {
|
||||||
int i = 0;
|
// xssFilter("1 你好 <script>alert(document.cookie)</script>我还在。");
|
||||||
// xssFilter((++i)+"你好,<script>alert(document.cookie)</script>我还在。");
|
// xssFilter("2 你好 <strong>加粗文字</strong>我还在。");
|
||||||
// xssFilter((++i)+"你好,<strong>加粗文字</strong>我还在。");
|
// xssFilter("<!--HTML-->3 你好 \"><strong>加粗文字</strong>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,\"><strong>加粗文字</strong>我还在。");
|
// xssFilter("<!--HTML-->4 你好 <iframe src=\"abcdef\"></iframe><strong>加粗文字</strong>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<iframe src=\"abcdef\"></iframe><strong>加粗文字</strong>我还在。");
|
// xssFilter("<!--HTML-->5 你好 <iframe src=\"abcdef\"/><strong>加粗文字</strong>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<iframe src=\"abcdef\"/><strong>加粗文字</strong>我还在。");
|
// xssFilter("<!--HTML-->6 你好 <iframe src=\"abcdef\"><strong>加粗文字</strong>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<iframe src=\"abcdef\"><strong>加粗文字</strong>我还在。");
|
// xssFilter("<!--HTML-->7 你好 <script type=\"text/javascript\">alert(document.cookie)</script>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script type=\"text/javascript\">alert(document.cookie)</script>我还在。");
|
// xssFilter("<!--HTML-->8 你好 <script\n type=\"text/javascript\">\nalert(document.cookie)\n</script>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script\n type=\"text/javascript\">\nalert(document.cookie)\n</script>我还在。");
|
// xssFilter("<!--HTML-->9 你好 <script src='' onerror='alert(document.cookie)'></script>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script src='' onerror='alert(document.cookie)'></script>我还在。");
|
// xssFilter("<!--HTML-->10 你好 <script type=text/javascript>alert()我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script type=text/javascript>alert()我还在。");
|
// xssFilter("<!--HTML-->11 你好 <script>alert(document.cookie)</script>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script>alert(document.cookie)</script>我还在。");
|
// xssFilter("<!--HTML-->12 你好 <script>window.location='url'我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<script>window.location='url'我还在。");
|
// xssFilter("<!--HTML-->13 你好 </script></iframe>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,</script></iframe>我还在。");
|
// xssFilter("<!--HTML-->14 你好 eval(abc)我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,eval(abc)我还在。");
|
// xssFilter("<!--HTML-->15 你好 xpression(abc)我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,xpression(abc)我还在。");
|
// xssFilter("<!--HTML-->16 你好 <img src='abc.jpg' onerror='location='';alert(document.cookie);'></img>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<img src='abc.jpg' onerror='location='';alert(document.cookie);'></img>我还在。");
|
// xssFilter("<!--HTML-->17 你好 <img src='abc.jpg' onerror='alert(document.cookie);'/>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<img src='abc.jpg' onerror='alert(document.cookie);'/>我还在。");
|
// xssFilter("<!--HTML-->18 你好 <img src='abc.jpg' onerror='alert(document.cookie);'>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<img src='abc.jpg' onerror='alert(document.cookie);'>我还在。");
|
// xssFilter("<!--HTML-->19 你好 <a onload='alert(\"abc\")'>hello</a>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<a onload='alert(\"abc\")'>hello</a>我还在。");
|
// xssFilter("<!--HTML-->20 你好 <a href=\"/abc\">hello</a>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<a href=\"/abc\">hello</a>我还在。");
|
// xssFilter("<!--HTML-->21 你好 <a href='/abc'>hello</a>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<a href='/abc'>hello</a>我还在。");
|
// xssFilter("<!--HTML-->22 你好 <a href='vbscript:alert(\"abc\");'>hello</a>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<a href='vbscript:alert(\"abc\");'>hello</a>我还在。");
|
// xssFilter("<!--HTML-->23 你好 <a href='javascript:alert(\"abc\");'>hello</a>我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,<a href='javascript:alert(\"abc\");'>hello</a>我还在。");
|
// xssFilter("<!--HTML-->24 你好 ?abc=def&hello=123&world={\"a\":1}我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,?abc=def&hello=123&world={\"a\":1}我还在。");
|
// xssFilter("<!--HTML-->25 你好 ?abc=def&hello=123&world={'a':1}我还在。");
|
||||||
// xssFilter("<!--HTML-->"+(++i)+"你好,?abc=def&hello=123&world={'a':1}我还在。");
|
// sqlFilter("1 你好 select * from xxx where abc=def and 1=1我还在。");
|
||||||
sqlFilter((++i)+"你好,select * from xxx where abc=def and 1=1我还在。");
|
// sqlFilter("2 你好 insert into xxx values(1,2,3,4,5)我还在。");
|
||||||
sqlFilter((++i)+"你好,insert into xxx values(1,2,3,4,5)我还在。");
|
// sqlFilter("3 你好 delete from xxx我还在。");
|
||||||
sqlFilter((++i)+"你好,delete from xxx我还在。");
|
// sqlFilter("4 a.audit_result asc,case when 1 like case when length(database())=6 then 1 else exp(111) end then 1 else 1/0 end", "orderBy");
|
||||||
sqlFilter((++i)+"你好,a.audit_result asc,case when 1 like case when length(database())=6 then 1 else exp(11111111111111111) end then 1 else 1/0 end");
|
// sqlFilter("5 if(1=2,1,SLEEP(10)), if(mid(database(),{},1)=\\\"{}\\\",a.id,a.login_name)", "orderBy");
|
||||||
sqlFilter((++i)+"你好,if(1=2,1,SLEEP(10))");
|
// sqlFilter("6 a.audit_result asc, b.audit_result2 desc, b.AuditResult3 desc", "orderBy");
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user