การลบ / ซ่อน / ปิดใช้งานส่วนหัวการตอบกลับ HTTP ที่มากเกินไปใน Azure / IIS7 โดยไม่มี UrlScan


86

ฉันต้องการลบส่วนหัวที่มากเกินไป (โดยหลักแล้วจะต้องผ่านการทดสอบการเจาะ) ผมได้ใช้เวลามองไปที่การแก้ปัญหาที่เกี่ยวข้องกับการทำงาน UrlScan แต่เหล่านี้จะยุ่งยากเป็นUrlScan จะต้องติดตั้งในแต่ละครั้งตัวอย่าง Azure จะเริ่มต้น

ต้องมีโซลูชันที่ดีสำหรับ Azure ที่ไม่เกี่ยวข้องกับการปรับใช้โปรแกรมติดตั้งจาก startup.cmd

ฉันเข้าใจว่ามีการเพิ่มส่วนหัวการตอบกลับในที่ต่างๆ :

  • เซิร์ฟเวอร์ : เพิ่มโดย IIS
  • X-AspNet-Version : เพิ่มโดย System.Web.dll ในช่วงเวลาของ Flush ในคลาส HttpResponse
  • X-AspNetMvc-Version : เพิ่มโดย MvcHandler ใน System.Web.dll
  • X-Powered-By : เพิ่มโดย IIS

มีวิธีใดบ้างในการกำหนดค่า (ผ่าน web.config เป็นต้น) IIS7 เพื่อลบ / ซ่อน / ปิดใช้งานส่วนหัวการตอบกลับ HTTP เพื่อหลีกเลี่ยงคำเตือน "ส่วนหัวที่มากเกินไป" ที่asafaweb.comโดยไม่ต้องสร้างโมดูล IIS หรือปรับใช้โปรแกรมติดตั้งซึ่งจำเป็นต้อง เรียกใช้ทุกครั้งที่อินสแตนซ์ Azure เริ่มทำงานหรือไม่

คำตอบ:


139

การเปลี่ยนแปลงต่อไปนี้ช่วยให้คุณสามารถลบส่วนหัวการตอบกลับ HTTP เหล่านี้ใน Azure ได้โดยไม่ต้องเขียน HttpModule แบบกำหนดเอง

ข้อมูลส่วนใหญ่ในเน็ตล้าสมัยและเกี่ยวข้องกับ UrlScan (ซึ่งตั้งแต่นั้นมาได้รวมเข้ากับ IIS7 แต่มีการRemoveServerHeader=1ลบตัวเลือกออกไป) ด้านล่างเป็นวิธีการแก้ neatest ที่ฉันได้พบ (ขอบคุณบล็อกนี้ , คำตอบนี้และบล็อกนี้รวมกัน)

ในการลบเซิร์ฟเวอร์ไปที่ Global.asax ค้นหา / สร้างApplication_PreSendRequestHeadersเหตุการณ์และเพิ่มสิ่งต่อไปนี้ (ขอบคุณBKและบล็อกนี้สิ่งนี้จะไม่ล้มเหลวใน Cassini / local dev):

แก้ไขเมื่อเมษายน 2014: คุณสามารถใช้เหตุการณ์ PreSendRequestHeaders และ PreSendRequestContext กับโมดูล IIS ดั้งเดิมได้ แต่อย่าใช้กับโมดูลที่มีการจัดการที่ใช้ IHttpModule การตั้งค่าคุณสมบัติเหล่านี้สามารถทำให้เกิดปัญหากับการร้องขอไม่ตรงกัน เวอร์ชันที่ถูกต้องคือการใช้เหตุการณ์ BeginRequest

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null && application.Context != null)
        {
            application.Context.Response.Headers.Remove("Server");
        }
    }

ในการลบX-AspNet-Versionใน web.config ให้ค้นหา / สร้าง<system.web>และเพิ่ม:

  <system.web>
    <httpRuntime enableVersionHeader="false" />

    ...

ในการลบX-AspNetMvc-Versionให้ไปที่ Global.asax ค้นหา / สร้างApplication_Startเหตุการณ์และเพิ่มบรรทัดดังนี้:

  protected void Application_Start()
  {
      MvcHandler.DisableMvcResponseHeader = true;
  }

ในการลบX-Powered-Byใน web.config ค้นหา / สร้าง<system.webServer>และเพิ่ม:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>

    ...

ตามคำใบ้ใน VS ไม่จำเป็นต้องตรวจสอบคำขอการตอบกลับหรือการตอบกลับที่ว่างเปล่าส่วนหัว
Chris Haines

1
เมื่อใช้บน IIS ไม่ใช่ Azure โปรดทราบว่าพูลแอปพลิเคชันจะต้องอยู่ในโหมดรวม และ. IsLocal ควรถูกลบออกเมื่อทำการดีบักในเครื่อง
IvanH

5
ไม่จำเป็นต้องมี "เงื่อนไข Yoda" ใน C # - ไม่อนุญาตให้มอบหมายงานแบบมีเงื่อนไขen.wikipedia.org/wiki/Yoda_Conditions
tvanfosson

1
ขอบคุณสำหรับคำตอบโดยละเอียดอย่างไรก็ตามฉันได้ลองและติดตามขั้นตอน แต่ทุกครั้งที่สแกนไซต์โดยใช้ asafweb มันยังคงกล่าวถึงปัญหาเกี่ยวกับส่วนหัวที่มากเกินไป (X-AspNet-Version) ฉันยังใช้ URLRewrite เพื่อลบส่วนหัวนี้ มีความเป็นไปได้อื่น ๆ ในการลบออกหรือไม่?
Raymond A

4
ยังคงมีปัญหาในการขอไฟล์ที่ไม่มีอยู่จริงเช่น " yoursite / foo.jpg " เนื่องจากคำขอนี้ไม่ได้รับการประมวลผลโดย MVC ส่วนหัวการตอบกลับ "Server: IIS xy" จะยังคงอยู่ที่นั่น วิธีแก้ปัญหาหนึ่งที่ใช้ได้กับเว็บไซต์ Azure (และเห็นได้ชัดเฉพาะสำหรับเว็บไซต์สีฟ้า) คือการเพิ่มสิ่งนี้ภายใต้ <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
เอเดรียนเอช.

12

MSDN เผยแพร่บทความนี้เกี่ยวกับวิธีซ่อนส่วนหัวบนเว็บไซต์ Azure ตอนนี้คุณสามารถซ่อนเซิร์ฟเวอร์จาก web.config ได้โดยเพิ่มรายการใน system.webServer

<security>
      <requestFiltering removeServerHeader ="true" />
</security>

VS จะขมวดคิ้วที่ด้านบนว่าไม่ถูกต้องแม้ว่า ลิงค์ด้านบนมีโค้ดเป็นรูปหายาก เวอร์ชัน MVC ยังคงซ่อนอยู่ในแอปพลิเคชันเริ่มต้นเช่นเดียวกับเวอร์ชัน x-powered-by และ. Net


3
นี่คือว่าสิ่งที่ผมกำลังมองหา ขอขอบคุณ.
Martin Costello

3
สิ่งนี้อาจใช้ได้กับ Azure แต่ไม่ใช่ที่อื่น ความคิดเห็นในบทความนั้นทำให้เกิดความสับสนเช่นเดียวกับการทดสอบของฉันเอง คำตอบโดย @ giveme5minutes คือวิธีการทำงาน
CrazyPyro

จะเป็นการดีที่ได้ทราบว่ามีการนำอะไรมาใช้เพื่อสร้างฟังก์ชันนี้: | โดยเฉพาะอย่างยิ่งเนื่องจากก่อนหน้านี้ URL SCAN ได้นำสิ่งนี้ออกจากกล่อง
felickz

6

นอกจากนี้ยังมีแพ็คเกจใน NuGet ที่ช่วยให้คุณทำสิ่งนี้ได้ผ่านการกำหนดค่าไม่กี่บรรทัดและไม่มีการเปลี่ยนแปลงโค้ด: NWebsec สามารถดูเอกสารเกี่ยวกับการลบส่วนหัวของเวอร์ชันได้ที่นี่: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

มีการสาธิตที่นี่: http://www.nwebsec.com/HttpHeaders/VersionHeaders (ใน Azure)

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้พัฒนาโครงการ


"NWebsec ช่วยคุณระงับส่วนหัวเวอร์ชันเหล่านี้เกือบทั้งหมดกล่าวคือทั้งหมดยกเว้นส่วนหัวของเซิร์ฟเวอร์: Microsoft-IIS / 8.0" :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz

ย้ายจาก codeplex ไปยัง GitHub (โปรดอัปเดตลิงก์github.com/NWebsec/NWebsec/wiki )
Nordes

6

คำตอบของ Nick Evans นั้นสมบูรณ์แบบ แต่ ...

หากคุณลบส่วนหัวเหล่านี้เพื่อจุดประสงค์ด้านความปลอดภัยอย่าลืมเปลี่ยนASP.NET Session coockie name! เนื่องจากง่ายต่อการคาดเดาภาษาที่ใช้หรือเวอร์ชันเซิร์ฟเวอร์เมื่อคุณเห็นสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

ในการเปลี่ยนชื่อคุกกี้: (มีความคิดสร้างสรรค์)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>

การเปลี่ยนชื่อคุกกี้มีประโยชน์มากกว่าการเปิดรับเทคโนโลยีเซิร์ฟเวอร์เพียงอย่างเดียวเช่นลดความเสี่ยงของการเก็บเกี่ยวเซสชั่นทั่วไป
mlhDev

4

รวบรวมคำตอบก่อนหน้านี้จาก @ giveme5minutes และ @AKhooli ตามที่เกี่ยวข้องกับเว็บไซต์ Azure รวมถึงรายการอื่น ๆ ที่สแกนเนอร์ต้องการดูนี่คือการเปลี่ยนแปลงที่ฉันทำเพื่อให้ ASafaWeb พอใจกับไซต์ Azure

มันยังคงบ่นเกี่ยวกับคุกกี้ส่วนหัวความสัมพันธ์ของ Azure ที่ไม่ได้เป็น https เท่านั้น แต่ความสัมพันธ์เป็นประเภทของคุกกี้ที่คุณต้องการให้เล่นซ้ำใช่ไหม

<system.web>
    <compilation debug="false">
    <httpRuntime enableVersionHeader="false" />
    <httpCookies httpOnlyCookies="true" requireSSL="true" />    
    <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx" />
</system.web>

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="DENY" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <security>
      <!--removes Azure headers-->
      <requestFiltering removeServerHeader="true" />
    </security>
</system.webServer>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.