Menghapus / Menyembunyikan / Menonaktifkan header respons HTTP yang berlebihan di Azure / IIS7 tanpa UrlScan

86

Saya perlu menghapus header yang berlebihan (terutama untuk lulus pengujian penetrasi). Saya telah menghabiskan waktu mencari solusi yang melibatkan menjalankan UrlScan, tetapi ini rumit karena UrlScan perlu diinstal setiap kali instans Azure dimulai .

Harus ada solusi yang baik untuk Azure yang tidak melibatkan penerapan penginstal dari startup.cmd.

Saya memahami bahwa tajuk tanggapan ditambahkan di tempat yang berbeda :

  • Server : ditambahkan oleh IIS.
  • X-AspNet-Version : ditambahkan oleh System.Web.dll pada saat Flush di kelas HttpResponse
  • X-AspNetMvc-Version : Ditambahkan oleh MvcHandler di System.Web.dll.
  • X-Powered-By : ditambahkan oleh IIS

Apakah ada cara untuk mengkonfigurasi (melalui web.config dll.?) IIS7 untuk menghapus / menyembunyikan / menonaktifkan header tanggapan HTTP untuk menghindari peringatan "Header yang Berlebihan" di asafaweb.com , tanpa membuat modul IIS atau menerapkan penginstal yang perlu dijalankan setiap kali instans Azure dimulai?

Nick Evans
sumber

Jawaban:

139

Perubahan berikut memungkinkan Anda untuk menghapus header respons HTTP ini di Azure tanpa menulis HttpModule kustom.

Sebagian besar informasi di internet sudah kedaluwarsa, dan melibatkan UrlScan (yang sejak itu telah diintegrasikan ke dalam IIS7, tetapi dengan RemoveServerHeader=1opsi dihapus). Berikut adalah solusi rapi saya telah menemukan (terima kasih kepada blog ini , jawaban ini , dan blog ini dikombinasikan).

Untuk menghapus Server , buka Global.asax, temukan / buat Application_PreSendRequestHeadersacara dan tambahkan yang berikut ini (terima kasih kepada BK dan blog ini juga tidak akan gagal di Cassini / local dev):

Diedit April 2014: Anda dapat menggunakan kejadian PreSendRequestHeaders dan PreSendRequestContext dengan modul IIS asli, tetapi jangan menggunakannya dengan modul terkelola yang mengimplementasikan IHttpModule. Menyetel properti ini dapat menyebabkan masalah dengan permintaan asinkron . Versi yang benar adalah menggunakan acara 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");
        }
    }

Untuk menghapus X-AspNet-Version , di web.config temukan / buat <system.web>dan tambahkan:

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

    ...

Untuk menghapus X-AspNetMvc-Version , buka Global.asax, temukan / buat Application_Startacara dan tambahkan baris sebagai berikut:

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

Untuk menghapus X-Powered-By , di web.config temukan / buat <system.webServer>dan tambahkan:

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

    ...
Nick Evans
sumber
Menurut petunjuk di VS, tidak perlu mencentang Request, Response, atau Response. Headers
Chris Haines
1
Saat digunakan di IIS tidak Azure perhatikan bahwa kumpulan aplikasi harus dalam mode Terpadu. Dan .IsLocal harus dihapus saat men-debug secara lokal.
IvanH
5
Tidak perlu "Kondisi Yoda" di C # - tidak mengizinkan penugasan dalam kondisi, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson
1
Terima kasih atas jawaban detailnya, namun saya sudah mencoba dan menindaklanjuti langkah-langkahnya tetapi setiap kali saya memindai situs menggunakan asafweb, itu masih menyebutkan masalah tentang tajuk yang berlebihan (Versi X-AspNet). Saya bahkan menggunakan URLRewrite untuk menghapus header ini. Apakah ada kemungkinan lain untuk menghilangkannya?
Raymond A
4
Masih ada masalah saat meminta file yang tidak ada, misalnya " yoursite / foo.jpg ". Karena permintaan ini tidak diproses oleh MVC, header tanggapan "Server: IIS xy" akan tetap ada. Satu solusi yang berfungsi untuk Situs Web Azure (dan tampaknya HANYA untuk situs web biru) adalah dengan menambahkan ini di bawah <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
adrian h.
12

MSDN menerbitkan artikel ini tentang cara menyembunyikan tajuk di Situs Web Azure. Anda sekarang dapat menyembunyikan server dari web.config dengan menambahkan entri ke system.webServer

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

VS akan mengerutkan kening di atas sebagai tidak valid. Tautan di atas memiliki kode sebagai foto, sulit ditemukan. Versi MVC masih tersembunyi di aplikasi start seperti di atas, sama untuk versi x-powered-by dan .Net.

AKhooli
sumber
3
Ini adalah persis apa yang saya cari. Terima kasih.
Martin Costello
3
Ini mungkin berfungsi untuk Azure, tetapi tidak di tempat lain. Komentar di artikel itu menegaskan hal ini, seperti halnya pengujian saya sendiri. Jawaban oleh @ giveme5minutes adalah cara kerjanya.
CrazyPyro
Alangkah baiknya mengetahui apa yang diimplementasikan untuk membuat fungsi ini: | Terutama karena URL SCAN sebelumnya menerapkan ini di luar kotak.
felickz
6

Ada juga paket di NuGet yang membantu Anda mencapai ini melalui beberapa baris konfigurasi dan tidak ada perubahan pada kode: NWebsec. Dokumen tentang menghapus header versi dapat ditemukan di sini: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

Ini didemonstrasikan di sini: http://www.nwebsec.com/HttpHeaders/VersionHeaders (di Azure)

Penafian: Saya adalah pengembang proyek.

Klings
sumber
"NWebsec membantu Anda menekan hampir semua header versi ini, yaitu semua kecuali header Server: Microsoft-IIS / 8.0." :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz
Ini dipindahkan dari codeplex ke GitHub (harap perbarui tautan github.com/NWebsec/NWebsec/wiki )
Nordes
6

Jawaban Nick Evans sempurna, tapi ...

Jika Anda menghapus header ini untuk tujuan keamanan , jangan lupa untuk mengubah ASP.NET Session coockie name! Karena lebih mudah menebak bahasa yang digunakan atau versi server jika Anda melihat ini:

masukkan deskripsi gambar di sini

Untuk mengubah nama cookie: (jadilah kreatif)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>
Matthieu Charbonnier
sumber
Mengubah nama cookie memiliki lebih banyak manfaat daripada hanya paparan teknologi server - misalnya mengurangi risiko pengambilan sesi massal yang umum
mlhDev
4

Menggulung jawaban sebelumnya dari @ giveme5minutes dan @AKhooli karena terkait dengan Situs Web Azure ditambah beberapa item lain yang ingin dilihat pemindai, ini adalah perubahan yang saya buat untuk membuat ASafaWeb senang dengan situs Azure.

Itu masih mengeluh tentang cookie tajuk afinitas Azure yang tidak hanya https tetapi afinitas adalah jenis cookie yang ingin Anda putar ulang, bukan?

<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>
Timothy Lee Russell
sumber