Logstash 当URL包含无效字符时,是否有任何方法可以解析URIPATHPARAM

Logstash 当URL包含无效字符时,是否有任何方法可以解析URIPATHPARAM,logstash,haproxy,grok,Logstash,Haproxy,Grok,快速背景:从HAProxy使用访问日志记录,并使用grok对其进行解析。HAProxy的%{+Q}r日志变量打印我们正在使用的“” "%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}" 这适用于大多数请求,但当我们被各种扫描器击中,试图通过在URL中发送垃圾来进行注入攻击时,grok无法解析uri。下面是一些使grok筛选器崩溃的示例: "GET /index.html?14068'#22><bla>

快速背景:从HAProxy使用访问日志记录,并使用grok对其进行解析。HAProxy的%{+Q}r日志变量打印我们正在使用的
“”

"%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}"
这适用于大多数请求,但当我们被各种扫描器击中,试图通过在URL中发送垃圾来进行注入攻击时,grok无法解析uri。下面是一些使grok筛选器崩溃的示例:

"GET /index.html?14068'#22><bla> HTTP/1.1"
"GET /index.html?fName=\Windows\system.ini%00&lName=&guestEmail= HTTP/1.1"
“GET/index.html?14068”#22>HTTP/1.1”
“GET/index.html?fName=\Windows\system.ini%00&lName=&guestEmail=HTTP/1.1”

有人能想出一个解决方案,它最好能解析无效的URI,或者至少不会崩溃,即解析尽可能多的URL并丢弃垃圾吗?

是的,使用grok的多重匹配功能

当与
break\u on\u match=>true
(默认值)结合使用时,您可以指定多个模式供grok尝试,它将在找到匹配模式并应用该模式后停止

在这里,如果第一个模式不起作用,它将尝试使用NOTSPACE的下一个模式,该模式将吃掉那些坏字符,并标记字段
bad\u url
,而不是url

filter {
  grok { 
    match => { 
      "message" => [ 
        "%{WORD:method} %{URIPATHPARAM:url} HTTP/%{NUMBER:httpversion}", 
        "%{WORD:method} %{NOTSPACE:bad_url} HTTP/%{NUMBER:httpversion}" 
      ]
    }
    break_on_match => true
  }
}

有趣的是,您的第一个示例并没有破坏我的观点,但我明白您的观点。如果您想保留名为url的字段,您可以稍后使用一个变异过滤器,将
坏url
重命名为
url
,并添加一个标记,表明如果
坏url
存在,它就是坏url