sexta-feira, 17 de setembro de 2010

Capturar IP do usuario no Browser: local e remoto

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é + ;)

4 comentários:

  1. Como eu capturo o ip do usuário e armazeno ele em arquivo txt ? :/

    ResponderExcluir
  2. Obrigado pelo feedback.
    Para 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

    ResponderExcluir
  3. Boa noite Luiz, como vai?

    Gostaria 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é!

    ResponderExcluir
  4. 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

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)