Richtige Verwendung von GET- und POST-Requests (Oder: Selbsthack mit Alexa)

Das Projekt Spekunauten befindet sich zur Zeit in der Testphase. Auf der Plattform ist noch nicht viel Publikumsverkehr, da noch keine Marketingmaßnahmen stattgefunden haben. Es gibt trotzdem schon Mitglieder und Beiträge dort, die größtenteils von uns selbst verfasst wurden. Vor ein paar Tagen stellt ich plötzlich fest, dass alle Beiträge nach dem 1.2.2008 gelöscht worden waren.

Ich dachte zuerst, dass einer der anderen Projektteilnehmer das getan hätte, um dort zum Start hin etwas aufzuräumen (die selbst erstellten Beiträge haben nicht so hohe Qualität). Niemand wollte es gewesen sein. Ich vermutete anschließend einen schwierig aufzuspürenden Fehler (die Anwendung wurde per Unit-Test ausreichend abgeklopft, wo sollte sich der Fehler verstecken?), aber ein Blick in die Logfiles zeigte, dass die Beiträge tatsächlich über das Admin-Menü gelöscht wurden- und zwar vom Alexa-Crawler!

Wie konnte das sein? In einem Controller im Admin-Bereich hatte ich ein

before_filter :require_admin

vergessen, so dass man diese Seite auch ohne Admin-Login aufrufen konnte. So weit so gut, nur woher kannte Alexa die URL? Ich benutze das SearchStatus-Plugin für den Firefox-Browser, welches den Google-Page- und Alexa-Rank der aktuellen Seite anzeigt. Darüber muss der Admin-Link zu Alexa.com gelangt sein und wurde anschließend vom Alexa-Crawler besucht. Auf der besuchten Seite gab es eine Liste mit allen Beiträgen der Spekunauten-Seite, der auch die Links zum Löschen enthielt. Diese hat der Crawler besucht und dadurch die Beiträge gelöscht.

Hinter diesem Vorfall steckt mehr als die Lektion, beim Absichern der Controller besser aufzupassen. Die Lösch-Aktion wurde durch einen normalen Link, also einen GET-Request ausgelöst. Das W3C hat zur Verwendung von POST vs. GET-Requests schon angemerkt, dass GET-Requests nur für “ungefährliche” Aktionen benutzt werden sollten (POST bedeutet “The interaction changes the state of the resource”).

Diese Empfehlung wird sogar im Railsbuch erwähnt: GET-Requests dürfen nur für Aktionen verwendet werden, die ohne Schaden mehrmals durchgeführt werden können. Schließlich steht nach dem Request diese URL in der Browserzeile und könnte durch einen Reload (versehentlich) nochmals aufgerufen werden- im Falle eines POST-Requests erscheint bei den meisten Browsern aber eine Warnung. Crawler füllen keine Formulare aus, daher hätte der Alexa-Bot in meinem Fall auch keine Löschaktion durchgeführt.

Tags: , ,

Leave a Reply

CAPTCHA image