Geschrieben von: Christoph Wille
Kategorie: ASP.NET
This printed page brought to you by AlphaSierraPapa
Vielen von uns ist es nur recht, wenn jemand zu unseren Sites beziehungsweise zu den Sites unserer Kunden linkt - es bringt ja Traffic. Andererseits gibt es aber Leute, die glauben für einen Link zu ihrer Site Geld kassieren zu können - mit dem Argument, daß man seine Site durch den Link zu ihrer Site ja aufwertet. Nur wenn der Inhalt ihrer Site ach so wertvoll ist, dann ist es in ihrer Verantwortung den Inhalt vor unerwünschten Referern zu sperren - und nicht nachträglich von jederman zu kassieren (versuchen).
Der heutige Artikel zeigt die grundsätzliche Vorgehensweise, wie man eine in ASP.NET programmierte Site vor unerwünschten Links schützt. Der Weg zum Ziel ist die Verwendung eines Http Modules (im Prinzip nichts anderes als eine Klasse die das Interface IHttpModule implementiert), das jeden Request überwacht - passt der Referer nicht, wird die Anfrage abgelehnt.
Sicherheit der Lösung Grundsätzlich lassen sich Referer beliebig verändern, allerdings nicht wenn ein User im Browser direkt auf einen Link klickt. Damit erfüllt die Lösung unseren Sicherheitsansprüchen, ein Problem gibt es aber: ein Http Module kann nur Dateien von ASP.NET schützen, nicht aber klassisches ASP oder HTML Dateien - in diesem Fall muß man einen ISAPI Filter einsetzen.
Ich habe das Http Module mit Absicht einfach gestaltet, das heißt, die Liste der erlaubten Referer kommt nicht aus einer Datenbank oder XML Datei, sondern ist im Konstruktor hardcodiert. Die beiden Methoden Init und Dispose stammen vom IHttpModule Interface, und müssen auch wenn keine Implementierung gemacht werden muß, zumindest deklariert werden (RefererModule.cs):
using System; using System.Web; using System.Collections.Specialized; public class RefererCheckModule: IHttpModule { protected StringCollection AllowedHosts; public RefererCheckModule() { // do init here (XML or database would be more appropriate) AllowedHosts = new StringCollection(); AllowedHosts.Add("sleeper"); AllowedHosts.Add("localhost"); } public void Init(HttpApplication theApp) { theApp.BeginRequest += (new EventHandler(this.Application_BeginRequest)); } public void Dispose() { // we have nothing to dispose (yet) } private void Application_BeginRequest(object source, EventArgs e) { if (null == source) return; HttpApplication theApp = (HttpApplication)source; HttpContext context = theApp.Context; Uri urlref = context.Request.UrlReferrer; if (null == urlref) return; // no referer at all string strReferer = urlref.Host; bool bFound = AllowedHosts.Contains(strReferer.ToLower()); if (!bFound) { context.Response.Redirect("/AspHeute/LinkingHostNotAllowed.htm", true); // and log the referer (to a database table) } } }
Die Abarbeitung jedes Requests beginnt in unserem Application_BeginRequest Event Handler. Dort wird aus dem HttpContext der UrlReferrer ausgelesen, von dem dieses Module nur am Host interessiert ist. Dieser Host wird gegen unsere Liste von erlaubten Hosts (AllowedHosts) gecheckt, und falls der Host nicht eingetragen ist, wird der User darüber informiert, daß die Website bei der er auf den Link geklickt hat, nicht um Erlaubnis für diesen Link gefragt hat.
So einfach ist das.
Das Module wird kompiliert und in das bin Verzeichnis der Website kopiert. Um das Module zu aktivieren, muß man einen Eintrag in der web.config machen:
<configuration> <system.web> <customErrors mode="Off"/> <httpModules> <add name="RefererCheck" type="RefererCheckModule,RefererCheckModule" /> </httpModules> <compilation debug="true" /> </system.web> </configuration>
Ein Eintrag im httpModules Teil ist notwendig. Da es auf den ersten Blick einige zuviele "ReferCheck" Strings gibt, hier die Aufschlüsselung, wofür jeder Parameter dient:
<httpModules> <add name="Name" type="Type, Module" /> </httpModules>
Und damit ist das Http Module bereits in Betrieb. Alle Requests (das ist von ASP.NET garantiert) laufen zuallererst über unser Module, und erst wenn es das OK gibt, läuft die angeforderte Seite.
Wer es auf dem eigenen Server versuchen möchte: nicht vergessen, localhost, www.servername.tld und ipadresse auf alle Fälle in die AllowedList einzutragen!
Dieser Artikel beweist - wer Content hat, den er für schützenwert hält muß nicht durch brennende Reifen springen um ihn vor ungewolltem Zugriff zu schützen. Eher darf man die Motive hinterfragen, solche Schutzmechanismen nicht einzubauen wenn man linkende Sites abkassieren möchte.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020304.zip
Mitlauschen bei der Browser-Webserver Kommunikation
http:/www.aspheute.com/artikel/20020305.htm
Klage, Kulanz und Hyperlinks
http://futurezone.orf.at/futurezone.orf?read=detail&id=113633&tmp=82703
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.