Bagaimana cara menghapus Header HTTP Default ASP.Net MVC?

176

Setiap halaman dalam aplikasi MVC saya bekerja dengan set header HTTP ini sebagai tanggapan:

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

Bagaimana saya mencegah ini agar tidak muncul?

Paul Fryer
sumber
2
Lihat artikel ini Menghapus Header HTTP yang Tidak Perlu di IIS dan ASP.NET , ini menjelaskan cara menghapus semua header Anda yang terdaftar.
Pavel Morshenyuk
@PavelMorshenyuk Maaf, apakah Anda menemukan cara untuk menghapus nama server juga? jawaban yang diterima tidak menghapus Server
neda Derakhshesh

Jawaban:

285

X-Powered-Byadalah tajuk khusus di IIS. Sejak IIS 7, Anda dapat menghapusnya dengan menambahkan yang berikut ke web.config:

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

Header ini juga dapat dimodifikasi sesuai kebutuhan Anda, untuk informasi lebih lanjut lihat http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Tambahkan ini ke web.configuntuk menyingkirkan X-AspNet-Versiontajuk:

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

Akhirnya, untuk menghapus X-AspNetMvc-Version, mengedit, Global.asax.csdan menambahkan yang berikut dalam Application_Startacara:

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

Anda juga dapat memodifikasi tajuk saat runtime melalui Application_PreSendRequestHeadersacara di Global.asax.cs. Ini berguna jika nilai header Anda dinamis:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}
RedFilter
sumber
4
+1 - Demi kepentingan, 1) Mengapa Anda mau? 2) Apakah ada pengaruh buruk?
Pengembang Inggris
69
Anda melakukan ini karena alasan keamanan untuk mengaburkan teknologi apa yang Anda gunakan untuk menghasilkan halaman web Anda. Ini memaksa peretas untuk bekerja sedikit lebih keras.
RedFilter
20
@BritishDeveloper Ini adalah rekomendasi yang keluar dari ulasan keamanan. Saya kira ini praktik terbaik untuk tidak mengiklankan tumpukan teknologi Anda, karena itu membantu peretas menargetkan kerentanan khusus dengan platform itu.
Paul Fryer
1
@RedFilter Terima kasih atas jawaban cepat dan terperinci Anda!
Paul Fryer
6
Pada IIS 8 ini tidak menghapus X-Powered-Byheader. Lihat jawaban lain tentang bagaimana untuk mencapai dalam hal ini web.config.
Knelis
105

Anda juga dapat menghapusnya dengan menambahkan kode ke file global.asax Anda:

 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");
 }
Bkaid
sumber
29
Dalam kasus saya, hanya tiga yang terakhir yang berhasil, untuk "X-Powered-By" yang saya butuhkan<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Frank van Eykelen
2
Dalam kasus saya, tidak ada header di atas yang dihapus. saya menggunakan .net 4.0 dan IIS 7. Terima kasih atas komentar lain di utas ini. Saya telah berhasil menghapus semua tajuk yang tidak diinginkan dengan pengecualian "Server" yang merupakan kasus terburuk.
Farjad
2
Apakah itu bekerja melawan file konten / gambar / dll Anda yang tidak melalui jalur kode?
Mark Sowul
apa yang Anda masukkan ke dalam "Server"? haruskah seperti ini? Response.Headers.Remove ("Server: Microsoft-IIS / 7.0"); ? atau harus "Server"? tolong bantu
neda Derakhshesh
aneh dengan orang lain bahwa "PreSendRequestHeaders" sebenarnya adalah header respons pra-kirim?
JDPeckham
50

Saya menemukan konfigurasi ini di saya web.configyang New Web Site...dibuat di Visual Studio (sebagai lawan dari a New Project...). Karena pertanyaan menyatakan aplikasi ASP.NET MVC, tidak relevan, tetapi masih merupakan pilihan.

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

Pembaruan : Juga, Troy Hunt memiliki artikel berjudul Shhh ... jangan biarkan header respons Anda berbicara terlalu keras dengan langkah-langkah terperinci untuk menghapus header ini serta tautan ke alat ASafaWeb- nya untuk memindai dan konfigurasi keamanan lainnya.

Kevin Hakanson
sumber
5
Opsi terbaik tetapi membutuhkan iis7 + Anda tidak perlu <menghapus /> mereka ... hapus sudah cukup .. Anda juga mungkin ingin menambahkan ini ke system.webserver untuk menghapus kerentanan lain: code <security> <requestFiltering> <verbs> <add kata kerja = <tambahkan kata kerja = "OPSI" diizinkan = "false" /> </verbs> </requestFiltering> </security>code
felickz
Saya pikir elemen <clear /> menghapus semua header, termasuk 'X-Powererd-By', sehingga elemen <remove /> berlebihan.
Jan H
33

.NET Core

Untuk menghapus header Server , dalam file Program.cs , tambahkan opsi berikut:

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

Untuk dot net core 1, tambahkan opsi di dalam panggilan .UseKestrel (). Untuk dot net core 2, tambahkan baris setelah UseStartup ().

Untuk menghapus header X-Powered-By , jika digunakan untuk IIS, edit web.config Anda dan tambahkan bagian berikut di dalam tag system.webServer:

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

.NET 4.5.2

Untuk menghapus header Server , dalam file global.asax Anda tambahkan yang berikut ini:

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

    }

Pra .NET 4.5.2

Tambahkan kelas c # berikut ke proyek Anda:

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

dan kemudian di dalam web.config Anda tambahkan bagian <modules> berikut:

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

Namun saya punya masalah di mana sub proyek tidak dapat menemukan modul ini. Tidak menyenangkan.

Menghapus header X-AspNetMvc-Version

Untuk menghapus tag '' X-AspNetMvc-Version '', untuk versi .NET apa pun, ubah file 'web.config' Anda untuk memasukkan:

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

Terima kasih Microsoft untuk membuat ini sangat sulit. Atau mungkin itu niat Anda sehingga Anda dapat melacak pemasangan IIS dan MVC di seluruh dunia ...

Rocklan
sumber
3
Di zaman sekarang ini ini dianggap sebagai "praktik terburuk" dan sulit untuk percaya bahwa Microsoft masih menjadikan "tidak aman" sebagai default dan sangat sulit untuk memilih "aman". Ini mengingatkan saya tentang bagaimana Windows menyembunyikan ekstensi file umum secara default sehingga pengguna yang tidak curiga akan mengklik virus. Saya ingat Bill Gates mengumumkan "aman secara default" pada tahun 2003 - apa yang terjadi dengan ide itu?
mike nelson
2
@mikenelson jika itu membuat Anda merasa lebih baik, mencoba untuk menghapus tag Server di nginx sama sulitnya - akhirnya saya harus meretas kode sumber yang sebenarnya.
Rocklan
Tentang RemoveServerHeaderModuleitu tidak akan berfungsi dalam proyek WebApi.
krypru
32

Seperti yang dijelaskan dalam Cloaking Aplikasi Web ASP.NET MVC Anda di IIS 7 , Anda bisa mematikan header X-AspNet-Version dengan menerapkan bagian konfigurasi berikut ke web.config Anda:

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

dan hapus header X-AspNetMvc-Version dengan mengubah Global.asax.cs Anda sebagai berikut:

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

Seperti yang dijelaskan dalam header khusus, Anda dapat menghapus header "X-Powered-By" dengan menerapkan bagian konfigurasi berikut ke web.config Anda:

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

Tidak ada cara mudah untuk menghapus header respons "Server" melalui konfigurasi, tetapi Anda dapat menerapkannya HttpModuleuntuk menghapus Header HTTP tertentu seperti yang dijelaskan dalam Cloaking Aplikasi Web ASP.NET MVC Anda di IIS 7 dan bagaimana cara menghapus server- x-aspnet-version-x-aspnetmvc-version-dan-x-powered-by-from-the-response-header-in-iis7 .

RonyK
sumber
Menggunakan jawaban bkaid saya dapat menghapus header "Server". IIS 8.
tmorell
jawaban bkaid baik-baik saja, tetapi membutuhkan pengkodean, jadi saya menemukan solusi yang saya gambarkan lebih nyaman, karena berbasis konfigurasi.
RonyK
8

Seperti yang ditunjukkan pada Menghapus header server standar pada halaman Situs Web Windows Azure , Anda dapat menghapus header dengan yang berikut ini:

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

Ini menghapus header Server, dan header-X.

Ini bekerja secara lokal dalam pengujian saya di Visual Studio 2015.

Eric Dunaway
sumber
6
Menambahkan removeServerHeader = "true" memberi saya kesalahan 500 pada aplikasi ASP.NET 4.5.3 saya
Rocklan
4
@LachlanB ini ditambahkan di IIS 10: IIS 10.0 menambahkan atribut removeServerHeader untuk menekan pengiriman header server HTTP ke klien jarak jauh. Sumber: iis.net/configreference/system.webserver/security/…
SynerCoder
1
Saya suka bahwa halaman Azure menyediakan tangkapan layar daripada blok kode. Mereka benar-benar melakukan segala yang mereka bisa untuk membuat menghapus tag yang tidak perlu dan berpotensi ini sesulit mungkin. Juga, saya tidak percaya saya merujuk pertanyaan SO tiga tahun untuk memperbaiki masalah ini, yang tidak menunjukkan tanda-tanda sedang diperbaiki.
killa-byte
1
Saya pikir Web.config ini tidak menghapus header X-AspNetMvc-Version. Untuk menghapus yang itu, kita perlu menambahkan sesuatu di Global.asax stackoverflow.com/a/20739875/1678525
Jan H
8

Di Asp.Net Core Anda dapat mengedit file web.config seperti:

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

Anda dapat menghapus header server di opsi Kestrel:

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

Periksa blog ini. Jangan gunakan kode untuk menghapus header. Itu tidak stabil menurut Microsoft

Pandangan saya tentang ini:

<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>
mitaka
sumber
4

Demi kelengkapan, ada cara lain untuk menghapus Server header, menggunakan regedit.

Lihat blog MSDN ini .

Buat entri DWORD yang disebut DisableServerHeader di kunci Registri berikut dan atur nilainya menjadi 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters

Saya lebih suka mencari solusi yang tepat menggunakan Web.config, tetapi menggunakan <rewrite>itu tidak baik karena membutuhkan modul penulisan ulang yang harus diinstal, dan bahkan kemudian itu tidak akan benar-benar menghapus header, kosongkan saja.

Rudey
sumber
Jika ini berfungsi sepertinya solusi yang bagus untuk kasus saya. Saya memiliki 30 situs web dalam berbagai versi .net dan karenanya akan membutuhkan 3 cara berbeda untuk menghapus tajuk dan memperbarui kode di semua situs ini. Saya lebih suka memiliki pengaturan konfigurasi atau registri daripada harus mengubah kode.
mike nelson
Saya menerapkan ini dengan sukses dua hari yang lalu, bekerja dengan baik.
Rudey
2

Anda dapat mengubah tajuk apa pun atau apa pun di Application_EndRequest()coba ini

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

Header X-Powered-By ditambahkan oleh IIS ke respons HTTP, sehingga Anda dapat menghapusnya bahkan di tingkat server melalui IIS Manager:

Anda dapat menggunakan web.config secara langsung:

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