There are a number of infrastructure details that are passed with your HTTP response headers when serving a page. The security conscious developers out there will be aware that hackers and other malicious people will enjoy learning that information to target their exploits for that framework. If you want to remove the HTTP response headers of Server, X-Powered-By, X-AspNet-Version, X-AspNetMvc-Version or any others I will show you how.
I will show you the less hacky ones first. I.e. the ones where it is designed for you to remove them easily:
X-AspNet-Version
This can be removed simply using the enableVersionHeader attribute of the httpRuntime section of system.web section of your web.config:
<system.web>
<httpRuntime enableVersionHeader="false" />
<!-- other settings -->
</system.web>
X-AspNetMvc-Version
In your Global.asax.cs you can add the following to your Application_Start method:
protected void Application_Start(object sender, EventArgs e)
{
MvcHandler.DisableMvcResponseHeader = true;
// RegisterRoutes etc... and other stuff
}
X-Powered-By
Instead of removing this I have decided to change it to something different so as not to cause suspicion to a potential hacker:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By"/>
<add name="X-Powered-By" value="PHP 5.2 Ubuntu"/>
</customHeaders>
</httpProtocol>
<!-- other stuff -->
</system.webServer>
Server
This one is harder since you can't actually do it anywhere else. Of course you could have changed all the other Headers here too but it feels messy doing it this way so I opted to change the others using the intended way.
First, make an HttpModule (essentially a class inheriting from IHttpModule) like this:
namespace HttpModules
{
public class SecurityModule : IHttpModule
{
public void Dispose()
{
//intentionally do nothing
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders);
}
private void context_PreSendRequestHeaders(object sender, EventArgs e)
{
var context = ((HttpApplication)sender).Context;
context.Response.Headers.Set("Server", "Apache 2.0");
}
}
}
Note: I have gone for lying about the server over removing it (which is also possible) since I'd rather fool hackers than annoy them.
Next you just need to register that module in your web.config:
<system.webServer>
<modules>
<add name="SecurityModule" type="HttpModules.SecurityModule, HttpModules" />
</modules>
</system.webServer>

Now use
Fiddler to have a look at your Response Headers. Hopefully wonderfully deceptive like this:
If you have more to remove/change you can do it in much the same way as X-Powered-By (using web.config) or if not the Server one (using the Security HttpModule).