Explorar o código

Merge branch 'fyc-vpp' of uskycloud/usky-modules into feature/service-vpp-20260701

fuyuchuan hai 15 horas
pai
achega
80b343a387

+ 13 - 10
service-vpp/service-vpp-biz/src/main/java/com/usky/vpp/util/VppFieldValidator.java

@@ -33,6 +33,9 @@ public final class VppFieldValidator {
 
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
+    /** JSON 字符串最大长度:64KB,防止大 JSON DoS 攻击 */
+    private static final int JSON_MAX_LENGTH = 65536;
+
     private VppFieldValidator() {
         // 工具类禁止实例化
     }
@@ -60,27 +63,27 @@ public final class VppFieldValidator {
     /**
      * 校验 JSON 格式字符串的合法性:
      * <ul>
-     *   <li>null:视为合法,字段允许为空</li>
-     *   <li>空字符串:不允许,抛出异常</li>
-     *   <li>非空时:必须能解析为合法的 JSON 对象或数组</li>
+     *   <li>null 或空字符串:视为合法,返回 null</li>
+     *   <li>非空时:长度 ≤ 64KB,且必须为合法的 JSON 对象({...})</li>
+     *   <li>数组([...])、原始值(字符串/数字/布尔/null)均不通过</li>
      * </ul>
      *
      * @param json      待校验的 JSON 字符串
      * @param fieldName 字段名称(用于错误提示)
-     * @return 规范化后的值:null → null;合法 JSON → 原值
-     * @throws BusinessException 空字符串或 JSON 格式不合法时抛出
+     * @return 规范化后的值:null → null;合法 JSON 对象 → 原值
+     * @throws BusinessException 超出长度限制或 JSON 格式不合法时抛出
      */
     public static String validateJson(String json, String fieldName) {
-        if (json == null) {
+        if (json == null || json.trim().isEmpty()) {
             return null;
         }
-        if (json.trim().isEmpty()) {
-            throw new BusinessException(fieldName + "不能为空字符串!");
+        if (json.length() > JSON_MAX_LENGTH) {
+            throw new BusinessException(fieldName + "内容过大,最大支持64KB!");
         }
         try {
             JsonNode node = OBJECT_MAPPER.readTree(json);
-            if (!node.isObject() && !node.isArray()) {
-                throw new BusinessException(fieldName + "格式错误:仅支持JSON对象({})或数组([])格式!");
+            if (!node.isObject()) {
+                throw new BusinessException(fieldName + "格式错误:必须是JSON对象({})格式,不允许数组或原始值!");
             }
         } catch (BusinessException e) {
             throw e;