Síntomas
Cuando utiliza la característica Interfaz CGI (Interfaz común de puerta de enlace de IIS) para hospedar un programa ejecutable que utiliza una biblioteca determinada para redirigir solicitudes, las solicitudes pueden estar mal dirigidas basándose en la presencia de un encabezado de solicitud "PROXY". Se sabe que varias plataformas de aplicaciones web usan esta biblioteca. Estos incluyen PHP, Python y Go, entre otros.
Causa
CGI es una interfaz que permite a un servidor web hospedar aplicaciones que se ejecutan como procesos ejecutables. Cuando un servidor web recibe una solicitud, el servidor inicia un nuevo proceso para controlar esa única solicitud. Cuando se completa la solicitud, el proceso se cierra. Para que el proceso tenga acceso a los datos de solicitud, los encabezados de solicitud se incluyen como variables de entorno que tienen "HTTP_" delante de su nombre. Por lo tanto, los procesos CGI para solicitudes que contienen un encabezado denominado "Proxy" tienen una variable de entorno "HTTP_PROXY" que tiene el mismo valor que el encabezado de solicitud.
La línea de comandos y la biblioteca cURL se utilizan comúnmente para permitir que varios tipos de aplicaciones realicen solicitudes a varios tipos de servidores, incluidos los servidores web. Esta biblioteca se puede configurar mediante parámetros de línea de comandos o puede leer sus parámetros de configuración desde las variables de entorno del proceso host. "HTTP_PROXY" es uno de los numerosos parámetros de configuración que usa cURL. cURL utiliza "HTTP_PROXY" para enviar una solicitud HTTP a través del proxy configurado.
Nota Esto no está relacionado con "HTTP_PROXY" como representación de un encabezado de solicitud de cliente.
Cuando cURL está alojado dentro de un proceso CGI, y ese proceso contiene una variable de entorno que se denomina "HTTP_PROXY", cURL utiliza su valor para enviar los datos solicitados a través del proxy HTTP cuyo valor se especifica en la variable de entorno. Esto ocurre porque cURL espera que "HTTP_PROXY" sea una directiva de configuración y no un encabezado de solicitud de cliente.
Solución alternativa
Para solucionar este problema, no use CGI en un servidor que ejecute IIS. CGI es una interfaz en gran parte obsoleta que se reemplaza por interfaces más nuevas y más relacionadas con el rendimiento. Específicamente, PHP, Python y Go deben hospedarse a través de FastCGI en IIS. FastCGI no utiliza variables de entorno para los encabezados de solicitud del cliente y no tiene este problema. Sin embargo, para PHP, algunas aplicaciones pueden usar la función getenv() de PHP para recuperar variables de entorno. Incluso cuando PHP no está alojado dentro de un proceso CGI, replica el comportamiento CGI inyectando valores de encabezado de solicitud en el conjunto de datos disponibles para su función getenv(). Si utiliza una aplicación PHP que recupera HTTP_PROXY de esta manera, las siguientes mitigaciones de borrar el valor del encabezado o rechazar solicitudes con un encabezado PROXY son efectivas.
Si tiene que usar CGI por alguna razón, bloquee las solicitudes que contengan un encabezado de solicitud llamado "Proxy" o borre el valor del encabezado. Esto se debe a que "Proxy" no es un nombre de encabezado de solicitud estándar y los exploradores generalmente no lo enviarán.
Para bloquear una solicitud que contiene un encabezado de proxy (la solución preferida), ejecute la siguiente línea de comandos:
appcmd set config /section:requestfiltering /+requestlimits.headerLimits. [header='proxy',sizelimit='0']
Nota: El appcmd.exe no suele estar en la ruta de acceso y se puede encontrar en el directorio %systemroot%\system32\inetsrv
Para borrar el valor del encabezado, puede usar la siguiente regla de reescritura de dirección 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>
Nota: URL Rewrite es un complemento descargable para IIS y no se incluye en una instalación predeterminada de IIS.