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