Hapus Server Response Header IIS7

107

Apakah ada cara untuk menghapus header respons "Server" dari IIS7? Ada beberapa artikel yang menunjukkan bahwa menggunakan HttpModules kita dapat mencapai hal yang sama. Ini akan membantu jika kita tidak memiliki hak admin ke server. Juga saya tidak ingin menulis filter ISAPI.

Saya memiliki hak admin ke server saya. Jadi saya tidak ingin melakukan hal-hal di atas. Jadi, tolong bantu saya melakukan hal yang sama.

pengguna247702
sumber
Lihat: stackoverflow.com/questions/22401219/…
Mohsen Tavoosi محسن طاوسی

Jawaban:

111

Tambahkan ini ke global.asax.cs Anda:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
bkaid
sumber
11
Tidak tahu mengapa jawaban modul http lebih tinggi dari yang ini, yang ini jauh lebih mudah
jjxtra
2
Anda mungkin menemukan Anda mendapatkan NullReferenceExceptiondi Cassini jika Anda mengandalkan HttpContext.Current. Posting blog ini menunjukkan bagaimana melakukannya sambil menghindari putusnya dukungan Cassini, jika itu penting bagi Anda.
Owen Blacker
49
@PsychoDad ini berfungsi untuk permintaan ASP.NET saja, bukan untuk file statis seperti .css dan .js
Max Toro
1
Untuk menghilangkan header MVC Anda dapat melakukan ini MvcHandler.DisableMvcResponseHeader = true;
ProVega
7
Bukan ide yang baik untuk menggunakan the PreSendRequestHeadersdi kelas yang mengimplementasikan IHttpModuleatau Global.asax. Saya telah menyaksikan acara membekukan aplikasi di server di bawah beban stres. The BeginRequestevent harus bekerja untuk membuat perubahan respon header. Lihat hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Dmitry S.
77

Di IIS7 Anda harus menggunakan modul HTTP. Bangun berikut ini sebagai perpustakaan kelas di VS:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

Kemudian tambahkan berikut ini ke web.config Anda, atau Anda mengkonfigurasinya dalam IIS (jika Anda mengkonfigurasi dalam IIS, rakitan harus berada di GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>
lukiffer
sumber
Luar biasa, saya juga dapat menyesuaikan ini untuk menghapus header ETag di seluruh server farm saya.
devstuff
Ini menyebabkan kesalahan runtime di casini ... / ASP.NET Dev server
UpTheCreek
2
@UpTheCreek Server dev ASP.Net (Cassini) tidak akan menyukai kode itu; posting blog ini memiliki solusi untuk itu, meskipun - Anda perlu memeriksa bahwa HttpApplication, yang HttpRequest, yang HttpContext, dan HttpResponsetidak null, serta memeriksa bahwa HttpRequest.IsLocaladalah false.
Owen Blacker
2
Karena memodifikasi tajuk di PreSendRequestHeadersdapat menyebabkan masalah dengan HttpCacheModule , Anda harus menggunakan sesuatu seperti itu PostReleaseRequestState.
Eirik H
5
Modul tidak dipanggil ketika IIS mengirimkan 304 header Not Modified untuk file statis (css / less / images / etc) karena ini tidak mencapai pipeline ASP.NET, jadi dalam situasi ini Server: Microsoft IIS / 7.5 masih dirender
Jano
42

Dengan mengaktifkan URL Rewrite Module Version 2.0 for IIS (UrlRewrite), di bagian konfigurasi <configuration><system.webServer><rewrite>tambahkan aturan keluar:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>
JeffZhnn
sumber
11
Perhatikan bahwa ini hanya mengosongkan header Server, itu tidak menghapusnya.
Nick Evans
Maaf atas ketidaktahuannya tetapi ke bagian mana saya harus menambahkan ini ?! Saya mencoba menambahkannya di dalam <system.webServer>
Vignesh Subramanian
1
Terima kasih! Bekerja di IIS 8.5, ini sangat mudah. Saya tidak memiliki editor teks tetapi Anda dapat dengan mudah menggunakan GUI. Namanya harus RESPONSE_Server, bukan hanya Server (di sinilah saya pertama kali gagal).
Louis Matthijssen
ini cukup bagus jika Anda memiliki aplikasi non-ASP.Net sehingga Anda tidak dapat menghapus header server dengan kode yang disebutkan
mhesabi
4
@vignesh ini adalah beberapa subnode konfigurasi UrlRewrite. Anda harus menempatkannya di bawah rewritenode system.webServer. Hati-hati, ini akan merusak situs Anda jika UrlRewrite tidak diinstal di server. Dan Anda sebaiknya menggunakan konsol konfigurasi IIS terlebih dahulu untuk memeriksa bagaimana ia menuliskan node konfigurasi tersebut.
Frédéric
36

Scott Mitchell memberikan solusi dalam posting blog untuk menghapus header yang tidak perlu .

Seperti yang telah dikatakan di sini di jawaban lain, untuk Serverheader, ada solusi modul http , atau solusi web.config untuk IIS 10+ , atau Anda dapat menggunakan URLRewrite sebagai gantinya untuk mengosongkannya .

Solusi paling praktis untuk penyiapan terkini (IIS 10 +) menggunakan removeServerHeaderdi web.config:

<system.webServer>
  ...
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
  ...
</system.webServer>

Untuk X-AspNet-Versiondan X-AspNetMvc-Version, ia memberikan cara yang lebih baik daripada menghapusnya di setiap respons: sama sekali tidak membuatnya sama sekali.

Gunakan enableVersionHeaderuntuk menonaktifkan X-AspNet-Version, di web.config

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

Gunakan MvcHandler.DisableMvcResponseHeaderdalam acara .Net Application_Start untuk menonaktifkanX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

Dan terakhir, hapus dalam konfigurasi IIS X-Powered-Byheader kustom di web.config.

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

Hati-hati, jika Anda memiliki ARR (Application Request Routing), itu juga akan menambahkan miliknya sendiri X-Powered-By, yang tidak akan dihapus oleh pengaturan tajuk khusus. Yang ini harus dihapus melalui Manajer IIS, konfigurasi Editor pada akar IIS (bukan di situs): buka system.webServer/proxynode dan setel arrResponseHeaderke false. Setelah IISResetitu, itu diperhitungkan.
(Saya telah menemukan yang ini di sini , kecuali posting ini tentang cara lama IIS 6.0 untuk mengkonfigurasi berbagai hal.)

Jangan lupa bahwa solusi dengan kode aplikasi tidak berlaku secara default untuk header yang dihasilkan pada konten statis (Anda dapat mengaktifkan runAllManagedModulesForAllRequestsuntuk mengubahnya, tetapi itu menyebabkan semua permintaan untuk menjalankan pipeline .Net). Ini bukan masalah X-AspNetMvc-Versionkarena tidak ditambahkan pada konten statis (setidaknya jika permintaan statis tidak dijalankan di pipeline .Net).

Catatan tambahan: ketika tujuannya adalah untuk menyelubungi teknologi yang digunakan, Anda juga harus mengubah nama cookie .Net standar ( .ASPXAUTHjika formulir auth diaktifkan (gunakan nameatribut pada formstag di web.config), ASP.NET_SessionId(gunakan <sessionState cookieName="yourName" />di web.config di bawah system.webtag), __RequestVerificationToken(ubah itu dengan kode dengan AntiForgeryConfig.CookieName, tapi sayangnya tidak berlaku untuk input tersembunyi yang dihasilkan sistem ini di html)).

Frédéric
sumber
18

Sebenarnya modul berkode dan contoh Global.asax yang ditunjukkan di atas hanya berfungsi untuk permintaan yang valid.

Misalnya, tambahkan <di akhir URL Anda dan Anda akan mendapatkan halaman "Permintaan buruk" yang masih memperlihatkan header server. Banyak pengembang mengabaikan ini.

Pengaturan registri yang ditampilkan juga tidak berfungsi. URLScan adalah satu-satunya cara untuk menghapus header "server" (setidaknya di IIS 7.5).

Dan Ware
sumber
Ini bekerja untuk saya dengan modul berkode (ditambahkan di web.config) bahkan pada permintaan yang buruk;) Di global.asax itu tidak benar-benar berfungsi (misalnya file statis dll.)
kapsiR
Semoga Anda masih mengaktifkan validasi permintaan.
Dan Ware
1
apakah ada yang punya alternatif urlscan untuk IIS 8+?
herostwist
Ada solusi yang berfungsi setidaknya di IIS10 +: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik
16

Atau tambahkan web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>
Anders
sumber
3
Metode ini tidak menghapus header 'Server'. Yang lainnya dihapus.
Pure.Krome
Anda dapat menyingkirkan X-Powered-By di konfigurasi header Respon di tingkat server.
Snowburnt
1
Saya tidak tahu apakah ada kasus di mana cara ini menghapus X-AspNet-Versiondan X-AspNetMvc-Versionheader. Yang saya tahu adalah cara ini tidak selalu berhasil (jika pernah berhasil). Lihat jawaban @Frederic untuk cara yang lebih andal untuk menghapusnya.
TheBlueSky
Sekarang ada cara di IIS10 + untuk menghapus header server: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik
14

web.configPenataan ini berfungsi untuk menghapus semua header yang tidak perlu dari respons ASP.NET (setidaknya mulai dari IIS 10):

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

Harap dicatat bahwa ini menyembunyikan semua header untuk "aplikasi", seperti halnya semua pendekatan lainnya. Jika Anda misalnya mencapai beberapa halaman default atau halaman kesalahan yang dihasilkan oleh IIS itu sendiri atau ASP.NET di luar aplikasi Anda, aturan ini tidak akan berlaku. Jadi idealnya mereka harus berada di tingkat akar di IIS dan ambang itu mungkin meninggalkan beberapa tanggapan kesalahan ke IIS itu sendiri.

PS Ada bug di IIS 10 yang membuatnya terkadang menampilkan header server bahkan dengan konfigurasi yang benar. Ini harus diperbaiki sekarang, tetapi IIS / Windows harus diperbarui.

Ilya Chernomordik
sumber
12

Selain jawaban Penulisan Ulang URL , berikut adalah XML lengkap untukweb.config

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="Remove RESPONSE_Server" >
        <match serverVariable="RESPONSE_Server" pattern=".+" />
        <action type="Rewrite" value="Company name" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

Penulisan Ulang URL

Vaibhav Garg
sumber
Apakah ini menghapus semua versi IIS dan ASP dari peretas
aggie
1
Perbaikan di atas berfungsi dengan benar untuk halaman web. Tetapi untuk gambar / ikon jika 500 Server Internal Error terjadi, itu menunjukkan Server: Microsoft-IIS / 7.5. Bisakah Anda membantu saya dalam hal ini
ravithejag
11

Untuk menghapus Server:tajuk, buka Global.asax, temukan / buat Application_PreSendRequestHeadersacara dan tambahkan baris sebagai berikut (terima kasih kepada BK dan blog ini juga tidak akan gagal di Cassini / pengembang lokal):

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

Jika Anda menginginkan solusi lengkap untuk menghapus semua tajuk terkait di Azure / IIS7 dan juga berfungsi dengan Cassini, lihat tautan ini , yang menunjukkan cara terbaik untuk menonaktifkan tajuk ini tanpa menggunakan HttpModules atau URLScan.

Nick Evans
sumber
9

Jika Anda hanya ingin menghapus header, Anda dapat menggunakan versi singkat dari jawaban lukiffer:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

Lalu di Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>
Drew Noakes
sumber
1
Ini paling tepat karena sumber daya seperti css / js tidak akan memiliki header Server, itu port dari server ke server tanpa konfigurasi dan header respons Server tidak akan kosong, itu tidak akan dikirim.
Adam Caviness
Saya telah melihat komentar bahwa runAllManagedModulesForAllRequests = "true" akan memperlambat aplikasi Anda dan tidak disarankan. Sebagai gantinya, seseorang dapat menggunakan modul urlrewrite outboundRules untuk menghapus nilai server juga untuk file statis. britishdeveloper.co.uk/2010/06/…
Juri
5

Coba tetapkan HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderentri registri ke REG_DWORDdari 1.

Richard Deeming
sumber
Berlari ke situasi yang aneh dengan server farm kami di mana pengaturan registri ini tampaknya menjadi satu-satunya perubahan yang berfungsi di semua OS (W2K8, W2K3) yang kami gunakan, untuk IIS6 dan IIS7.
jerhewet
2
Dengan frustrasi, ini tidak membuat perbedaan apa pun bagi saya, bahkan setelah me-reboot mesin virtual. Kami menjalankan IIS 7.5 di Windows Server 2008 R2 Standard, "Versi 6.1 (Build 7601: Service Pack 1)". Demikian pula, OnPreSendRequestHeadersevent handler saya (lihat di atas) tidak pernah aktif, karena alasan tertentu.
Owen Blacker
3
Sayangnya kunci registri tampaknya tidak berfungsi pada IIS 7.5
Andrew Csontos
4

UrlScan juga dapat menghapus header server dengan menggunakan AlternateServerName=under [options].

eddiegroves
sumber
2

Menindaklanjuti jawaban eddiegroves , tergantung pada versi URLScan, Anda mungkin lebih memilih di RemoveServerHeader=1bawah [options].

Saya tidak yakin di versi mana dari URLScan opsi ini ditambahkan, tetapi telah tersedia di versi 2.5 dan yang lebih baru.

teknisi
sumber
2

Saya menemukan artikel yang menjelaskan mengapa kita perlu melakukan edit Registry dan menggunakan alat seperti UrlScan untuk mengaturnya di IIS dengan benar. Saya mengikutinya di server kami dan berhasil: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Jika Anda hanya menggunakan UrlScan tetapi tidak melakukan perubahan registri, selama Anda menghentikan World Wide Publishing Service, server Anda akan mengembalikan respons http server dari file HTTP.sys. Selain itu, berikut adalah kesalahan umum dalam menggunakan alat UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

Pawel
sumber
2
Harap posting kode Anda di Stack Overflow. Tautan dapat berubah dan rusak, jadi kode posting jauh lebih membantu
Blundering Philosopher
2

Di IIS 10, kami menggunakan solusi yang mirip dengan pendekatan Drew, yaitu:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

Dan tentu saja tambahkan referensi ke dll itu di proyek Anda dan juga modul di konfigurasi yang Anda inginkan:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

CATATAN PENTING 1: Solusi ini memerlukan kumpulan aplikasi yang ditetapkan sebagai terintegrasi;

CATATAN PENTING2: Semua tanggapan dalam aplikasi web akan terpengaruh oleh ini (termasuk css dan js);

xautau.dll
sumber
1

Saya telah meneliti ini dan metode URLRewrite berfungsi dengan baik. Tidak dapat menemukan perubahan yang dituliskan di mana pun dengan baik. Saya menulis ini kompatibel dengan PowerShell v2 dan yang lebih baru dan mengujinya di IIS 7.5.

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"
Bill M
sumber
1

Anda dapat menambahkan kode di bawah ini di file Global.asax.cs

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }
Dharmendra Kumar Sharma
sumber
1

Solusi yang diusulkan di atas dalam kombinasi bekerja untuk saya dengan perubahan berikut. Di sini saya memposting skenario dan solusi saya.

Bagi saya, saya ingin menghapus header berikut:

  • Server
  • X-Powered-By
  • X-AspNet-Version
  • X-AspNetMvc-Version

Saya menambahkan ini ke global.asax saya:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

Acara di atas tidak dipicu, jadi untuk itu saya menambahkan berikut ke web.config agar berfungsi.

<modules runAllManagedModulesForAllRequests="true" />

dan untuk menghapus versi header saya juga menambahkan berikut ini ke web.config:

<httpRuntime enableVersionHeader="false" />

Perubahan di web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

Semoga membantu!

Zaki Mohammed
sumber
0

Saya mencoba semua hal di sini dan di beberapa utas tumpukan overflow serupa lainnya.

Saya terputus sebentar karena saya lupa menghapus cache browser saya setelah melakukan perubahan konfigurasi. Jika Anda tidak melakukannya dan file tersebut ada di cache lokal Anda, ini akan menyajikannya kembali kepada Anda dengan header asli (duh).

Saya mendapatkannya sebagian besar bekerja dengan menghapus runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

Tindakan ini menghapus header asing dari sebagian besar file statis, tetapi saya masih mendapatkan header "Server" pada beberapa file statis di proyek WebAPI saya secara berlebihan.

Saya akhirnya menemukan dan menerapkan solusi ini dan sekarang semua header yang tidak diinginkan hilang:

https://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

yang membahas kodenya yang ada di sini:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

Ini adalah modul Native-Code. Itu dapat menghapus header Server, tidak hanya mengosongkan nilainya. Secara default menghapus:

  • Server
  • X-Powered-By
  • Versi X-Aspnet
  • Server: Microsoft-HTTPAPI / 2.0 - yang akan dikembalikan jika "permintaan gagal diteruskan ke IIS"
TechSavvySam
sumber
-1

IIS 7.5 dan kemungkinan versi yang lebih baru memiliki teks header yang disimpan iiscore.dll

Dengan menggunakan hex editor, temukan string dan kata "Server" 53 65 72 76 65 72setelahnya dan ganti dengan byte nol. Di IIS 7.5 terlihat seperti ini:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

Tidak seperti beberapa metode lain, hal ini tidak mengakibatkan penalti kinerja. Header juga dihapus dari semua permintaan, bahkan kesalahan internal.

3dcdr
sumber