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

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

Postar um comentário

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010