diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java index 90a7e2aac..831790357 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java @@ -204,6 +204,21 @@ public class SipUtils { } public static Gb28181Sdp parseSDP(String sdpStr) throws SdpParseException { + + // 校验:拦截空内容与注入攻击特征 + if (sdpStr == null || sdpStr.trim().isEmpty()) { + throw new SdpParseException(0, 0, "SDP内容为空"); + } + // 标准SDP每行格式固定为 "x=value",不存在SQL关键字;出现则视为注入攻击 + String sdpUpper = sdpStr.toUpperCase(); + if (sdpUpper.contains("' OR '") || sdpUpper.contains("' OR 1") || sdpUpper.contains(" OR 1=1") + || sdpUpper.contains("--") || sdpUpper.contains("/*") || sdpUpper.contains("*/") + || sdpUpper.contains("DROP ") || sdpUpper.contains("INSERT ") || sdpUpper.contains("UPDATE ") + || sdpUpper.contains("DELETE ") || sdpUpper.contains("UNION ") || sdpUpper.contains("SELECT ")) { + log.error("[SDP注入攻击] 检测到非法SDP内容,已拒绝解析,内容长度: {}", sdpStr.length()); + throw new SdpParseException(0, 0, "非法SDP内容"); + } + //校验结束 // jainSip不支持y= f=字段, 移除以解析。 int ssrcIndex = sdpStr.indexOf("y=");