Symptom
När du använder funktionen IIS Common Gateway Interface (CGI) som värd för ett körbart program som använder ett visst bibliotek för att omdirigera begäranden kan begäranden vara misdirected baserat på förekomsten av en "PROXY" begärans huvud. Flera plattformar för webben är känt för att använda biblioteket. Dessa inkluderar PHP, Python och gå, bland annat.
Orsak
CGI är ett gränssnitt som gör att en server som värd för program som körs som körbara processer. När en begäran tas emot av en webbserver, startar servern en ny process för att hantera denna begäran. När begäran är slutförd avslutar processen. För att processen ska ha åtkomst till data för begäran inkluderas begärandehuvuden som miljövariabler som har "HTTP_" inledd till sitt eget namn. Därför har CGI-processer för förfrågningar som innehåller ett sidhuvud som heter "Proxy" miljövariabeln "HTTP_PROXY" som har samma värde som begärans huvud.
CURL-kommandoraden och bibliotek används ofta för att aktivera olika typer av program för att göra förfrågningar till olika typer av servrar, inklusive webbservrar. Det här biblioteket kan konfigureras med hjälp av kommandoradsparametrar eller det kan läsa sina konfigurationsparametrar från miljövariabler för host process. "HTTP_PROXY" är en av många konfigurationsparametrar som används av vändningen. "HTTP_PROXY" används av cURL för att skicka en HTTP-begäran till den konfigurerade proxyn.
Obs! Det har inget "HTTP_PROXY" som representation av en klient begärans huvud.
När vändningen finns inom en CGI-process och som processen innehåller en miljövariabel med namnet "HTTP_PROXY", använder cURL dess värde för att skicka begärda data via HTTP-proxy vars värde anges i miljövariabeln. Detta beror på att vändningen förväntar sig att "HTTP_PROXY" är ett direktiv för konfiguration och inte en klient begärans huvud.
Temporär lösning
Undvik problemet genom att inte använda CGI på en server som kör IIS. CGI är en till stor del föråldrad gränssnitt som ersätts av nyare och fler prestandarelaterade gränssnitt. PHP, Python och gå bör särskilt finnas för via FastCGI på IIS. FastCGI använder inte miljövariabler för klienten begärandehuvuden och har inte problemet. Men för PHP, vissa program kan använda PHPs getenv() funktion för att hämta miljövariabler. Även om PHP inte finns innanför en CGI-process, replikerar CGI-beteendet genom att injicera begäran huvudvärden i datauppsättningen tillgänglig getenv() funktion. Om du använder ett PHP-program som hämtar HTTP_PROXY på det här sättet är de följande mildrande åtgärder av clearing-värde för sidhuvud eller Avvisa begäran med en PROXY-huvud.
Om du behöver använda CGI av någon anledning, blockera förfrågningar som innehåller ett huvud med namnet "Proxy" eller rensa värdet i huvudet. Detta beror på att "Proxy" är inte en vanlig begäran huvudnamn och webbläsare kommer i allmänhet inte att skicka den.
Om du vill blockera en begäran som innehåller en Proxy-huvud (bästa lösningen) kör du följande kommando:
Appcmd ange config /section:requestfiltering / + requestlimits.headerLimits. [huvud = proxy, sizelimit = '0']
Obs! Appcmd.exe brukar inte sökvägen och finns i katalogen %systemroot%\system32\inetsrv
Du kan använda följande URL omarbetning regel för att rensa värdet i huvudet:
<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>
Obs! URL: en omarbetning är ett hämtningsbart tillägg till IIS och ingår inte i en standardinstallation av IIS.