Xóa / Ẩn / Tắt tiêu đề phản hồi HTTP quá mức trong Azure / IIS7 mà không có UrlScan


86

Tôi cần loại bỏ các tiêu đề thừa (chủ yếu để vượt qua thử nghiệm thâm nhập). Tôi đã dành thời gian xem xét các giải pháp liên quan đến việc chạy UrlScan, nhưng các giải pháp này rất cồng kềnh vì UrlScan cần được cài đặt mỗi khi một phiên bản Azure được khởi động .

Phải có một giải pháp tốt cho Azure mà không liên quan đến việc triển khai trình cài đặt từ startup.cmd.

Tôi hiểu rằng các tiêu đề phản hồi được thêm vào những nơi khác nhau :

  • Máy chủ : do IIS thêm vào.
  • X-AspNet-Version : được System.Web.dll thêm vào tại thời điểm Flush trong lớp HttpResponse
  • X-AspNetMvc-Version : Được thêm bởi MvcHandler trong System.Web.dll.
  • X-Powered-By : được bổ sung bởi IIS

Có cách nào để định cấu hình (thông qua web.config, v.v.?) IIS7 để loại bỏ / ẩn / vô hiệu hóa tiêu đề phản hồi HTTP để tránh cảnh báo "Tiêu đề quá mức" tại asafaweb.com , mà không cần tạo mô-đun IIS hoặc triển khai trình cài đặt cần được chạy mỗi khi phiên bản Azure bắt đầu?

Câu trả lời:


139

Những thay đổi sau đây cho phép bạn xóa các tiêu đề phản hồi HTTP này trong Azure mà không cần viết HttpModule tùy chỉnh.

Hầu hết thông tin trên mạng đã lỗi thời và liên quan đến UrlScan (từ đó đã được tích hợp vào IIS7, nhưng với RemoveServerHeader=1tùy chọn bị loại bỏ). Dưới đây là giải pháp thú vị nhất tôi đã tìm thấy (nhờ blog này , câu trả lời này , và blog này kết hợp).

Để xóa Máy chủ , hãy truy cập Global.asax, tìm / tạo Application_PreSendRequestHeaderssự kiện và thêm những thứ sau (cảm ơn BKblog này cũng sẽ không bị lỗi trên Cassini / local dev):

Đã chỉnh sửa vào tháng 4 năm 2014: Bạn có thể sử dụng các sự kiện PreSendRequestHeaders và PreSendRequestContext với các mô-đun IIS gốc, nhưng không sử dụng chúng với các mô-đun được quản lý triển khai IHttpModule. Việc đặt các thuộc tính này có thể gây ra sự cố với các yêu cầu không đồng bộ . Phiên bản chính xác là sử dụng sự kiện 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óa X-AspNet-Version , trong web.config, hãy tìm / tạo <system.web>và thêm:

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

    ...

Để xóa X-AspNetMvc-Version , hãy truy cập Global.asax, tìm / tạo Application_Startsự kiện và thêm một dòng như sau:

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

Để xóa X-Powered-By , trong web.config, hãy tìm / tạo <system.webServer>và thêm:

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

    ...

Theo gợi ý trong VS, không cần phải chọn vô hiệu Yêu cầu, Phản hồi hoặc Phản hồi
Chris Haines

1
Khi được sử dụng trên IIS không phải Azure, hãy lưu ý rằng nhóm ứng dụng phải ở chế độ Tích hợp. Và .IsLocal nên được loại bỏ khi gỡ lỗi cục bộ.
IvanH

5
Không cần phải cho "điều kiện Yoda" trong C # - nó không cho phép chuyển nhượng trong một điều kiện, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson

1
Cảm ơn câu trả lời chi tiết, tuy nhiên tôi đã thử và làm theo các bước nhưng mỗi lần tôi quét trang web bằng asafweb, nó vẫn đề cập đến sự cố về tiêu đề quá mức (X-AspNet-Version). Tôi thậm chí đã sử dụng URLRewrite để xóa tiêu đề này. Họ có bất kỳ khả năng loại bỏ nó không?
Raymond A

4
Vẫn còn sự cố khi yêu cầu tệp không tồn tại, ví dụ: " yourite / foo.jpg ". Vì yêu cầu này không được MVC xử lý nên tiêu đề phản hồi "Máy chủ: IIS xy" sẽ vẫn ở đó. Một giải pháp phù hợp với Azure Web Sites (và dường như CHỈ dành cho các web Azure) là thêm nó vào trong <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.

12

MSDN đã xuất bản bài viết này về cách ẩn tiêu đề trên các trang web Azure. Bây giờ bạn có thể ẩn máy chủ khỏi web.config bằng cách thêm một mục vào system.webServer

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

VS sẽ cau mày ở trên vì không hợp lệ. Liên kết trên có mã là ảnh, khó tìm. Phiên bản MVC vẫn ẩn trong phần khởi động ứng dụng như trên, tương tự đối với phiên bản x-power-by và .Net.


3
Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn.
Martin Costello

3
Điều này có thể hiệu quả với Azure, nhưng không hiệu quả với bất kỳ nơi nào khác. Các nhận xét trên bài báo đó xác nhận điều này, cũng như thử nghiệm của riêng tôi. Câu trả lời của @ giveme5minutes là cách hoạt động.
CrazyPyro

Rất vui khi biết những gì đã được thực hiện để tạo ra chức năng này: | Đặc biệt là vì URL SCAN trước đây đã thực hiện điều này ra khỏi hộp.
felickz

6

Cũng có một gói trên NuGet giúp bạn đạt được điều này thông qua một vài dòng cấu hình và không có thay đổi đối với mã: NWebsec. Bạn có thể tìm tài liệu về cách xóa tiêu đề phiên bản tại đây: https://github.com/NWebsec/NWebsec/wiki/Suppress-version-headers

Nó được demo ở đây: http://www.nwebsec.com/HttpHeaders/VersionHeaders (trong Azure)

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển của dự án.


"NWebsec giúp bạn loại bỏ hầu như tất cả các tiêu đề phiên bản này, tức là tất cả trừ tiêu đề Máy chủ: Microsoft-IIS / 8.0." :( github.com/NWebsec/NWebsec/wiki/Suppress-version-headers
felickz

Nó đã chuyển từ codeplex sang GitHub (vui lòng cập nhật liên kết github.com/NWebsec/NWebsec/wiki )
Nordes

6

Câu trả lời của Nick Evans là hoàn hảo, nhưng ...

Nếu bạn xóa các tiêu đề này vì mục đích bảo mật , đừng quên thay đổi ASP.NET Session coockie name! Bởi vì bạn sẽ dễ dàng đoán được ngôn ngữ được sử dụng hoặc phiên bản máy chủ khi bạn thấy:

nhập mô tả hình ảnh ở đây

Để thay đổi tên cookie: (hãy sáng tạo)

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

Thay đổi tên cookie có nhiều lợi ích hơn là chỉ tiếp xúc với công nghệ máy chủ - ví dụ: giảm nguy cơ thu thập phiên hàng loạt, chung chung
mlhDev

4

Lặp lại các câu trả lời trước đây từ @ giveme5minutes và @AKhooli khi chúng liên quan đến Trang web Azure cùng với một số mục khác mà máy quét muốn xem, đây là những thay đổi mà tôi đã thực hiện để ASafaWeb hài lòng với một trang Azure.

Nó vẫn phàn nàn về việc cookie tiêu đề mối quan hệ Azure không chỉ là https nhưng dù sao thì mối quan hệ vẫn là loại cookie bạn muốn phát lại, phải không?

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