Microsoft IIS - Sicherheit


Entwicklereinstellungen

Debugging deaktivieren

.NET Code sollte im Release Modus kompiliert werden.

Web.config:

<system.web>
  <compilation debug="false"/>

Tracing deaktivieren

Codeablaufverfolg sollte nur bei Debuggen auf der lokalen Maschine verwendet werden.

Web.config:

<system.web>
  <trace enabled="false"/>

CustomErrors verwenden

Die von ASP.NET generierten Fehlermeldungen könnten kritische Informationen (wie etwas ConnectionStrings) enthalten.

Web.config:

<system.web>
  <customErrors mode="RemoteOnly" redirectMode="ResponseWrite" defaultRedirect="~/error.html"/>


HTTP Header

Unnötige HTTP Header abschalten

HTTP Header sollten möglichst wenig über das System verraten.

X-AspNet-Version

Web.config:

<system.web>
  <httpRuntime enableVersionHeader="false"/>
X-AspNetMvc-Version

In Global.asax z.B. bei Application_Start():

MvcHandler.DisableMvcResponseHeader = true;
X-Powered-By

Web.config:

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

Klasse RemoveServerHeaderModule anlegen:

using System;
using System.Web;

namespace IHS.WebApp.Filters {
  public class RemoveServerHeaderModule : IHttpModule {

    public void Init(HttpApplication context) {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() {}

    private void OnPreSendRequestHeaders(object sender, EventArgs e) {
      HttpContext.Current.Response.Headers.Remove("Server");
    }

  }
}

Web.config

<system.webServer>
  <modules>
    <add name="RemoveServerHeaderModule" type="YouPickIt.WebApp.Filters.RemoveServerHeaderModule"/>


Cookies

HTTP-Only Cookies

Cookies sollten ausschließlich per HTTP gesetzt werden und nie per JavaScript.

Web.config:

<system.web>
  <httpCookies httpOnlyCookies="true"/>

Sessionstate über Cookie

Die SessionID sollte ausschließlich über Cookies übertragen werden.

Web.config:

<system.web>
  <sessionState cookieless="UseCookies"/>

Authentifizierung ausschließlich über Cookie und SSL

Web.config:

<system.web>
  <authentication mode="Forms"/>
    <forms cookieless="UseCookies" requireSSL="true"/>


Cross-Site-Scripting (XSS)

AntiXSS Encoder verwenden

Die neueste AntiXSS Bibliothek von Microsoft installieren und als Default Encoder verwenden.

Web.config:

<system.web>
  <httpRuntime encoderType="Microsoft.Security.Application.AntiXssEncoder, AntiXssLibrary"/>

Alternative: Die in .NET 4.5 integrierte Version der Bibliothek verwenden. Dies ist älter aber weniger restriktiv

Web.config:

<system.web>
  <httpRuntime encoderType="System.Web.Security.AntiXss.AntiXssEncoder, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>


Cross-Site Request Forgery (CSRF)

Anti Forgery Token

Die ASP.NET MVC Funktionen für Anti Forgery Tokens nutzen.

Im View:

<form ...>
  @Html.AntiForgeryToken()

In JavaScript (als Beispiel AJAX mit jQuery):

function addAntiForgeryToken(data) {
  data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
  return data;
}
...
$.ajax({
  data: addAntiForgeryToken(myRequestData),
  ...
});

Im Controller:

[ValidateAntiForgeryToken]
public ViewResult Action() {