正则匹配私网IP前两个八位组为何可成功匹配完整IP地址
正则匹配生效逻辑解答
核心原因是混淆了正则子串匹配与全串匹配的判定规则,具体逻辑如下:
- Azure ATP(现Microsoft Defender for Identity)底层使用Kusto查询语法,其中
matches regex操作符默认采用子串匹配规则:只要被检测字段中存在任意连续子串符合正则匹配要求,整条记录就会判定为匹配成功,不要求正则覆盖字符串的全部内容。 - 正则片段
(^172\.2[0-9]\.)携带行首锚定符^,匹配规则为:字符串起始位置需满足172.+数字2+0-9范围内单个数字+.的格式。对于IP字符串172.20.1.9,开头的172.20.完全命中该片段规则,因此即便正则未编写后续.1.9部分的匹配逻辑,整条IP仍会被判定为匹配成功。 - 当前使用的正则逻辑严谨:所有匹配分支均添加行首锚定
^,仅会匹配以私网地址前缀开头的字符串,不会出现“字符串中间包含私网前缀就误判”的问题,针对格式标准的IP字段,该写法可准确覆盖所有目标私网网段,运行结果符合预期属于正常表现。
当前使用的查询语句如下:
| where From_IP matches regex @'(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)'
补充:如果需要实现正则必须匹配完整字符串的效果,需要在正则末尾添加字符串结束锚定
$并补全后续IP段的匹配规则;但在当前私网IP匹配场景下,现有写法执行效率更高,完全满足使用需求。
内容的提问来源于stack exchange,提问作者Origami
相关产品推荐
相关产品推荐

