วิธีการลบส่วนหัว HTTP HTTP เริ่มต้นของ ASP.Net MVC


176

แต่ละหน้าในแอปพลิเคชัน MVC ฉันกำลังทำงานกับการตั้งค่าส่วนหัว HTTP เหล่านี้ในการตอบสนอง:

X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0

ฉันจะป้องกันไม่ให้สิ่งเหล่านี้แสดงได้อย่างไร


2
ลองดูที่บทความนี้การลบส่วนหัว HTTP ที่ไม่จำเป็นใน IIS และ ASP.NETอธิบายถึงวิธีลบส่วนหัวที่คุณระบุไว้ทั้งหมด
Pavel Morshenyuk

@PavelMorshenyuk ขอโทษฉันคุณหาวิธีลบชื่อเซิร์ฟเวอร์ด้วยหรือไม่? คำตอบที่ยอมรับไม่ได้ลบเซิร์ฟเวอร์
neda Derakhshesh

คำตอบ:


285

X-Powered-Byเป็นส่วนหัวที่กำหนดเองใน IIS ตั้งแต่ IIS 7 คุณสามารถลบออกได้โดยเพิ่มสิ่งต่อไปนี้ในweb.config:

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

ส่วนหัวนี้สามารถปรับเปลี่ยนได้ตามความต้องการของคุณสำหรับข้อมูลเพิ่มเติมดูที่http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


เพิ่มส่วนนี้เพื่อweb.configกำจัดX-AspNet-Versionส่วนหัว:

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

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

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

นอกจากนี้คุณยังสามารถปรับเปลี่ยนส่วนหัวที่รันไทม์ผ่านเหตุการณ์ในApplication_PreSendRequestHeaders Global.asax.csสิ่งนี้มีประโยชน์หากค่าส่วนหัวของคุณเป็นแบบไดนามิก:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}

4
+1 - เพื่อประโยชน์ของความสนใจ 1) ทำไมคุณจะ 2) มันมีผลกระทบใด ๆ หรือไม่?
พัฒนาชาวอังกฤษ

69
คุณทำเช่นนี้ด้วยเหตุผลด้านความปลอดภัยเพื่อทำให้งงงวยเทคโนโลยีที่คุณใช้ในการสร้างหน้าเว็บของคุณ วิธีนี้ทำให้แฮกเกอร์ทำงานหนักขึ้นเล็กน้อย
RedFilter

20
@BritishDeveloper นี่เป็นคำแนะนำที่มาจากการตรวจสอบความปลอดภัย ฉันคิดว่านี่เป็นแนวปฏิบัติที่ดีที่สุดที่จะไม่โฆษณาเทคโนโลยีสแต็คของคุณเพราะจะช่วยให้แฮกเกอร์กำหนดเป้าหมายเฉพาะช่องโหว่ด้วยแพลตฟอร์มนั้น
Paul Fryer

1
@ RedFilter ขอบคุณสำหรับคำตอบที่รวดเร็วและละเอียดของคุณ!
Paul Fryer

6
ใน IIS 8 จะไม่ลบX-Powered-Byส่วนหัว ดูคำตอบอื่น ๆ web.configเกี่ยวกับวิธีการประสบความสำเร็จในครั้งนี้
Knelis

105

คุณสามารถลบออกได้โดยเพิ่มรหัสลงในไฟล์ global.asax ของคุณ:

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
 {
   HttpContext.Current.Response.Headers.Remove("X-Powered-By");
   HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
   HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
   HttpContext.Current.Response.Headers.Remove("Server");
 }

29
ในกรณีของฉันมีเพียงสามงานที่ทำล่าสุดสำหรับ "X-Powered-By" ฉันยังต้องการ<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen

2
ในกรณีของฉันไม่มีส่วนหัวด้านบนถูกลบออก ฉันใช้. net 4.0 และ IIS 7 ขอบคุณความคิดเห็นอื่น ๆ ในหัวข้อนี้ ฉันจัดการเพื่อลบส่วนหัวที่ไม่พึงประสงค์ทั้งหมดยกเว้น "เซิร์ฟเวอร์" ซึ่งเป็นกรณีที่เลวร้ายที่สุด
Farjad

2
มันทำงานกับไฟล์เนื้อหา / ภาพ / ฯลฯ ของคุณที่ไม่ได้ผ่านเส้นทางรหัสหรือไม่
Mark Sowul

คุณใส่อะไรลงใน "เซิร์ฟเวอร์" มันควรจะเป็นแบบนี้? Response.Headers.Remove ("เซิร์ฟเวอร์: Microsoft-IIS / 7.0"); ? หรือควรเป็น "เซิร์ฟเวอร์" โปรดช่วยด้วย
neda Derakhshesh

แปลกสำหรับคนอื่น ๆ ที่ "PreSendRequestHeaders" เป็นจริงก่อนส่งส่วนหัวการตอบสนอง
JDPeckham

50

ฉันพบการกำหนดค่านี้ในของฉันweb.configซึ่งสำหรับNew Web Site...สร้างใน Visual Studio (ตรงข้ามกับ a New Project...) เนื่องจากคำถามระบุแอปพลิเคชัน ASP.NET MVC ซึ่งไม่เกี่ยวข้องเท่ากัน แต่ยังคงเป็นตัวเลือก

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

ปรับปรุง : นอกจากนี้ Troy Hunt มีบทความชื่อShhh …อย่าปล่อยให้ส่วนหัวการตอบสนองของคุณพูดอย่างดังด้วยขั้นตอนโดยละเอียดเกี่ยวกับการลบส่วนหัวเหล่านี้รวมถึงลิงก์ไปยังเครื่องมือASafaWebของเขาเพื่อสแกนหาพวกเขาและการกำหนดค่าความปลอดภัยอื่น ๆ


5
ตัวเลือกที่ดีที่สุด แต่ต้องการ iis7 + คุณไม่จำเป็นต้อง <clear /> พวกเขา ... remove ก็พอ .. และคุณอาจต้องการเพิ่มสิ่งนี้ใน system.webserver เพื่อลบช่องโหว่อื่น: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" allow = "false" /> </verbs> </requestFiltering> </security>code
felickz

ฉันคิดว่าองค์ประกอบ <clear /> ล้างส่วนหัวทั้งหมดรวมถึง 'X-Powererd-By' ดังนั้นองค์ประกอบ <remove /> จึงซ้ำซ้อน
Jan H

33

.NET Core

หากต้องการลบส่วนหัวเซิร์ฟเวอร์ภายในไฟล์Program.csให้เพิ่มตัวเลือกต่อไปนี้:

.UseKestrel(opt => opt.AddServerHeader = false)

สำหรับ dot net core 1 ให้เพิ่มตัวเลือกในการโทร. Usseest () สำหรับ dot net core 2 ให้เพิ่มบรรทัดหลัง UseStartup ()

หากต้องการลบส่วนหัวX-Powered-Byหากนำไปใช้กับ IIS ให้แก้ไข web.config ของคุณและเพิ่มหัวข้อต่อไปนี้ภายในแท็ก system.webServer:

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

.NET 4.5.2

หากต้องการลบส่วนหัวเซิร์ฟเวอร์ภายในไฟล์global.asaxของคุณให้เพิ่มรายการต่อไปนี้:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string[] headers = { "Server", "X-AspNet-Version" };

        if (!Response.HeadersWritten)
        {
            Response.AddOnSendingHeaders((c) =>
            {
                if (c != null && c.Response != null && c.Response.Headers != null)
                {
                    foreach (string header in headers)
                    {
                        if (c.Response.Headers[header] != null)
                        {
                            c.Response.Headers.Remove(header);
                        }
                    }
                }
            });
        }

    }

พื้นฐาน. NET 4.5.2

เพิ่มคลาส c # ต่อไปนี้ลงในโครงการของคุณ:

public class RemoveServerHeaderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove("Server");
    }
}

จากนั้นภายใน web.config ของคุณให้เพิ่มส่วน <modules> ต่อไปนี้:

<system.webServer>
    ....
 <modules>
    <add name="RemoveServerHeaderModule" type="MyNamespace.RemoveServerHeaderModule" />
 </modules>

อย่างไรก็ตามฉันมีปัญหาที่ไม่สามารถหาโมดูลย่อยได้ ไม่สนุก.

การลบส่วนหัว X-AspNetMvc-Version

หากต้องการลบแท็ก '' X-AspNetMvc-Version '' สำหรับ. NET เวอร์ชันใด ๆ ให้แก้ไขไฟล์ '' web.config '' ของคุณเพื่อรวม:

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

ขอบคุณ Microsoft ที่ทำให้สิ่งนี้ยากอย่างไม่น่าเชื่อ หรืออาจเป็นความตั้งใจของคุณเพื่อให้คุณสามารถติดตามการติดตั้ง IIS และ MVC ทั่วโลก ...


3
ในวันนี้และอายุนี้ถือว่าเป็น "การปฏิบัติที่เลวร้ายที่สุด" และมันยากที่จะเชื่อว่า Microsoft ยังคงทำให้ "ไม่ปลอดภัย" เป็นค่าเริ่มต้นและหากินในการเลือกที่จะ "ปลอดภัย" มันเตือนฉันว่า Windows ซ่อนนามสกุลไฟล์ทั่วไปไว้อย่างไรโดยค่าเริ่มต้นผู้ใช้ที่ไม่สงสัยจะคลิกไวรัส ฉันดูเหมือนจะจำ Bill Gates ประกาศว่า "ปลอดภัยโดยค่าเริ่มต้น" ในปี 2003 - สิ่งที่เกิดขึ้นกับความคิดที่ว่า?
ไมค์เนลสัน

2
@mikenelson ถ้ามันทำให้คุณรู้สึกดีขึ้นการพยายามลบแท็กเซิร์ฟเวอร์ใน nginx นั้นเป็นเรื่องยาก - ฉันลงเอยด้วยการแฮ็คซอร์สโค้ดตัวจริง
Rocklan

เกี่ยวกับRemoveServerHeaderModuleมันจะไม่ทำงานในโครงการ WebApi
krypru

32

ตามที่อธิบายไว้ในการปิดแอปพลิเคชันเว็บ ASP.NET MVC ของคุณบน IIS 7คุณสามารถปิดส่วนหัว X-AspNet-Version ได้โดยใช้ส่วนการกำหนดค่าต่อไปนี้กับ web.config ของคุณ:

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

และลบส่วนหัว X-AspNetMvc-Version โดยแก้ไข Global.asax.cs ของคุณดังนี้:

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

ตามที่อธิบายในCustom Headersคุณสามารถลบหัวข้อ "X-Powered-By" โดยใช้ส่วนกำหนดค่าต่อไปนี้กับ web.config ของคุณ:

<system.webServer>
   <httpProtocol>
      <customHeaders>
         <clear />
      </customHeaders>
   </httpProtocol>
</system.webServer>

ไม่มีวิธีที่ง่ายในการลบส่วนหัวการตอบสนอง "เซิร์ฟเวอร์" ผ่านการกำหนดค่า แต่คุณสามารถนำไปใช้HttpModuleเพื่อลบส่วนหัว HTTP เฉพาะดังที่อธิบายไว้ในการปิดแอปพลิเคชันเว็บ ASP.NET MVC ของคุณบน IIS 7และวิธีลบเซิร์ฟเวอร์ x-aspnet


ใช้คำตอบ bkaid ฉันสามารถลบส่วนหัว "เซิร์ฟเวอร์" IIS 8.
tmorell

คำตอบ bkaid นั้นใช้ได้ แต่ต้องใช้การเข้ารหัสดังนั้นฉันจึงพบวิธีแก้ปัญหาที่ฉันอธิบายว่าสะดวกกว่าเนื่องจากเป็นค่าคอนฟิเกอเรชัน
RonyK

8

ดังที่แสดงในการลบส่วนหัวของเซิร์ฟเวอร์มาตรฐานในหน้าเว็บไซต์ Windows Azureคุณสามารถลบส่วนหัวดังต่อไปนี้:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
      </customHeaders>
    </httpProtocol>
    <security>
      <requestFiltering removeServerHeader="true"/>
    </security>
  </system.webServer>
  <system.web>
    <httpRuntime enableVersionHeader="false" />
  </system.web>
</configuration>

สิ่งนี้จะลบส่วนหัวของเซิร์ฟเวอร์และส่วนหัว X-

สิ่งนี้ใช้ได้ในการทดสอบของฉันใน Visual Studio 2015


6
การเพิ่ม removeServerHeader = "true" ทำให้ฉันมีข้อผิดพลาด 500 ข้อในแอป ASP.NET 4.5.3 ของฉัน
Rocklan

4
@LachlanB สิ่งนี้ถูกเพิ่มเข้ามาใน IIS 10: IIS 10.0 ได้เพิ่มคุณสมบัติ removeServerHeader เพื่อไม่ให้ส่งหัว HTTP เซิร์ฟเวอร์ไปยังไคลเอนต์ระยะไกล ที่มา: iis.net/configreference/system.webserver/security/ …
SynerCoder

1
ฉันชอบที่หน้า Azure ให้ภาพหน้าจอมากกว่าบล็อกโค้ด พวกเขาทำทุกอย่างที่ทำได้เพื่อลบแท็กที่ไม่จำเป็นและอาจเป็นอันตรายออกได้ยากที่สุด นอกจากนี้ฉันไม่อยากจะเชื่อว่าฉันกำลังอ้างอิงคำถาม SO สามปีเพื่อแก้ไขปัญหานี้ซึ่งไม่แสดงสัญญาณของการแก้ไข
killa-byte

1
ฉันคิดว่า Web.config นี้ไม่ได้ลบส่วนหัว X-AspNetMvc-Version ในการลบอันนั้นเราจำเป็นต้องเพิ่มบางสิ่งใน Global.asax stackoverflow.com/a/20739875/1678525
Jan H

8

ใน Asp.Net Core คุณสามารถแก้ไขไฟล์ web.config ดังนี้:

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

คุณสามารถลบส่วนหัวของเซิร์ฟเวอร์ในตัวเลือก Kestrel:

            .UseKestrel(c =>
            {
                // removes the server header
                c.AddServerHeader = false;
            }) 

5

เลือกบล็อกนี้ อย่าใช้รหัสเพื่อลบส่วนหัว มันไม่เสถียรตามMicrosoft

สิ่งที่ฉันทำในสิ่งนี้:

<system.webServer>          
    <httpProtocol>
    <!-- Security Hardening of HTTP response headers -->
    <customHeaders>
        <!--Sending the new X-Content-Type-Options response header with the value 'nosniff' will prevent 
                Internet Explorer from MIME-sniffing a response away from the declared content-type. -->
        <add name="X-Content-Type-Options" value="nosniff" />

        <!-- X-Frame-Options tells the browser whether you want to allow your site to be framed or not. 
                 By preventing a browser from framing your site you can defend against attacks like clickjacking. 
                 Recommended value "x-frame-options: SAMEORIGIN" -->
        <add name="X-Frame-Options" value="SAMEORIGIN" />

        <!-- Setting X-Permitted-Cross-Domain-Policies header to “master-only” will instruct Flash and PDF files that 
                 they should only read the master crossdomain.xml file from the root of the website. 
                 https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
        <add name="X-Permitted-Cross-Domain-Policies" value="master-only" />

        <!-- X-XSS-Protection sets the configuration for the cross-site scripting filter built into most browsers. 
                 Recommended value "X-XSS-Protection: 1; mode=block". -->
        <add name="X-Xss-Protection" value="1; mode=block" />

        <!-- Referrer-Policy allows a site to control how much information the browser includes with navigations away from a document and should be set by all sites. 
                 If you have sensitive information in your URLs, you don't want to forward to other domains 
                 https://scotthelme.co.uk/a-new-security-header-referrer-policy/ -->
        <add name="Referrer-Policy" value="no-referrer-when-downgrade" />

        <!-- Remove x-powered-by in the response header, required by OWASP A5:2017 - Do not disclose web server configuration -->
        <remove name="X-Powered-By" />

        <!-- Ensure the cache-control is public, some browser won't set expiration without that  -->
        <add name="Cache-Control" value="public" />
    </customHeaders>
</httpProtocol>

<!-- Prerequisite for the <rewrite> section
            Install the URL Rewrite Module on the Web Server https://www.iis.net/downloads/microsoft/url-rewrite -->
<rewrite>
    <!-- Remove Server response headers (OWASP Security Measure) -->
    <outboundRules rewriteBeforeCache="true">
        <rule name="Remove Server header">
            <match serverVariable="RESPONSE_Server" pattern=".+" />

            <!-- Use custom value for the Server info -->
            <action type="Rewrite" value="Your Custom Value Here." />
        </rule>
    </outboundRules>
</rewrite>
</system.webServer>

4

เพื่อความสมบูรณ์มีวิธีอื่นในการลบ Serverส่วนหัวโดยใช้ regedit

ดูบล็อก MSDNนี้

สร้างรายการ DWORD ชื่อ DisableServerHeader ในคีย์รีจิสทรีต่อไปนี้และตั้งค่าเป็น 1

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

ฉันอยากจะหาวิธีแก้ปัญหาที่เหมาะสมโดยใช้ Web.config แต่การใช้<rewrite>ไม่ดีเพราะมันต้องติดตั้งโมดูลการเขียนซ้ำและแม้ว่ามันจะไม่ลบส่วนหัวจริงๆ


หากใช้งานได้ดูเหมือนว่าเป็นวิธีแก้ปัญหาที่ดีสำหรับเคสของฉัน ฉันมี 30 เว็บไซต์ใน. net รุ่นต่าง ๆ ดังนั้นต้องมี 3 วิธีในการลบส่วนหัวและอัปเดตรหัสในเว็บไซต์เหล่านี้ทั้งหมด ฉันควรจะมีการตั้งค่าหรือรีจิสตรีมากกว่าที่จะต้องแก้ไขโค้ด
ไมค์เนลสัน

ฉันใช้สิ่งนี้สำเร็จสองวันที่ผ่านมาใช้งานได้ดี
Rudey

2

คุณสามารถเปลี่ยนหัวข้อหรืออะไรก็ได้ในApplication_EndRequest()ลองนี้

protected void Application_EndRequest()
{
    // removing excessive headers. They don't need to see this.
    Response.Headers.Remove("header_name");
}

1

ส่วนหัว X-Powered-By ถูกเพิ่มโดย IIS ในการตอบสนอง HTTP ดังนั้นคุณสามารถลบออกได้แม้ในระดับเซิร์ฟเวอร์ผ่านตัวจัดการ IIS:

คุณสามารถใช้ web.config โดยตรง:

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