Unerwünschte Referer sperren
Geschrieben von: Christoph Wille 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. Das Http ModuleIch 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. Aktivieren des Http ModulesDas 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! SchlußbemerkungDieser 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Mitlauschen bei der Browser-Webserver Kommunikation Links zu anderen SitesWenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |