۱۳۸۸/۱۰/۱۹

حذف هدرهاي مربوط به وب سرور از يك برنامه‌ي ASP.Net


به همراه هر درخواستي از سرور چه از طرف كلاينت و چه از طرف سرور، يك سري header نيز ارسال مي‌شود. براي مثال مرورگر، نوع خود را به همراه يك سري از قابليت‌هاي مربوطه مانند الگوريتم‌هاي فشرده سازي پشتيباني شده به سرور ارسال مي‌كند و در مقابل وب سرور هم يك سري هدر را مانند مدت زمان كش كردن اطلاعات دريافتي، نوع و نگارش سرور و امثال آن، به كلاينت ارسال خواهد كرد.
از ديدگاه امنيتي اين اطلاعات اضافي هستند. براي مثال از تصوير زير (كه با استفاده از افزونه‌ي فايرباگ تهيه شده) دقيقا مي‌توان وب سرور، نگارش آن و بسياري از موارد ديگر را به سادگي تشخيص داد. در ادامه مي‌خواهيم اين هدرهاي اضافي را حذف كنيم.



امكان تغيير و حذف هدرهاي مربوط به response تنها با استفاده از امكانات IIS7 ميسر است (در حالت integrated pipeline) و IIS6 چنين اجازه‌اي را به ASP.Net نمي‌دهد.
براي اين منظور يك پروژه‌ي جديد، به نام SecurityMdl از نوع class library را ايجاد كرده و دو فايل SecurityMdl.cs و CRemoveHeader.cs را به آن اضافه خواهيم كرد:

//SecurityMdl.cs
using System;
using System.Web;

namespace SecurityMdl
{
public class SecurityMdl : IHttpModule
{
public void Init(HttpApplication app)
{
app.PreSendRequestHeaders += app_PreSendRequestHeaders;
}

static void app_PreSendRequestHeaders(object sender, EventArgs e)
{
CRemoveHeader.CheckPreSendRequestHeaders(sender);
}

public void Dispose() { }
}
}


در اين Http module ، با تغيير اطلاعات دريافتي در روال رخ‌داد گردان PreSendRequestHeaders مي‌توان به مقصود رسيد:

//CRemoveHeader.cs
using System;
using System.Collections.Generic;
using System.Web;

namespace SecurityMdl
{
class CRemoveHeader
{
private static readonly List<string> _headersToRemoveCache
= new List<string>
{
"X-AspNet-Version",
"X-AspNetMvc-Version",
"Server"
};

public static void CheckPreSendRequestHeaders(Object sender)
{
//capture the current request
var currentResponse = ((HttpApplication)sender).Response;

//removing headers
//it only works with IIS 7.x's integrated pipeline
_headersToRemoveCache.ForEach(h => currentResponse.Headers.Remove(h));

//modify the "Server" Http Header
currentResponse.Headers.Set("Server", "Test");
}
}
}
در اينجا علاوه بر حذف هدرهاي ذكر شده در headersToRemoveCache ، هدر Server در پايان كار با يك مقدار جديد نيز ارسال مي‌گردد.
و نهايتا براي استفاده از آن (علاوه بر افزودن ارجاعي به اين ماژول جديد) چند سطر زير را بايد به وب كانفيگ برنامه اضافه كرد:

<system.webServer>
<modules>
<add name="SecurityMdl" type="SecurityMdl.SecurityMdl, SecurityMdl"/>
</modules>

با استفاده از اين روش تمامي هدرهاي مورد نظر بجز هدري به نام X-Powered-By حذف خواهند شد. براي حذف هدر مربوط به X-Powered-By كه توسط خود IIS مديريت مي‌شود بايد موارد زير را به web.config برنامه اضافه كرد:

<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By"/>
</customHeaders>
</httpProtocol>
و يا مي‌توان توسط خود IIS‌ نيز اين مورد را تغيير داد يا كلا حذف نمود:




اكنون پس از اين تغييرات حاصل كار و هدر نهايي دريافت شده از response يك برنامه‌ي ASP.net به شكل زير درخواهد آمد:





براي مطالعه‌ي بيشتر
Remove the X-AspNet-Version header
Cloaking your ASP.NET MVC Web Application on IIS 7
IIS 7 - How to send a custom "Server" http header
Removing Unnecessary HTTP Headers in IIS and ASP.NET
Remove X-Powered-By: ASP.NET HTTP Response Header