Gejala
Ketika Anda menggunakan fitur IIS Common Gateway Interface (CGI) ke host program yang dapat dijalankan yang menggunakan perpustakaan tertentu untuk mengarahkan permintaan, permintaan mungkin akan salah arah berdasarkan pada keberadaan header permintaan "PROXY". Beberapa platform aplikasi web yang dikenal menggunakan perpustakaan ini. Ini termasuk PHP, Python dan Go, antara lain.
Penyebab
CGI adalah antarmuka yang memungkinkan server web untuk aplikasi host yang dijalankan sebagai proses yang dapat dijalankan. Ketika permintaan diterima oleh web server, server mulai proses baru untuk menangani permintaan tunggal. Ketika permintaan selesai, proses akan keluar. Agar proses untuk mendapatkan akses ke data permintaan, header permintaan disertakan sebagai variabel lingkungan yang memiliki "HTTP_" prepended ke nama. Oleh karena itu, proses CGI untuk permintaan yang berisi judul yang bernama "Proxy" memiliki variabel lingkungan "HTTP_PROXY" yang memiliki nilai yang sama sebagai header permintaan.
Baris perintah cURL dan Perpustakaan biasanya digunakan untuk mengaktifkan berbagai macam aplikasi untuk membuat permintaan untuk berbagai jenis server, termasuk server web. Perpustakaan ini dapat dikonfigurasi menggunakan parameter baris perintah, atau dapat membaca parameter konfigurasi dari variabel lingkungan host proses. "HTTP_PROXY" adalah salah satu dari banyak parameter konfigurasi yang digunakan oleh cURL. "HTTP_PROXY" digunakan oleh cURL untuk mengirim permintaan HTTP melalui proksi dikonfigurasi.
Catatan Hal ini tidak terkait dengan "HTTP_PROXY" sebagai representasi header permintaan klien.
Ketika cURL berada dalam proses CGI, dan proses berisi variabel lingkungan yang bernama "HTTP_PROXY", cURL menggunakan nilai untuk mengirim data yang diminta melalui HTTP proxy nilai yang ditetapkan di variabel lingkungan. Ini terjadi karena cURL mengharapkan "HTTP_PROXY" adalah petunjuk konfigurasi dan tidak header permintaan klien.
Pemecahan masalah
Untuk mengatasi masalah ini, jangan gunakan CGI di server yang menjalankan IIS. CGI adalah antarmuka sebagian besar lama yang digantikan dengan antarmuka yang lebih baru dan lebih terkait kinerja. Khususnya, PHP, Python dan Go harus host melalui FastCGI pada IIS. FastCGI tidak menggunakan variabel lingkungan untuk header permintaan klien dan tidak memiliki masalah ini. Namun untuk PHP, beberapa aplikasi mungkin menggunakan fungsi getenv() PHPs untuk mengambil variabel lingkungan. Bahkan ketika PHP tidak berada di dalam proses CGI, itu meniru perilaku CGI dengan memasukkan nilai-nilai header permintaan ke set data yang tersedia untuk fungsi getenv() . Jika Anda menggunakan aplikasi PHP yang mengambil HTTP_PROXY dengan cara ini, mitigations berikut menghapus nilai header atau menolak permintaan dengan PROXY header efektif.
Jika Anda harus menggunakan CGI untuk beberapa alasan, memblokir permintaan yang berisi header permintaan yang bernama "Proxy" atau menghapus nilai header. Hal ini karena "Proxy" bukan nama header permintaan standar dan browser umumnya tidak akan mengirimkan informasi.
Untuk memblokir permintaan yang berisi header Proxy (solusi yang dipilih), jalankan baris perintah berikut ini:
appcmd menetapkan konfigurasi /section:requestfiltering / + requestlimits.headerLimits. [header = proxy, sizelimit = '0']
Catatan Appcmd.exe tidak biasanya di jalur dan dapat ditemukan di direktori %systemroot%\system32\inetsrv
Untuk menghapus nilai header, Anda dapat menggunakan aturan penulisan ulang URL berikut ini:
<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>
Catatan Penulisan ulang URL yang dapat diunduh add-in untuk IIS dan tidak disertakan di penginstalan asali IIS.