当 URL 包含无效字符时,有什么方法可以解析 URIPATHPARAM

Is there any way to grok parse URIPATHPARAM when the URL contains invalid characters

快速背景:使用来自 HAProxy 的访问日志记录并使用 grok 对其进行解析。 HAProxy 的 %{+Q}r 日志变量打印 "<http verb> <uri> <HTTP version>" 我们正在使用

解析
"%{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"

谁能想出一个解决方案,即使是无效的 URI 也能更好地解析或至少不会崩溃,即尽可能多地解析 URL 并丢弃垃圾?

是的,通过使用 grok 的多重匹配能力。

https://groups.google.com/forum/#!topic/logstash-users/H3_3gnWY2Go

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html#plugins-filters-grok-match

break_on_match => true(默认)结合使用时,您可以指定多个模式供 grok 尝试,它会在找到匹配模式并应用后停止。

在这里,如果第一个模式不起作用,它将尝试下一个使用 NOTSPACE 的模式,这将吃掉那些坏字符,并标记字段 bad_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
  }
}