Como analisar o campo USER-AGENT no cabeçalho http usando regex?

-1

Eu quero analisar algumas informações do cabeçalho User-Agent: HTTP. O problema é que estou recebendo dois User-Agent: cabeçalhos HTTP na mesma solicitação 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

Eu quero que o regex corresponda à parte não-http, por exemplo, Windows NT 6.1; WOW64 . O software do analisador de fluxo estou usando o mecanismo regex java.

Minhas tentativas

User-Agent: \ s +. ? ((. ?))

É igual a ambos; Quero pular a parte http dele.

    
por asadz 26.09.2013 / 14:22

1 resposta

4

Existem vários problemas com esta questão:

  • Você não nos contou qual linguagem de programação está usando, ou pelo menos qual o sabor das expressões regulares. POSIX? PCRE Algo incomum?

  • Em que contexto você está usando isso? Você está executando um servidor HTTP e os clientes estão enviando solicitações como essas? Ou você está executando um proxy que aceita essas solicitações e as analisa? Qual proxy você está usando - é algo que você escreveu manualmente (em qual idioma?) Ou algo que você baixou?

  • Não está claro em sua postagem que você está recebendo dois User-Agent: cabeçalhos especificados em uma única solicitação. Na sua postagem, você parece ter alguns problemas de quebra de linha (que eu editei), mas parece que você está recebendo três solicitações HTTP separadas , e é perfeitamente correto ter diferentes User-Agent: em cada solicitação HTTP. Se você está realmente recebendo informações de um cliente como os dados que você estava vendo em sua postagem original (com NO linebreak após o User-Agent: e antes do próximo CONNECT ), alguém está tentando enganar o seu proxy de propósito, omitindo o linebreak, e tentando fazer pipelining HTTP através do seu proxy. Uma implementação compatível com padrões terá quebras de linha, mesmo se o Corpo da Solicitação HTTP estiver vazio.

  • Tentar analisar coisas usando expressões regulares é perigoso. No mínimo, você precisa estar preparado para lidar com entradas arbitrárias. Não há um padrão universalmente aceito para a formatação da string User-Agent: , e muitos hosts públicos da Internet que se conectam a um servidor da Web público tentam "confundir" o servidor enviando solicitações malformadas. É perfeitamente possível que um cliente envie cabeçalhos como os seguintes, mesmo todos em um único pedido, se quiserem:

    User-Agent: Lol your regex não corresponde a este User-Agent: Mozzarella / 0.-0 ((Vamos) () confundir seu registro ((ex)) ((()) ApplePie / -NaN (FUZZ, como Polícia) 3.14159 \ EvilAttacker) User-Agent: Mozilla / 5.0 (Windows LOL 973.1; LOL64) ...

  • Tentando entender o user-agent de um cliente e, em seguida, coletar informações úteis de que é estúpido . Como o cliente pode configurá-lo como quiser, você não deve considerar um determinado user-agent para significar qualquer coisa. É como se eu dissesse "Eu tenho um milhão de dólares!" Tem algum motivo especial para acreditar em mim? Eu estou simplesmente alegando esse fato. User-Agent: não é diferente. Uma caixa do Windows 95 poderia alegar ser o Windows 8.1 executando o IE 11. Uma caixa do Mac OS X 10.8 poderia ser o Red Hat Enterprise Linux 5 executando o Firefox 2.0. Alguém deliberadamente tentando enganar com você poderia alegar que seu sistema operacional é "AsadzOS versão 0.1".

Existem muito poucos usos razoáveis do cabeçalho User-Agent: e, em cada um desses casos de uso, é essencial que você lide com todas as possíveis falhas, falsos positivos, falsos negativos, etc. com muito cuidado e evite qualquer falha não intencional. comportamento em seu analisador desistindo se você não conseguir entender a entrada.

Além de tudo isso , esta é uma questão para o StackOverflow, já que é completamente fora do tópico no SuperUser discutir técnicas de programação. Eu só precisava postar esta resposta longa para explicar a você por que essa é uma pergunta ruim.

    
por 26.09.2013 / 16:18

Tags