1 Commits

Author SHA1 Message Date
YuanHongbin 626f33a15e fix(register): 注册payload合法性校验,拦截串台乱码注册
- 新增RegPayloadValid校验: SensorN非0/PayloadLen与条目数匹配/传感器类型白名单(SensorTypeDataLen表内且非保留)/MAC非全0全FF且非网关MAC/注册帧GWMac非空时必须与本网关匹配
- 频偏串台误解调的乱码帧几乎必然被拦截(随机类型命中合法类型概率约0.03%), 不再占用注册表槽位
- GWMac为全0/全FF视为未填放行, 兼容老固件; 已注册设备重注册路径不受影响
2026-09-08 10:14:52 +08:00
+63
View File
@@ -244,6 +244,63 @@ int CheckCommUnitExcl(GateWayPara GateWay, uint8_t *CommUnitMac)
} }
return -1; return -1;
} }
/*****************************************************************************************
* 函数名称: RegPayloadValid
* 功能描述: 注册请求payload合法性校验,拦截频偏串台误解调的乱码帧,避免乱码设备占用注册表
* 参 数: GateWay, 网关句柄
CUHeader, 注册帧头
PayLoad, 注册负载数据
* 返 回 值: 合法返回true, 非法返回false
*****************************************************************************************/
static bool RegPayloadValid(GateWayPara GateWay, CommUnitFrameHeader CUHeader, uint8_t *PayLoad)
{
uint8_t SensorN = PayLoad[0];
int i, j;
bool MacEmpty;
/*空注册无意义*/
if(SensorN == 0) {
return false;
}
/*payload长度必须容纳N个传感器条目(每条目6字节)*/
if(CUHeader->PayloadLen < (uint16_t)(SensorN * 6 + 1)) {
return false;
}
/*通讯单元自身MAC不能为全0/全FF*/
MacEmpty = true;
for(i = 0; i < 6; i++) {
if(CUHeader->DevMac[i] != 0x00 && CUHeader->DevMac[i] != 0xFF) { MacEmpty = false; break; }
}
if(MacEmpty) {
return false;
}
/*注册帧GWMac若非空(全0/全FF视为未填)则必须与本网关匹配*/
MacEmpty = true;
for(i = 0; i < 6; i++) {
if(CUHeader->GWMac[i] != 0x00 && CUHeader->GWMac[i] != 0xFF) { MacEmpty = false; break; }
}
if(!MacEmpty && memcmp(CUHeader->GWMac, GateWay->ConfigPara.GwMac, 6) != 0) {
return false;
}
/*逐传感器: 类型必须在已知类型表内且非保留(数据长度>0), MAC非全0/全FF且不等于网关MAC*/
for(j = 0; j < SensorN; j++) {
uint16_t RegType = PayLoad[(j*6)+1] | (PayLoad[(j*6)+2] << 8);
if(RegType == 0x0000 || RegType >= sizeof(SensorTypeDataLen)/sizeof(SensorTypeDataLen[0])
|| SensorTypeDataLen[RegType] == 0) {
return false;
}
MacEmpty = true;
for(i = 0; i < 6; i++) {
uint8_t mac = PayLoad[(j*6)+1+i];
if(mac != 0x00 && mac != 0xFF) { MacEmpty = false; break; }
}
if(MacEmpty || memcmp(&PayLoad[(j*6)+1], GateWay->ConfigPara.GwMac, 6) == 0) {
return false;
}
}
return true;
}
/***************************************************************************************** /*****************************************************************************************
* 函数名称: CommUnitSendCmd * 函数名称: CommUnitSendCmd
* 功能描述: 网关下发通讯单元指令函数 * 功能描述: 网关下发通讯单元指令函数
@@ -611,6 +668,12 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
if(PayLoad[0] > SENSOR_NUM_MAX) { if(PayLoad[0] > SENSOR_NUM_MAX) {
return -1; return -1;
} }
/*串台防护: 校验注册payload合法性, 拦截频偏误解调的乱码帧*/
if(!RegPayloadValid(GateWay, CUHeader, PayLoad)) {
MAIN_DBG_LOG("\r\nReg rejected: invalid payload (cross-band interference?) Mac:%02X-%02X-%02X-%02X-%02X-%02X\r\n",
CUHeader->DevMac[0], CUHeader->DevMac[1], CUHeader->DevMac[2], CUHeader->DevMac[3], CUHeader->DevMac[4], CUHeader->DevMac[5]);
return -1;
}
// if(CUHeader->PayloadLen < 2) // if(CUHeader->PayloadLen < 2)
// return -1; // return -1;