【问题标题】:Comma separated prefix list with commas inside逗号分隔的前缀列表,里面有逗号
【发布时间】:2021-05-18 06:38:19
【问题描述】:

我正在尝试将逗号分隔的列表与包含逗号的前缀值进行匹配。

我终于让它匹配所有没有,的事件。

示例字符串(使用 NL 进行可视化 - 原始字符串没有 NL):

field01=Value 1,
field02=Value 2,
field03=<xml value>,
field04=127.0.0.1,
field05=User-Agent: curl/7.28.0\r\nHost: example.org\r\nAccept: */*,
field06=Location, Resource,
field07={Item 1},{Item 2}

我的实际 RegEx 看起来像这个未优化的部分......

(?'fields'(field[0-9]{2,3})=?([\s\w\d_<>.:="*?\-\/\\(){}<>'#]+))([^,](?&fields))*

有人知道如何解决这个问题吗?

编辑:

第一个模式接近我的预期结果。

这是一个匿名的完整字符串示例:

asm01=Predictable Resource Location,Information Leakage,asm02=N/A,asm04=Uncategorized,asm08=2021-02-15 09:18:16,asm09=127.0.0.1,asm10=443,asm11=N/A,asm15=,asm16=DE,asm17=User-Agent: curl/7.29.0\r\nHost: dev.example.com\r\nAccept: */*\r\nX-Forwarded-For: 127.0.0.1\r\n\r\n,asm18=/Common/_www.example.com_live_v1,asm20=127.0.0.1,asm22=,asm27=HEAD,asm34=/Common/_www.example.com_live_v1,asm35=HTTPS,asm39=blocked,asm41=0,asm42=3,asm43=0,asm44=Error,asm46=200000028,200100015,asm47=Unix hidden (dot-file) access,.htaccess access,asm48={Unix/Linux Signatures},{Apache/NCSA HTTP Server Signatures},asm50=40622,asm52=200000028,asm53=Unix hidden (dot-file) access,asm54={Unix/Linux Signatures},asm55=,asm61=,asm62=,asm63=8985143867830069446,asm64=example-waf.example.com,asm65=/.htaccess,asm67=Attack signature detected,asm68=&lt;?xml version='1.0' encoding='UTF-8'?&gt;&lt;BAD_MSG&gt;&lt;violation_masks&gt;&lt;block&gt;13020008202d8a-f803000000000000&lt;/block&gt;&lt;alarm&gt;417020008202f8a-f803000000000000&lt;/alarm&gt;&lt;learn&gt;13000008202f8a-f800000000000000&lt;/learn&gt;&lt;staging&gt;200000-0&lt;/staging&gt;&lt;/violation_masks&gt;&lt;request-violations&gt;&lt;violation&gt;&lt;viol_index&gt;42&lt;/viol_index&gt;&lt;viol_name&gt;VIOL_ATTACK_SIGNATURE&lt;/viol_name&gt;&lt;context&gt;request&lt;/context&gt;&lt;sig_data&gt;&lt;sig_id&gt;200000028&lt;/sig_id&gt;&lt;blocking_mask&gt;7&lt;/blocking_mask&gt;&lt;kw_data&gt;&lt;buffer&gt;Ly5odGFjY2Vzcw==&lt;/buffer&gt;&lt;offset&gt;0&lt;/offset&gt;&lt;length&gt;2&lt;/length&gt;&lt;/kw_data&gt;&lt;/sig_data&gt;&lt;sig_data&gt;&lt;sig_id&gt;200000028&lt;/sig_id&gt;&lt;blocking_mask&gt;4&lt;/blocking_mask&gt;&lt;kw_data&gt;&lt;buffer&gt;Ly5odGFjY2Vzcw==&lt;/buffer&gt;&lt;offset&gt;0&lt;/offset&gt;&lt;length&gt;3&lt;/length&gt;&lt;/kw_data&gt;&lt;/sig_data&gt;&lt;sig_data&gt;&lt;sig_id&gt;200100015&lt;/sig_id&gt;&lt;blocking_mask&gt;7&lt;/blocking_mask&gt;&lt;kw_data&gt;&lt;buffer&gt;Ly5odGFjY2Vzcw==&lt;/buffer&gt;&lt;offset&gt;1&lt;/offset&gt;&lt;length&gt;9&lt;/length&gt;&lt;/kw_data&gt;&lt;/sig_data&gt;&lt;/violation&gt;&lt;/request-violations&gt;&lt;/BAD_MSG&gt;,asm69=5,asm71=/Common/_dev.example.com_SSL,asm75=127.0.0.1,asm100=,asm101=HEAD /.htaccess HTTP/1.1\r\nUser-Agent: curl/7.29.0\r\nHost: dev.example.com\r\nAccept: */*\r\nX-Forwarded-For: 127.0.0.1\r\n\r\n#015

【问题讨论】:

  • (?'fields'(field[0-9]{2,3})=?.*?)(?=,\s*field|$) RegEx101
  • 你更新了问题,但是没有field字符串
  • 没错,第一项是我尝试做的示例数据集。
  • 但是你到底想从中匹配什么?
  • 我需要得到一个分组结果,例如:(asm[0-9]+)=(.*)

标签: regex regex-group


【解决方案1】:

一个简单的解决方案是(见regexr.com/5mg1b):

/((asm\d{2,3})=(.*?))(?=,asm|$)/g

比赛分组将是:

  • 组 #1 - asm01=可预测的资源位置,信息泄漏
  • 组 #2 - asm01
  • 第 3 组 - 可预测的资源位置、信息泄漏

条件:

  • 这将匹配包括空值在内的所有内容

这里的关键是确保每个匹配项由逗号和字段描述符或字符串结尾分隔。在这里可以方便地向前看:(?=,asm|$)

【讨论】:

  • 第一个模式几乎是我所期望的结果。但它不匹配: - 空值 - XML 值(已删除 =)我更新了我的帖子完整的示例字符串
  • 只需要在第 3 组匹配中将 + 替换为 *。更新了我的答案。
  • 这个字符串有问题:asm68=13020008202d8a-f803000000000000417020008202f8a-f80300000000000013000008202f8a-f800000000000000200000-0 ...因为它有一个等号。愿意为此分享上下文或用例吗?
  • 是的,这是来自我们的 Web 应用程序防火墙的违规详情。不幸的是,它作为 XML 有效负载发送。我无法控制此自定义模式,否则我无法编写 python 包装器来避免使用单个正则表达式。
  • 如果您总是使用“asm”或“field”,则可以使用前瞻。
【解决方案2】:

该模式不起作用,因为 fields 组与字符串 field 匹配

您正在尝试重复命名组 fields,但示例字符串没有字符串 field

注意 [^,] 匹配除逗号之外的任何字符,您可以省略命名组 field 中的捕获组,因为它已经是一个组,并且 \w 也匹配 \d

有 2 个捕获组:

\b(asm[0-9]+)=(.*?)(?=,asm[0-9]+=|$)
  • \b一个字边界
  • (asm[0-9]+) 捕获组 1,匹配 asm 和 1+ 个数字
  • = 字面匹配
  • (.*?) 捕获group 2,尽可能少匹配任何字符
  • (?= 正向前瞻,断言右边是
    • ,asm[0-9]+= 匹配 ,asm 后跟 1+ 个数字和 =
    • |或者
    • $断言字符串结束
  • ) 关闭前瞻

Regex demo

【讨论】:

  • 这也可以,但匹配值中有逗号。
  • @Toby 好吧,它现在被删除了
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多