Explorar o código

合并过滤sql注入正则字符串

Signed-off-by: 冻冰 <86124@qq.com>
冻冰 %!s(int64=2) %!d(string=hai) anos
pai
achega
5ca9ccc300

+ 3 - 14
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/StringUtils.java

@@ -59,15 +59,9 @@ public final class StringUtils {
     /**
      * 字符串去除空白内容
      *
-     * <ul> <li>\n 回车</li> <li>\t 水平制表符</li> <li>\s 空格</li> <li>\r 换行</li> </ul>
+     * <ul> <li>'"<>&*+=#-; sql注入黑名单</li> <li>\n 回车</li> <li>\t 水平制表符</li> <li>\s 空格</li> <li>\r 换行</li> </ul>
      */
-    private static final Pattern REPLACE_BLANK = Pattern.compile("\\s*|\t|\r|\n");
-
-    /**
-     * sql注入黑名单关键词
-     * '"<>&*+=#-;
-     */
-    private static final Pattern SQL_INJECTION_BLACK = Pattern.compile("'|\"|\\<|\\>|&|\\*|\\+|=|#|-|;") ;
+    private static final Pattern REPLACE_BLANK = Pattern.compile("'|\"|\\<|\\>|&|\\*|\\+|=|#|-|;|\\s*|\t|\r|\n");
 
     /**
      * 判断字符串中是否全是空白字符
@@ -600,16 +594,11 @@ public final class StringUtils {
     public static String sqlInjectionReplaceBlank(String str) {
         if (SqlInjectionUtils.check(str)) {
             /**
-             * 1,一次过滤过滤空白字符,存在 SQL 注入,去除空白内容
+             * 过滤sql黑名单字符,存在 SQL 注入,去除空白内容
              */
             Matcher matcher = REPLACE_BLANK.matcher(str);
             str = matcher.replaceAll("");
 
-            /**
-             * 2,二次过滤,过滤sql黑名单字符,存在 SQL 注入,去除空白内容
-             */
-            matcher = SQL_INJECTION_BLACK.matcher(str);
-            str = matcher.replaceAll("");
         }
         return str;
     }

+ 6 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/StringUtilsTest.java

@@ -22,10 +22,15 @@ class StringUtilsTest {
     }
 
     @Test
-    void sqlInjectionBlack(){
+    void sqlInjectionBlackTest(){
         String originalStr = "(select*from(select sleep(if(length(database())=13,3,0))union/**/select+1)a)" ;
         Assert.isTrue("(selectfrom(selectsleep(if(length(database())13,3,0))union//select1)a)"
             .equals(StringUtils.sqlInjectionReplaceBlank(originalStr)),"error");
     }
 
+    @Test
+    void sqlInjectionBlackCharTest(){
+        Assert.isTrue("".equals(StringUtils.sqlInjectionReplaceBlank("'\"<>&*+=#-;    \n\t")),"error");
+    }
+
 }