O pedido HTTP do PowerShell tem um IP remoto errado

0

Estou tentando escrever um script do PowerShell que execute uma solicitação HTTP. O pedido é tratado por um script PHP que precisa saber o endereço IP do cliente. Para isso, lê $_SERVER['REMOTE_ADDR'] .

Agora, o seguinte comportamento estranho ocorre:

  • Quando uso um serviço como whatismyip.com, meu IP é xxx.yyy.141.183
  • Quando eu uso um navegador da web para chamar meu script PHP, $_SERVER['REMOTE_ADDR'] retorna o mesmo IP acima, xxx.yyy.141.183 (conforme esperado).
  • Quando eu uso o script do PowerShell para chamar o mesmo script PHP, $_SERVER['REMOTE_ADDR'] retorna um IP diferente, ou seja, xxx.yyy.51.111 .

O script do PowerShell é muito simples:

$wc = New-Object System.Net.WebClient
$wc.DownloadString("http://example.net/myscript.php")

Eu observo esse comportamento sendo conectado à rede da minha universidade. Portanto, não conheço nenhum detalhe sobre a configuração da rede. Notei que máquinas diferentes parecem ter IPs diferentes usando os métodos nos marcadores 1 e 2, mas todos eles têm o mesmo IP usando o terceiro método.

Pergunta: Como posso modificar meu script do PowerShell para "se comportar como um navegador da Web", ou seja, enviar uma solicitação em que o endereço remoto visto pelo servidor é igual ao endereço remoto que ele vê ao receber a solicitação de um navegador da web?

Pergunta bônus: por que isso acontece?

    
por CL. 11.04.2016 / 16:06

1 resposta

0

Com base na descoberta de que apenas o Firefox fez solicitações com o IP% público xxx.yyy.141.183 correto, enquanto o IE e o Chrome não, encontrei a seguinte solução:

  • O fato de diferentes navegadores se comportarem de maneira diferente implica que o problema não está diretamente relacionado ao PowerShell, mas decorre das configurações de proxy.
  • Percebi que o Firefox estava configurado para "usar as configurações de proxy do sistema". Quando eu mudei isso para "detectar as configurações de proxy para a rede automaticamente" (tradução aproximada, desculpe), o Firefox (assim como o IE e Chrome) produziu pedidos com o xxx.yyy.51.111 IP.
  • A partir disso, concluí que o PowerShell deve estar usando uma configuração que faz com que ele detecte as configurações de proxy automaticamente. Essa conjectura é confirmada pelo documentação :

The Proxy property identifies the IWebProxy instance that communicates with remote servers on behalf of this WebClient object.The proxy is set by the system using configuration files and the Internet Explorer Local Area Network settings.To specify that no proxy should be used, set the Proxy property to the proxy instance returned by the GetEmptyWebProxy method.

  • Como não quero alterar a configuração do sistema e, como GlobalProxySelection.GetEmptyWebProxy foi descontinuado, agora uso com êxito a solução proposta aqui : simplesmente defina a propriedade proxy como null .

    $wc = New-Object System.Net.WebClient
    $wc.Proxy = $null
    $wc.DownloadString("http://example.net/myscript.php")
    
por 12.04.2016 / 10:03