Saber qual o tipo de browser de nossos clientes/usuários e o seu comportamento é de grande valia. Você precisará disso quando:
- Prestar suporte ao usuário e ele não souber dizer informações técnicas sobre o browser
- Logar informações sobre browsers, capacidades e informações
- Logar informações de parceiros (referrers), domínios e logins
- Se você criar um site de conteudo restrito poderá detectar logins simultaneos em máquinas ou browsers diferentes
- Levantamentos estatísticos utilizando as informações logadas acima
Imagine que o login é pessoal e intransferível (lógico neh?) mas que você criou um mecanismo que detecta logins simultâneos e derruba a seção do usuário. Se um usuário se logar de uma rede corporativa, lan-house ou coisa do gênero o IP do client vai ser sempre o mesmo: o IP do proxy ou gateway de acesso a internet. Como saber se foi um usuário diferente que logou com o mesmo login em outra máquina se os IP's são iguais? Pode ter sido o mesmo usuário que abriu dois browsers na mesma máquina.
Na verdade não tem como saber, mas ajudaria bastante se pudéssemos capturar o IP interno da rede.
Isso é possível com a variável de servidor (Server Variable) HTTP_X_FORWARDED_FOR. (nem sempre esta variável estará presente, geralmente só quando o acesso for feito via proxy).
O código abaixo é para uma página aspx que mostra todas as capacidades/configurações do browser e suas versões, e mostra também todas as server variables e parâmetros do servidor.
Fique atento a:
- UserHostAddress
- REMOTE_ADDR
- HTTP_X_FORWARDED_FOR
- Request.Browser.Browser.ToString()
- Request.Browser.Type.ToString()
- Request.Browser.Version.ToString()
São as variáveis mais importantes para você atender a essa necessidade.
<html>
<body>
<script runat=server language=C#>
private void PegaServerVariables()
{
Response.Write("IP: " + Request.UserHostAddress + "<br/>");
Response.Write("Remote Address: " + Request.ServerVariables["REMOTE_ADDR"] + "<br/>");
Response.Write("<br><br><br>");
Response.Write("Browser Caps:<br><br>");
Response.Write("ActiveXControls: " + Request.Browser.ActiveXControls.ToString() + "<br/>");
Response.Write("AOL: " + Request.Browser.AOL.ToString() + "<br/>");
Response.Write("BackgroundSounds: " + Request.Browser.BackgroundSounds.ToString() + "<br/>");
Response.Write("Beta: " + Request.Browser.Beta.ToString() + "<br/>");
Response.Write("Browser: " + Request.Browser.Browser.ToString() + "<br/>");
Response.Write("CDF: " + Request.Browser.CDF.ToString() + "<br/>");
Response.Write("ClrVersion: " + Request.Browser.ClrVersion.ToString() + "<br/>");
Response.Write("Cookies: " + Request.Browser.Cookies.ToString() + "<br/>");
Response.Write("Crawler: " + Request.Browser.Crawler.ToString() + "<br/>");
Response.Write("EcmaScriptVersion: " + Request.Browser.EcmaScriptVersion.ToString() + "<br/>");
Response.Write("Frames: " + Request.Browser.Frames.ToString() + "<br/>");
Response.Write("JavaApplets: " + Request.Browser.JavaApplets.ToString() + "<br/>");
Response.Write("JavaScript: " + Request.Browser.JavaScript.ToString() + "<br/>");
Response.Write("MajorVersion: " + Request.Browser.MajorVersion.ToString() + "<br/>");
Response.Write("MinorVersion: " + Request.Browser.MinorVersion.ToString() + "<br/>");
Response.Write("MSDomVersion: " + Request.Browser.MSDomVersion.ToString() + "<br/>");
Response.Write("Platform: " + Request.Browser.Platform.ToString() + "<br/>");
Response.Write("Tables: " + Request.Browser.Tables.ToString() + "<br/>");
Response.Write("TagWriter: " + Request.Browser.TagWriter.ToString() + "<br/>");
Response.Write("Type: " + Request.Browser.Type.ToString() + "<br/>");
Response.Write("VBScript: " + Request.Browser.VBScript.ToString() + "<br/>");
Response.Write("Version: " + Request.Browser.Version.ToString() + "<br/>");
Response.Write("W3CDomVersion: " + Request.Browser.W3CDomVersion.ToString() + "<br/>");
Response.Write("Win16: " + Request.Browser.Win16.ToString() + "<br/>");
Response.Write("Win32: " + Request.Browser.Win32.ToString() + "<br/>");
Response.Write("<br><br><br>");
Response.Write("<br><br><br>");
Response.Write("Server Variables:<br><br>");
for(int i=0; i<Request.ServerVariables.Count; i++)
{
string valor = string.Empty;
valor += Request.ServerVariables.GetKey(i) + " = ";
for(int j=0; j<Request.ServerVariables.GetValues(i).Length; j++)
{
valor += Request.ServerVariables.GetValues(i)[j].ToString()+" ";
}
valor += "<br>";
Response.Write(valor);
}
Response.Write("<br><br><br>");
Response.Write("Server Params:<br><br>");
for(int i=0; i<Request.Params.Count; i++)
{
string valor = string.Empty;
valor += Request.Params.GetKey(i) + " = ";
for(int j=0; j<Request.Params.GetValues(i).Length; j++)
{
valor += Request.Params.GetValues(i)[j].ToString()+" ";
}
valor += "<br>";
Response.Write(valor);
}
}
private void Page_Load(object sender, System.EventArgs e)
{
PegaServerVariables();
}
</script>
<body>
</html>
Só o método, sem o html, num arquivo .cs (code behind) seria assim:
private void PegaServerVariables()
{
Response.Write("IP: " + Request.UserHostAddress + "
");
Response.Write("Remote Address: " + Request.ServerVariables["REMOTE_ADDR"] + "
");
Response.Write("
");
Response.Write("Browser Caps:
");
Response.Write("ActiveXControls: " + Request.Browser.ActiveXControls.ToString() + "
");
Response.Write("AOL: " + Request.Browser.AOL.ToString() + "
");
Response.Write("BackgroundSounds: " + Request.Browser.BackgroundSounds.ToString() + "
");
Response.Write("Beta: " + Request.Browser.Beta.ToString() + "
");
Response.Write("Browser: " + Request.Browser.Browser.ToString() + "
");
Response.Write("CDF: " + Request.Browser.CDF.ToString() + "
");
Response.Write("ClrVersion: " + Request.Browser.ClrVersion.ToString() + "
");
Response.Write("Cookies: " + Request.Browser.Cookies.ToString() + "
");
Response.Write("Crawler: " + Request.Browser.Crawler.ToString() + "
");
Response.Write("EcmaScriptVersion: " + Request.Browser.EcmaScriptVersion.ToString() + "
");
Response.Write("Frames: " + Request.Browser.Frames.ToString() + "
");
Response.Write("JavaApplets: " + Request.Browser.JavaApplets.ToString() + "
");
Response.Write("JavaScript: " + Request.Browser.JavaScript.ToString() + "
");
Response.Write("MajorVersion: " + Request.Browser.MajorVersion.ToString() + "
");
Response.Write("MinorVersion: " + Request.Browser.MinorVersion.ToString() + "
");
Response.Write("MSDomVersion: " + Request.Browser.MSDomVersion.ToString() + "
");
Response.Write("Platform: " + Request.Browser.Platform.ToString() + "
");
Response.Write("Tables: " + Request.Browser.Tables.ToString() + "
");
Response.Write("TagWriter: " + Request.Browser.TagWriter.ToString() + "
");
Response.Write("Type: " + Request.Browser.Type.ToString() + "
");
Response.Write("VBScript: " + Request.Browser.VBScript.ToString() + "
");
Response.Write("Version: " + Request.Browser.Version.ToString() + "
");
Response.Write("W3CDomVersion: " + Request.Browser.W3CDomVersion.ToString() + "
");
Response.Write("Win16: " + Request.Browser.Win16.ToString() + "
");
Response.Write("Win32: " + Request.Browser.Win32.ToString() + "
");
Response.Write("
");
Response.Write("
");
Response.Write("Server Variables:
");
for(int i=0; i < Request.ServerVariables.Count; i++)
{
string valor = string.Empty;
valor += Request.ServerVariables.GetKey(i) + " = ";
for(int j=0; j < Request.ServerVariables.GetValues(i).Length; j++)
{
valor += Request.ServerVariables.GetValues(i)[j].ToString()+" ";
}
valor += "
";
Response.Write(valor);
}
Response.Write("
");
Response.Write("Server Params:
");
for(int i=0; i<Request.Params.Count; i++)
{
string valor = string.Empty;
valor += Request.Params.GetKey(i) + " = ";
for(int j=0; j<Request.Params.GetValues(i).Length; j++)
{
valor += Request.Params.GetValues(i)[j].ToString()+" ";
}
valor += "
";
Response.Write(valor);
}
}
Isso funciona não só em qualquer linguagem .net (VB.net, ironPython etc...) mas tem similares em qualquer linguagem dinâmica Web, seja Java, PHP, Ruby ou Python.
Até + ;)
Como eu capturo o ip do usuário e armazeno ele em arquivo txt ? :/
ResponderExcluirObrigado pelo feedback.
ResponderExcluirPara fazer isso, em vez de usar response.write para escrever na página você pode usar o streamwriter para gravar em um arquivo. Você pode usar um caminho absoluto da máquina / servidor (mais fácil) ou usar mappath para obter o caminho relativo à aplicação/página onde você está.
Veja exemplos do uso da classe streamwriter no site do msdn:
http://msdn.microsoft.com/pt-br/library/system.io.streamwriter.aspx
Boa noite Luiz, como vai?
ResponderExcluirGostaria sepode me ajudar. Preciso pegar a porta que aparece no browser do cliente, mas até agora não encontrei nada! Pegar o IP, sem problemas, mas a porta...Por exemplo:
"http://IP:porta..."
Tem algum método para isso?
Até!
A porta por padrão é 80. Se for especificada uma porta diferente no browser pegue o atributo URL do objeto response e "parseie-o". Divida (split) a url em duas partes partindo do sinal de dois pontos (:) e pegue a parte da direita, antes da barra.
ResponderExcluir