Запросы заголовков HTTP_PROXY IIS CGI могут перенаправляться

Применяется к
Windows 10 Windows 10, version 1511, all editions Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Standard Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows 8.1 Enterprise Windows 8.1 Pro Windows 8.1 Windows RT 8.1 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Datacenter Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Standard Windows Server 2008 R2 Web Edition Windows Server 2008 R2 Foundation Windows 7 Service Pack 1 Windows 7 Ultimate Windows 7 Enterprise Windows 7 Professional Windows 7 Home Premium Windows 7 Home Basic Windows 7 Starter Windows Server 2008 Service Pack 2 Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Server 2008 Foundation Windows Server 2008 for Itanium-Based Systems Windows Vista Service Pack 2 Windows Vista Ultimate Windows Vista Enterprise Windows Vista Business Windows Vista Home Premium Windows Vista Home Basic Windows Vista Starter

Проблема

При использовании функции интерфейса общего шлюза IIS (CGI) для размещения исполняемой программы, которая использует определенную библиотеку для перенаправления запросов, запросы могут быть неправильно направлены на основе наличия заголовка запроса PROXY. Известно, что эту библиотеку используют несколько платформ веб-приложений. К ним относятся, среди прочего, PHP, Python и Go.

Причина

CGI — это интерфейс, позволяющий веб-серверу размещать приложения, которые выполняются как исполняемые процессы. Когда запрос получен веб-сервером, сервер запускает новый процесс обработки этого одного запроса. По завершении запроса процесс завершается. Чтобы у процесса был доступ к данным запроса, заголовки запросов включаются в качестве переменных среды, к имени которых добавляется "HTTP_". Таким образом, процессы CGI для запросов, содержащих заголовок с именем Proxy, имеют переменную среды "HTTP_PROXY", которая имеет то же значение, что и заголовок запроса.

Командная строка и библиотека cURL обычно используются для того, чтобы различные типы приложений могли отправлять запросы к различным типам серверов, включая веб-серверы. Эту библиотеку можно настроить с помощью параметров командной строки или считывать параметры конфигурации из переменных среды хост-процесса. "HTTP_PROXY" является одним из многих параметров конфигурации, используемых cURL. "HTTP_PROXY" используется cURL для отправки HTTP-запроса через настроенный прокси-сервер.

Примечание. Это не связано с "HTTP_PROXY" в качестве представления заголовка запроса клиента.

Если cURL размещается в процессе CGI и этот процесс содержит переменную среды с именем "HTTP_PROXY", cURL использует свое значение для отправки запрошенных данных через прокси-сервер HTTP, значение которого указано в переменной среды. Это происходит потому, что cURL ожидает, что "HTTP_PROXY" является директивой конфигурации, а не заголовком запроса клиента.

Временное решение

Чтобы обойти эту проблему, не используйте CGI на сервере под управлением IIS. CGI — это в значительной степени устаревший интерфейс, который заменен более новыми интерфейсами, связанными с производительностью. В частности, PHP, Python и Go должны размещаться через FastCGI в IIS. FastCGI не использует переменные среды для заголовков клиентских запросов и не имеет этой проблемы. Однако для PHP некоторые приложения могут использовать функцию getenv() PHPs для получения переменных среды. Даже если PHP не размещен в процессе CGI, он реплицирует поведение CGI путем внедрения значений заголовков запроса в набор данных, доступных его функции getenv(). Если вы используете приложение PHP, которое получает HTTP_PROXY таким образом, в силу действуют следующие способы очистки значения заголовка или отклонения запросов с заголовком PROXY.

Если вам по какой-то причине нужно использовать CGI, либо блокируйте запросы, содержащие заголовок запроса с именем Proxy, либо очистите значение заголовка.  Это связано с тем, что "Proxy" не является стандартным именем заголовка запроса, и браузеры, как правило, не отправляют его.

Чтобы заблокировать запрос, содержащий заголовок Proxy (предпочтительное решение), выполните следующую командную строку:

appcmd set config /section:requestfiltering /+requestlimits.headerLimits. [header='proxy',sizelimit='0']
Примечание. Обычно appcmd.exe не находится в пути и находится в каталоге %systemroot%\system32\inetsrv.

Чтобы очистить значение заголовка, можно использовать следующее правило перезаписи URL-адресов:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">
                <match url="*.*" />
                <serverVariables>
                    <set name="HTTP_PROXY" value="" />
                </serverVariables>
                <action type="None" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Примечание Перезапись URL-адресов — это загружаемая надстройка в IIS и не включена в установку IIS по умолчанию.