อาการ
เมื่อคุณใช้ลักษณะการทำงานของ IIS ทั่วไปเกตเวย์อินเทอร์เฟซ (CGI) เมื่อต้องการโฮสต์โปรแกรมที่ใช้ในไลบรารีบางการร้องขอการเปลี่ยนเส้นทาง คำขออาจจะ misdirected ขึ้นอยู่กับการมีอยู่ของส่วนหัวที่ร้องขอ "พร็อกซี" แพลตฟอร์มแอพลิเคชันเว็บหลายทราบว่าการใช้ไลบรารีนี้ ซึ่งรวมถึง PHP, Python และ Go ระหว่างผู้อื่น
สาเหตุ
CGI คือ อินเทอร์เฟซที่ช่วยให้เว็บเซิร์ฟเวอร์เป็นโปรแกรมประยุกต์ที่เรียกใช้เป็นกระบวนการที่เรียกใช้งานได้ เมื่อได้รับคำขอ โดยเว็บเซิร์ฟเวอร์ เซิร์ฟเวอร์เริ่มต้นกระบวนการใหม่เพื่อจัดการการร้องขอที่หนึ่ง เมื่อคำขอเสร็จสมบูรณ์แล้ว ออกจากกระบวนการ ในใบสั่งสำหรับกระบวนการของการเข้าถึงข้อมูลร้องขอ ส่วนหัวของคำขอถูกรวมไว้เป็นตัวแปรสภาพแวดล้อมที่มี "HTTP_" สัมบูรณ์ไปที่ชื่อของพวกเขา ดังนั้น กระบวนการสำหรับการร้องขอที่ประกอบด้วยส่วนหัวที่มีชื่อว่า "พร็อกซี" CGI มีตัวแปรสภาพแวดล้อม "HTTP_PROXY" ที่มีค่าเดียวกันกับหัวข้อที่ร้องขอ
บรรทัดคำสั่งม้วนและไลบรารีโดยปกติจะใช้เพื่อเปิดใช้งานชนิดต่าง ๆ ของโปรแกรมประยุกต์เพื่อทำให้การร้องขอไปยังเซิร์ฟเวอร์ เว็บเซิร์ฟเวอร์รวมถึงชนิดต่าง ๆ คุณสามารถกำหนดค่าไลบรารีนี้ได้ โดยใช้พารามิเตอร์บรรทัดคำสั่ง หรือจะสามารถอ่านพารามิเตอร์การกำหนดค่าจากตัวแปรสภาพแวดล้อมกระบวนการโฮสต์ "HTTP_PROXY" เป็นหนึ่งในพารามิเตอร์การตั้งค่าคอนฟิกจำนวนมากที่ใช้ โดยม้วนกระดาษ ม้วนกระดาษใช้ "HTTP_PROXY" เมื่อต้องการส่งการร้องขอ HTTP ผ่านทางพร็อกซีกำหนดค่าไว้
หมายเหตุ ซึ่งไม่เกี่ยวข้องกับ "HTTP_PROXY" จะเป็นการนำเสนอของส่วนหัวของคำขอไคลเอนต์
เมื่อม้วนถูกโฮสต์ภายในกระบวนการ CGI และ ที่กระบวนประกอบด้วยตัวแปรสภาพแวดล้อมที่มีชื่อว่า "HTTP_PROXY" ม้วนกระดาษใช้ค่าของการส่งข้อมูลผ่านทางพร็อกซี HTTP ซึ่งมีค่าที่ระบุไว้ในตัวแปรของสภาพแวดล้อมที่ร้องขอ เหตุการณ์นี้เกิดขึ้นเนื่องจากม้วนคาดหวังว่า "HTTP_PROXY" เป็นคำสั่งการตั้งค่าคอนฟิกและไม่มีไคลเอนต์ร้องขอหัวข้อ
วิธีแก้ปัญหา
เมื่อต้องการหลีกเลี่ยงปัญหานี้ ห้ามใช้ CGI บนเซิร์ฟเวอร์ที่กำลังเรียกใช้ IIS CGI คือ อินเทอร์เฟซที่ล้าสมัยเป็นส่วนใหญ่ที่ถูกแทนที่ ด้วยอินเทอร์เฟซใหม่ และเพิ่มประสิทธิภาพการทำงานที่เกี่ยวข้อง โดยเฉพาะอย่างยิ่ง PHP, Python และโกควรถูกโฮสต์ผ่าน FastCGI ใน IIS FastCGI ใช้ตัวแปรสภาพแวดล้อมสำหรับหัวข้อการร้องขอของไคลเอ็นต์ และไม่มีการตัดสินค้าจากคลังนี้ อย่างไรก็ตาม สำหรับ PHP โปรแกรมประยุกต์บางโปรแกรมอาจใช้ฟังก์ชันgetenv() PHPs เพื่อเรียกตัวแปรสภาพแวดล้อม ได้แม้กระทั่งเมื่อ PHP ไม่ได้โฮสต์ภายในกระบวนการ CGI เหมือนกับลักษณะการทำงานของ CGI โดย injecting ค่าส่วนหัวของคำขอลงในชุดของข้อมูลที่พร้อมใช้งานสำหรับฟังก์ชันของgetenv() ถ้าคุณใช้โปรแกรมประยุกต์แบบ PHP ที่เรียก HTTP_PROXY ในลักษณะนี้ mitigations ที่ต่อไปนี้ของการล้างค่าของส่วนหัว หรือปฏิเสธการร้องขอ มีส่วนหัวของพร็อกซีจะมีผลบังคับใช้
ถ้าคุณจำเป็นต้องใช้ CGI เหตุผลบางประการ บล็อกการร้องขอที่ประกอบด้วยชื่อว่า "พร็อกซี" หัวข้อคำขอ หรือยกเลิกเลือกค่าของส่วนหัว เป็นเช่นนี้ เพราะ "พร็อกซี" ไม่ใช่ชื่อส่วนหัวของคำขอมาตรฐาน และเบราว์เซอร์จะโดยทั่วไปจะไม่ส่ง
เมื่อต้องการบล็อกการร้องขอที่ประกอบด้วยส่วนหัวของพร็อกซี (โซลูชันที่ต้องการ), เรียกใช้บรรทัดคำสั่งต่อไปนี้:
/section:requestfiltering การกำหนดค่าการตั้งค่า appcmd / + requestlimits.headerLimits [หัวข้อ 'พร็อกซี' 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 เริ่มต้น