แต่ละหน้าในแอปพลิเคชัน MVC ฉันกำลังทำงานกับการตั้งค่าส่วนหัว HTTP เหล่านี้ในการตอบสนอง:
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0
ฉันจะป้องกันไม่ให้สิ่งเหล่านี้แสดงได้อย่างไร
แต่ละหน้าในแอปพลิเคชัน MVC ฉันกำลังทำงานกับการตั้งค่าส่วนหัว HTTP เหล่านี้ในการตอบสนอง:
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0
ฉันจะป้องกันไม่ให้สิ่งเหล่านี้แสดงได้อย่างไร
คำตอบ:
X-Powered-By
เป็นส่วนหัวที่กำหนดเองใน IIS ตั้งแต่ IIS 7 คุณสามารถลบออกได้โดยเพิ่มสิ่งต่อไปนี้ในweb.config
:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
ส่วนหัวนี้สามารถปรับเปลี่ยนได้ตามความต้องการของคุณสำหรับข้อมูลเพิ่มเติมดูที่http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders
เพิ่มส่วนนี้เพื่อweb.config
กำจัดX-AspNet-Version
ส่วนหัว:
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
ในที่สุดเมื่อต้องการลบX-AspNetMvc-Version
แก้ไขGlobal.asax.cs
และเพิ่มสิ่งต่อไปนี้ในApplication_Start
เหตุการณ์:
protected void Application_Start()
{
MvcHandler.DisableMvcResponseHeader = true;
}
นอกจากนี้คุณยังสามารถปรับเปลี่ยนส่วนหัวที่รันไทม์ผ่านเหตุการณ์ในApplication_PreSendRequestHeaders
Global.asax.cs
สิ่งนี้มีประโยชน์หากค่าส่วนหัวของคุณเป็นแบบไดนามิก:
protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
Response.Headers.Remove("foo");
Response.Headers.Add("bar", "quux");
}
X-Powered-By
ส่วนหัว ดูคำตอบอื่น ๆ web.config
เกี่ยวกับวิธีการประสบความสำเร็จในครั้งนี้
คุณสามารถลบออกได้โดยเพิ่มรหัสลงในไฟล์ global.asax ของคุณ:
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");
}
<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
ฉันพบการกำหนดค่านี้ในของฉันweb.config
ซึ่งสำหรับNew Web Site...
สร้างใน Visual Studio (ตรงข้ามกับ a New Project...
) เนื่องจากคำถามระบุแอปพลิเคชัน ASP.NET MVC ซึ่งไม่เกี่ยวข้องเท่ากัน แต่ยังคงเป็นตัวเลือก
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
ปรับปรุง : นอกจากนี้ Troy Hunt มีบทความชื่อShhh …อย่าปล่อยให้ส่วนหัวการตอบสนองของคุณพูดอย่างดังด้วยขั้นตอนโดยละเอียดเกี่ยวกับการลบส่วนหัวเหล่านี้รวมถึงลิงก์ไปยังเครื่องมือASafaWebของเขาเพื่อสแกนหาพวกเขาและการกำหนดค่าความปลอดภัยอื่น ๆ
code
<security> <requestFiltering> <verbs> <add verb = "OPTIONS" allow = "false" /> </verbs> </requestFiltering> </security>code
.NET Core
หากต้องการลบส่วนหัวเซิร์ฟเวอร์ภายในไฟล์Program.csให้เพิ่มตัวเลือกต่อไปนี้:
.UseKestrel(opt => opt.AddServerHeader = false)
สำหรับ dot net core 1 ให้เพิ่มตัวเลือกในการโทร. Usseest () สำหรับ dot net core 2 ให้เพิ่มบรรทัดหลัง UseStartup ()
หากต้องการลบส่วนหัวX-Powered-Byหากนำไปใช้กับ IIS ให้แก้ไข web.config ของคุณและเพิ่มหัวข้อต่อไปนี้ภายในแท็ก system.webServer:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
.NET 4.5.2
หากต้องการลบส่วนหัวเซิร์ฟเวอร์ภายในไฟล์global.asaxของคุณให้เพิ่มรายการต่อไปนี้:
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);
}
}
}
});
}
}
พื้นฐาน. NET 4.5.2
เพิ่มคลาส c # ต่อไปนี้ลงในโครงการของคุณ:
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");
}
}
จากนั้นภายใน web.config ของคุณให้เพิ่มส่วน <modules> ต่อไปนี้:
<system.webServer>
....
<modules>
<add name="RemoveServerHeaderModule" type="MyNamespace.RemoveServerHeaderModule" />
</modules>
อย่างไรก็ตามฉันมีปัญหาที่ไม่สามารถหาโมดูลย่อยได้ ไม่สนุก.
หากต้องการลบแท็ก '' X-AspNetMvc-Version '' สำหรับ. NET เวอร์ชันใด ๆ ให้แก้ไขไฟล์ '' web.config '' ของคุณเพื่อรวม:
<system.web>
...
<httpRuntime enableVersionHeader="false" />
...
</system.web>
ขอบคุณ Microsoft ที่ทำให้สิ่งนี้ยากอย่างไม่น่าเชื่อ หรืออาจเป็นความตั้งใจของคุณเพื่อให้คุณสามารถติดตามการติดตั้ง IIS และ MVC ทั่วโลก ...
RemoveServerHeaderModule
มันจะไม่ทำงานในโครงการ WebApi
ตามที่อธิบายไว้ในการปิดแอปพลิเคชันเว็บ ASP.NET MVC ของคุณบน IIS 7คุณสามารถปิดส่วนหัว X-AspNet-Version ได้โดยใช้ส่วนการกำหนดค่าต่อไปนี้กับ web.config ของคุณ:
<system.web>
<httpRuntime enableVersionHeader="false"/>
</system.web>
และลบส่วนหัว X-AspNetMvc-Version โดยแก้ไข Global.asax.cs ของคุณดังนี้:
protected void Application_Start()
{
MvcHandler.DisableMvcResponseHeader = true;
}
ตามที่อธิบายในCustom Headersคุณสามารถลบหัวข้อ "X-Powered-By" โดยใช้ส่วนกำหนดค่าต่อไปนี้กับ web.config ของคุณ:
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
</customHeaders>
</httpProtocol>
</system.webServer>
ไม่มีวิธีที่ง่ายในการลบส่วนหัวการตอบสนอง "เซิร์ฟเวอร์" ผ่านการกำหนดค่า แต่คุณสามารถนำไปใช้HttpModule
เพื่อลบส่วนหัว HTTP เฉพาะดังที่อธิบายไว้ในการปิดแอปพลิเคชันเว็บ ASP.NET MVC ของคุณบน IIS 7และวิธีลบเซิร์ฟเวอร์ x-aspnet
ดังที่แสดงในการลบส่วนหัวของเซิร์ฟเวอร์มาตรฐานในหน้าเว็บไซต์ Windows Azureคุณสามารถลบส่วนหัวดังต่อไปนี้:
<?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>
สิ่งนี้จะลบส่วนหัวของเซิร์ฟเวอร์และส่วนหัว X-
สิ่งนี้ใช้ได้ในการทดสอบของฉันใน Visual Studio 2015
ใน Asp.Net Core คุณสามารถแก้ไขไฟล์ web.config ดังนี้:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
คุณสามารถลบส่วนหัวของเซิร์ฟเวอร์ในตัวเลือก Kestrel:
.UseKestrel(c =>
{
// removes the server header
c.AddServerHeader = false;
})
เลือกบล็อกนี้ อย่าใช้รหัสเพื่อลบส่วนหัว มันไม่เสถียรตามMicrosoft
สิ่งที่ฉันทำในสิ่งนี้:
<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>
เพื่อความสมบูรณ์มีวิธีอื่นในการลบ Server
ส่วนหัวโดยใช้ regedit
ดูบล็อก MSDNนี้
สร้างรายการ DWORD ชื่อ DisableServerHeader ในคีย์รีจิสทรีต่อไปนี้และตั้งค่าเป็น 1
HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters
ฉันอยากจะหาวิธีแก้ปัญหาที่เหมาะสมโดยใช้ Web.config แต่การใช้<rewrite>
ไม่ดีเพราะมันต้องติดตั้งโมดูลการเขียนซ้ำและแม้ว่ามันจะไม่ลบส่วนหัวจริงๆ
คุณสามารถเปลี่ยนหัวข้อหรืออะไรก็ได้ในApplication_EndRequest()
ลองนี้
protected void Application_EndRequest()
{
// removing excessive headers. They don't need to see this.
Response.Headers.Remove("header_name");
}
ส่วนหัว X-Powered-By ถูกเพิ่มโดย IIS ในการตอบสนอง HTTP ดังนั้นคุณสามารถลบออกได้แม้ในระดับเซิร์ฟเวอร์ผ่านตัวจัดการ IIS:
คุณสามารถใช้ web.config โดยตรง:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>