Я пытаюсь написать сценарий PowerShell, который выполняет HTTP-запрос. Запрос обрабатывается PHP-скриптом, который должен знать IP-адрес клиента. Для этого он читает $_SERVER['REMOTE_ADDR'] .

Теперь происходит следующее странное поведение:

  • Когда я использую такой сервис, как whatismyip.com, мой IP-адрес - xxx.yyy.141.183
  • Когда я использую веб-браузер для вызова моего PHP-скрипта, $_SERVER['REMOTE_ADDR'] возвращает тот же IP, что и выше, xxx.yyy.141.183 (как и ожидалось).
  • Когда я использую сценарий PowerShell для вызова того же самого сценария PHP, $_SERVER['REMOTE_ADDR'] возвращает другой IP-адрес, а именно xxx.yyy.51.111 .

Сценарий PowerShell очень прост:

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

Я наблюдаю, как это поведение связано с сетью моего университета. Поэтому я не знаю никаких подробностей о конфигурации сети. Я заметил, что разные машины имеют разные IP-адреса с использованием методов, указанных в пунктах 1 и 2, но все они имеют одинаковые IP-адреса с использованием третьего метода.

Вопрос: Как я могу изменить свой сценарий PowerShell, чтобы он «вел себя как веб-браузер», то есть отправлял запрос, когда удаленный адрес, видимый сервером, равен удаленному адресу, который он видит при получении запроса от веб-браузера?

Бонусный вопрос: почему это происходит?

1 ответ1

0

Основываясь на обнаружении, что только Firefox делал запросы с правильным общедоступным IP- xxx.yyy.141.183 а IE и Chrome - нет, я нашел следующее решение:

  • Тот факт, что разные браузеры ведут себя по-разному, означает, что проблема не связана напрямую с PowerShell, а связана с настройками прокси.
  • Я понял, что Firefox был настроен на «использование настроек прокси-сервера системы». Когда я изменил это, чтобы "автоматически определять настройки прокси для сети" (грубый перевод, извините), Firefox (так же, как IE и Chrome) генерировал запросы с IP- xxx.yyy.51.111 .
  • Исходя из этого, я пришел к выводу, что PowerShell должен использовать конфигурацию, которая позволяет автоматически определять параметры прокси. Эта гипотеза подтверждается документацией:

Свойство Proxy идентифицирует экземпляр IWebProxy, который связывается с удаленными серверами от имени этого объекта WebClient.Прокси-сервер устанавливается системой с использованием файлов конфигурации и настроек локальной сети Internet Explorer.Чтобы указать, что прокси-сервер не должен использоваться, задайте для свойства Proxy экземпляр прокси, возвращаемый методом GetEmptyWebProxy.

  • Как я не хочу менять конфигурацию системы и как GlobalProxySelection.GetEmptyWebProxy устарел, теперь я успешно использую предложенное здесь решение: просто установите для свойства proxy значение null .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .