Làm cách nào để loại bỏ Tiêu đề HTTP mặc định của ASP.Net MVC?


176

Mỗi trang trong một ứng dụng MVC tôi đang làm việc với các tiêu đề HTTP này để trả lời:

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

Làm thế nào để tôi ngăn chặn những điều này hiển thị?


2
Kiểm tra bài viết này Loại bỏ các tiêu đề HTTP không cần thiết trong IIS và ASP.NET , nó mô tả cách xóa tất cả các tiêu đề được liệt kê của bạn.
Pavel Morshenyuk

@PavelMorshenyuk Xin lỗi, bạn có tìm cách xóa tên máy chủ không? câu trả lời được chấp nhận không xóa Máy chủ
neda Derakhshesh

Câu trả lời:


285

X-Powered-Bylà một tiêu đề tùy chỉnh trong IIS. Kể từ IIS 7, bạn có thể xóa nó bằng cách thêm vào phần sau web.config:

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

Tiêu đề này cũng có thể được sửa đổi theo nhu cầu của bạn, để biết thêm thông tin, hãy tham khảo http://www.iis.net/ConfigReference/system.webServer/httpProtatio/customHeaders


Thêm phần này để web.configthoát khỏi X-AspNet-Versiontiêu đề:

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

Cuối cùng, để xóa X-AspNetMvc-Version, chỉnh sửa Global.asax.csvà thêm phần sau vào Application_Startsự kiện:

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

Bạn cũng có thể sửa đổi các tiêu đề trong thời gian chạy thông qua Application_PreSendRequestHeaderssự kiện trong Global.asax.cs. Điều này hữu ích nếu giá trị tiêu đề của bạn là động:

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

4
+1 - Vì lợi ích, 1) Tại sao bạn? 2) Nó có ảnh hưởng bất lợi nào không?
Anh

69
Bạn làm điều này vì lý do bảo mật để làm xáo trộn công nghệ bạn sử dụng để tạo các trang web của bạn. Điều này buộc tin tặc phải làm việc chăm chỉ hơn một chút.
RedFilter

20
@BritishDeveloper Đây là một khuyến nghị được đưa ra từ đánh giá bảo mật. Tôi đoán đó là cách tốt nhất để không quảng cáo ngăn xếp công nghệ của bạn, bởi vì điều đó giúp tin tặc nhắm vào các lỗ hổng cụ thể với nền tảng đó.
Paul Fasher

1
@RedFilter Cảm ơn bạn đã trả lời nhanh chóng và chi tiết!
Paul Fasher

6
Trên IIS 8, điều này không loại bỏ X-Powered-Bytiêu đề. Xem câu trả lời khác về làm thế nào để đạt được điều này trong web.config.
Knelis

105

Bạn cũng có thể xóa chúng bằng cách thêm mã vào tệp global.asax của mình:

 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
Trong trường hợp của tôi, chỉ có ba người cuối cùng làm việc, cho "X-Powered-By" tôi vẫn cần<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen

2
Trong trường hợp của tôi, không có tiêu đề nào ở trên được gỡ bỏ. tôi đang sử dụng .net 4.0 và IIS 7. Nhờ các bình luận khác trong chủ đề này. Tôi đã quản lý để xóa tất cả các tiêu đề không mong muốn ngoại trừ "Máy chủ", đây là trường hợp xấu nhất.
Farjad

2
Nó có hoạt động chống lại các tệp / hình ảnh / nội dung của bạn không đi qua đường dẫn mã không?
Mark Sowul

Bạn đã đặt gì vào "Máy chủ"? nó có nên như thế này không? Phản hồi.Headers.Remove ("Máy chủ: Microsoft-IIS / 7.0"); ? hoặc nó phải là "Máy chủ"? xin vui lòng giúp đỡ
neda Derakhshesh

kỳ lạ với bất cứ ai khác rằng "PreSendRequestHeaders" thực sự là gửi tiêu đề phản hồi trước?
JDPeckham

50

Tôi đã tìm thấy cấu hình này trong web.configđó dành cho một người New Web Site...được tạo trong Visual Studio (trái ngược với a New Project...). Vì câu hỏi nêu một ứng dụng ASP.NET MVC, không liên quan, nhưng vẫn là một tùy chọn.

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

Cập nhật : Ngoài ra, Troy Hunt có một bài viết có tiêu đề Shhh Do not đừng để tiêu đề phản hồi của bạn nói quá to với các bước chi tiết về cách loại bỏ các tiêu đề này cũng như liên kết đến công cụ ASafaWeb của anh ấy để quét chúng và các cấu hình bảo mật khác.


5
Tùy chọn tốt nhất nhưng yêu cầu iis7 + Bạn không cần <xóa /> chúng ... xóa là đủ .. bạn cũng có thể muốn thêm phần này vào system.webserver để xóa lỗ hổng khác: code <security> <requestFiltering> <verbs> <add verb = "TÙY CHỌN" được phép = "sai" /> </ động từ> </ requestFiltering> </ security>code
felickz

Tôi nghĩ phần tử <Clear /> xóa tất cả các tiêu đề, bao gồm cả 'X-Powererd-By', vì vậy phần tử <remove /> là dự phòng.
Jan H

32

Như được mô tả trong Che giấu ứng dụng web ASP.NET MVC của bạn trên IIS 7 , bạn có thể tắt tiêu đề X-AspNet-Version bằng cách áp dụng phần cấu hình sau cho web.config:

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

và xóa tiêu đề X-AspNetMvc-Version bằng cách thay đổi Global.asax.cs của bạn như sau:

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

Như được mô tả trong Tiêu đề tùy chỉnh Bạn có thể xóa tiêu đề "X-Powered-By" bằng cách áp dụng phần cấu hình sau cho web.config:

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

Không có cách nào dễ dàng để loại bỏ tiêu đề phản hồi "Máy chủ" thông qua cấu hình, nhưng bạn có thể thực hiện HttpModuleđể xóa Tiêu đề HTTP cụ thể như được mô tả trong Che giấu ứng dụng web ASP.NET MVC của bạn trên IIS 7 và trong cách gỡ bỏ máy chủ- x-aspnet-version-x-aspnetmvc-version-and-x-Powered-by-from-the-answer-header-in-iis7 .


Sử dụng câu trả lời bkaid tôi có thể xóa tiêu đề "Máy chủ". IIS 8.
tmorell

câu trả lời bkaid là tốt, nhưng nó yêu cầu mã hóa, vì vậy tôi tìm thấy giải pháp mà tôi mô tả là thuận tiện hơn, vì nó dựa trên cấu hình.
RonyK

32

Lõi .NET

Để xóa tiêu đề Máy chủ , trong tệp Program.cs , hãy thêm tùy chọn sau:

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

Đối với lõi mạng chấm 1, hãy thêm tùy chọn bên trong lệnh gọi .UseKestrel (). Đối với lõi net dot 2, hãy thêm dòng sau UseStartup ().

Để xóa tiêu đề X-Powered-By , nếu được triển khai vào IIS, hãy chỉnh sửa web.config của bạn và thêm phần sau vào bên trong thẻ system.webServer:

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

.NET 4.5.2

Để xóa tiêu đề Máy chủ , trong tệp global.asax của bạn, hãy thêm vào như sau:

    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);
                        }
                    }
                }
            });
        }

    }

Trước .NET 4.5.2

Thêm lớp c # sau vào dự án của bạn:

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");
    }
}

và sau đó trong web.config, hãy thêm phần <mô-đun> sau:

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

Tuy nhiên tôi gặp vấn đề khi các dự án phụ không thể tìm thấy mô-đun này. Không vui.

Xóa tiêu đề X-AspNetMvc-Phiên bản

Để xóa thẻ '' X-AspNetMvc-Version '', đối với mọi phiên bản .NET, hãy sửa đổi tệp '' web.config '' của bạn để bao gồm:

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

Cảm ơn Microsoft đã làm cho điều này khó khăn không thể tin được. Hoặc có thể đó là ý định của bạn để bạn có thể theo dõi các bản cài đặt IIS và MVC trên toàn thế giới ...


3
Trong thời đại ngày nay, đây được coi là một "thực tiễn tồi tệ nhất" và thật khó tin Microsoft vẫn biến "không an toàn" thành mặc định và rất khó để chọn tham gia "bảo mật". Nó nhắc nhở tôi về cách Windows ẩn các phần mở rộng tệp phổ biến theo mặc định để người dùng không nghi ngờ sẽ nhấp vào vi-rút. Tôi dường như nhớ lại Bill Gates tuyên bố "an toàn theo mặc định" vào năm 2003 - bất cứ điều gì đã xảy ra với ý tưởng đó?
mike nelson

2
@mikenelson nếu điều đó làm bạn cảm thấy tốt hơn, cố gắng xóa thẻ Máy chủ trong nginx cũng khó khăn như vậy - cuối cùng tôi đã phải tự hack mã nguồn thực tế.
Rocklan

Về RemoveServerHeaderModulenó sẽ không hoạt động trong dự án WebApi.
krypru

8

Như được hiển thị trên Xóa tiêu đề máy chủ tiêu chuẩn trên trang Windows Azure Web Site , bạn có thể xóa các tiêu đề bằng cách sau:

<?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>

Điều này loại bỏ tiêu đề Máy chủ và các tiêu đề X-.

Điều này đã làm việc tại địa phương trong các thử nghiệm của tôi trong Visual Studio 2015.


6
Thêm removeServerHeader = "true" đã gây ra lỗi 500 trên ứng dụng ASP.NET 4.5.3 của tôi
Rocklan

4
@LachlanB cái này đã được thêm vào IIS 10: IIS 10.0 đã thêm thuộc tính removeServerHeader để ngăn chặn việc gửi tiêu đề máy chủ HTTP đến các máy khách từ xa. Nguồn: iis.net/configreference/system.webserver/security/ Kẻ
SynerCoder

1
Tôi thích rằng trang Azure cung cấp ảnh chụp màn hình thay vì khối mã. Họ thực sự làm mọi thứ có thể để làm cho việc loại bỏ các thẻ không cần thiết và có khả năng nguy hiểm này trở nên khó khăn nhất có thể. Ngoài ra, tôi không thể tin rằng tôi đang tham khảo một câu hỏi SO ba tuổi để khắc phục vấn đề này, điều này cho thấy không có dấu hiệu được sửa chữa.
killa-byte

1
Tôi nghĩ rằng Web.config này không xóa tiêu đề X-AspNetMvc-Version. Để xóa cái đó, chúng ta cần thêm một cái gì đó vào Global.asax stackoverflow.com/a/20739875/1678525
Jan H

8

Trong Asp.Net Core, bạn có thể chỉnh sửa các tệp web.config như vậy:

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

Bạn có thể xóa tiêu đề máy chủ trong các tùy chọn Kestrel:

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

5

Kiểm tra blog này Đừng sử dụng mã để loại bỏ các tiêu đề. Nó không ổn định theo Microsoft

Tôi đảm nhận việc này:

<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

Để hoàn thiện, có một cách khác để loại bỏ Servertiêu đề, sử dụng regedit.

Xem blog MSDN này .

Tạo một mục DWORD có tên là DisableServerHeader trong khóa Sổ đăng ký sau và đặt giá trị thành 1.

HKLM \ HỆ THỐNG \ CurrentControlset \ Services \ HTTP \ Tham số

Tôi muốn tìm một giải pháp thích hợp bằng Web.config, nhưng sử dụng <rewrite>không tốt vì nó yêu cầu mô-đun viết lại phải được cài đặt, và thậm chí sau đó nó sẽ không thực sự xóa tiêu đề, chỉ làm trống nó.


Nếu điều này hoạt động có vẻ như một giải pháp tốt cho trường hợp của tôi. Tôi có 30 trang web trong các phiên bản khác nhau của .net và do đó sẽ cần 3 cách khác nhau để loại bỏ các tiêu đề và cập nhật mã trong tất cả các trang web này. Tôi muốn có một cài đặt cấu hình hoặc đăng ký hơn là phải sửa đổi mã.
mike nelson

Tôi đã áp dụng điều này thành công hai ngày trước, hoạt động tuyệt vời.
Rudey

2

Bạn có thể thay đổi bất kỳ tiêu đề hoặc bất cứ điều gì trong Application_EndRequest()thử này

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

1

Tiêu đề X-Powered-By được IIS thêm vào phản hồi HTTP, do đó bạn có thể xóa tiêu đề ngay cả ở cấp máy chủ thông qua Trình quản lý IIS:

Bạn có thể sử dụng web.config trực tiếp:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
</system.webServer>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.