云联一号 1 неделя назад
Родитель
Сommit
e07f5700ea

+ 10 - 0
fs-admin-saas/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.sql.SqlUtil;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.RedPacketMoneyVO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
@@ -593,6 +594,11 @@ public class LiveTask {
                 });
 
         tablesToCheck.forEach(dto -> {
+            // 校验SQL标识符安全
+            SqlUtil.validateIdentifier(dto.getTableName());
+            SqlUtil.validateIdentifier(dto.getUserColumn());
+            SqlUtil.validateIdentifier(dto.getPhoneColumn());
+            SqlUtil.validateIdentifier(dto.getDateColumn());
             //获取证件失效日期字段小于当前时间加提前天数的用户和电话号码
             String sql = String.format("SELECT %s , %s " +
                             "FROM %s " +
@@ -634,6 +640,10 @@ public class LiveTask {
                         .build());
 
         toDisable.forEach(dto -> {
+            // 校验SQL标识符安全
+            SqlUtil.validateIdentifier(dto.getTableName());
+            SqlUtil.validateIdentifier(dto.getDateColumn());
+            SqlUtil.validateIdentifier(dto.getStatusColumn());
             //更新证件失效日期字段小于当前时间的数据
             String sql = String.format("UPDATE %s " +
                             "SET %s = %s " +

+ 10 - 0
fs-admin-saas/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.sql.SqlUtil;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.RedPacketMoneyVO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
@@ -637,6 +638,11 @@ public class MallStoreTask
                 });
 
         tablesToCheck.forEach(dto -> {
+            // 校验SQL标识符安全
+            SqlUtil.validateIdentifier(dto.getTableName());
+            SqlUtil.validateIdentifier(dto.getUserColumn());
+            SqlUtil.validateIdentifier(dto.getPhoneColumn());
+            SqlUtil.validateIdentifier(dto.getDateColumn());
             //获取证件失效日期字段小于当前时间加提前天数的用户和电话号码
             String sql = String.format("SELECT %s , %s " +
                             "FROM %s " +
@@ -679,6 +685,10 @@ public class MallStoreTask
                                 .build());
 
         toDisable.forEach(dto -> {
+            // 校验SQL标识符安全
+            SqlUtil.validateIdentifier(dto.getTableName());
+            SqlUtil.validateIdentifier(dto.getDateColumn());
+            SqlUtil.validateIdentifier(dto.getStatusColumn());
             //更新证件失效日期字段小于当前时间的数据
             String sql = String.format("UPDATE %s " +
                     "SET %s = %s " +

+ 34 - 2
fs-common/src/main/java/com/fs/common/utils/sql/SqlUtil.java

@@ -5,8 +5,7 @@ import com.fs.common.utils.StringUtils;
 
 /**
  * sql操作工具类
- * 
-
+ *
  */
 public class SqlUtil
 {
@@ -15,6 +14,11 @@ public class SqlUtil
      */
     public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
 
+    /**
+     * SQL标识符模式:仅允许字母、数字、下划线(表名、列名)
+     */
+    public static String SQL_IDENTIFIER_PATTERN = "[a-zA-Z0-9_]+";
+
     /**
      * 检查字符,防止注入绕过
      */
@@ -34,4 +38,32 @@ public class SqlUtil
     {
         return value.matches(SQL_PATTERN);
     }
+
+    /**
+     * 验证SQL标识符(表名、列名)是否安全,仅允许字母、数字、下划线
+     * @param identifier SQL标识符
+     * @return 是否安全
+     */
+    public static boolean isValidIdentifier(String identifier)
+    {
+        if (StringUtils.isEmpty(identifier))
+        {
+            return false;
+        }
+        return identifier.matches(SQL_IDENTIFIER_PATTERN);
+    }
+
+    /**
+     * 校验SQL标识符,不安全则抛异常
+     * @param identifier SQL标识符
+     * @return 校验通过的标识符
+     */
+    public static String validateIdentifier(String identifier)
+    {
+        if (!isValidIdentifier(identifier))
+        {
+            throw new UtilException("SQL标识符不合法: " + identifier);
+        }
+        return identifier;
+    }
 }