如何使用正则表达式解析 http 标头中的 USER-AGENT 字段?

如何使用正则表达式解析 http 标头中的 USER-AGENT 字段?

我想从User-Agent:HTTP 标头中解析一些信息。问题是我User-Agent:在同一个 HTTP 请求中获取了两个 HTTP 标头:

CONNECT www.facebook.com:443 HTTP/1.1
Host: www.facebook.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (http://iim.com/a.jph) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.
CONNECT www.facebook.com:443 HTTP/1.1
Host: www.facebook.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.
CONNECT www.facebook.com:443 HTTP/1.1

我希望正则表达式匹配非 http 部分,例如Windows NT 6.1;WOW64. 流量分析器软件我使用的是java regex引擎。

我的尝试

用户代理:\s+。?((。?))

它与两者匹配;我想跳过它的 http 部分。

答案1

一些这个问题的问题:

  • 您还没有告诉我们您使用的是哪种编程语言,或者至少是哪种正则表达式。POSIX?PCRE?有什么不寻常的吗?

  • 您在什么情况下使用它?您是否正在运行 HTTP 服务器,并且客户端正在提交类似这样的请求?或者您是否正在运行接受这些请求并对其进行分析的代理?您使用的是哪种代理 - 它是您手写的(使用哪种语言?)还是您下载的?

  • 从您的帖子中看不出您User-Agent:在单个请求中指定了两个标头。在您的帖子中,您似乎遇到了一些换行符问题(我已对其进行了编辑),但看起来您获得了三个分离HTTP 请求,并且每个 HTTP 请求中都有不同的内容是完全可以的User-Agent:。如果您实际上从客户端获取了像您在原始帖子中看到的数据一样的输入(在 之后User-Agent:和下一个 之前没有换行符CONNECT),那么有人试图通过省略换行符来故意欺骗您的代理,并尝试通过您的代理进行 HTTP 流水线传输。符合标准的实现将有换行符,即使 HTTP 请求正文为空。

  • 尝试使用正则表达式解析内容是危险的。至少,您需要准备好处理任意输入。对于字符串的格式,没有普遍认可的标准User-Agent:,许多连接到公共 Web 服务器的公共 Internet 主机都会尝试通过向服务器发送格式错误的请求来“模糊”服务器。客户端完全可以提交如下标头,如果他们愿意,甚至可以在单个请求中提交所有内容:

    用户代理:Lol 你的正则表达式与此不匹配用户代理:Mozzarella/0.-0((让我们))混淆你的正则((例如))((())ApplePie/-NaN(FUZZ,如警察)3.14159\EvilAttacker)用户代理:Mozilla/5.0(Windows LOL 973.1;LOL64)...

  • 尝试理解客户端的用户代理,然后从中收集有用的信息愚蠢的。因为客户端可以将其设置为他们喜欢的任何内容,所以您不应该考虑给定的用户代理意思是什么都不是。这就像如果我告诉你“我有一百万美元!”——你有什么特别的理由相信我吗?我只是指控事实User-Agent:也是如此。Windows 95 机器可以声称是运行 IE 11 的 Windows 8.1。Mac OS X 10.8 机器可以声称是运行 Firefox 2.0 的 Red Hat Enterprise Linux 5。故意欺骗你的人可能会声称他们的操作系统是“AsadzOS 版本 0.1”。

标头的合理用途非常少User-Agent:,并且在每种用例中,都必须非常小心地处理所有可能的匹配失败、误报、漏报等,如果您无法理解输入,则通过放弃来防止解析器中出现任何意外行为。

在之上所有这些,这是一个 StackOverflow 问题,因为在 SuperUser 上讨论编程技术完全是题外话。我只需要发布这个长篇回答来向你解释为什么这是一个糟糕的问题。

相关内容