PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Crawler des Todes

SchädelVorgestern war mir Gelächter sicher. Ich entwickle gerade mit mehreren Kollegen zusammen ein Informationsportal mit dem agentureigenen CMS. Als besonderes Feature habe ich einen Inlineeditor entwickelt, den man von anderen Content Management Systemem wie z.B. Typo3 kennt. Mit ihm kann man direkt auf der Webseite Inhalte und Downloads anlegen, bearbeiten und auch wieder löschen.

Zusätzlich ist für das Portal eine Suchmaschine angebunden, die über einen Crawler indexiert. Da das Portal ein geschlossener Bereich ist, muss man sich als Besucher (und natürlich auch der Crawler) zunächst mit einem gültigen Benutzer anmelden.

Jetzt der Schock: Nach dem 1. Crawlerdurchlauf waren alle Inhalte weg! Wie passiert sowas? Mein Kollege hat zum Indexieren das Benutzerkonto des Webmasters oder Administrators verwendet. Sobald man sich mit einem Administrationsbenutzer anmeldet und Rechte an der aktuellen Seite hat, steht dem Benutzer als Option der Inlineeditor zur Verfügung.

Mist! Der Admin hat natürlich das Recht an jeder Seite. Und weil der fleissige Crawler sich nichts dabei denkt, klickt er schön jeden Link an:

  • Schalte Bearbeitungsmodus an
  • Bearbeite alle Seiten (Da passiert natürlich nix)
  • Lösche alle Seiten und Downloads rekursiv (Ups)
  • Beende den Bearbeitungsmodus
  • Beende den Crawlvorgang
  • Stelle den erzeugten Index der Suche zur Verfügung

Gabs denn keine Sicherungen, um sowas zu vermeiden? Doch, doch…

  • Man muss im Bearbeitungsmodus sein, um Löschen zu können
  • Den Bearbeitunsmodus kann man nur starten, wenn man Autor oder Admin ist
  • Man muss Schreibrechte an der Seite/Download haben
  • Javascript-Sind-Sie-Sicher-Abfrage vorm Löschen mit Ja/Nein Option

Gut, auf den 1. Blick sticht natürlich ins Auge, dass nur eine Javascriptabfrage bei onclick mit return true/false implementiert ist. Meine lieben Kollegen waren der Auffassung, das eine PHP-Abfrage das Löschen-Fiasko hätte verhindern können. Aber: falsch gedacht - Denn die PHP Abfrage, die ja wieder nur eine HTML Abfrage generiert, hätte der Crawler ja auch angeklickt.

Oder vielleicht doch? Aber ich bin mir sicher, die wenigsten hätten die folgende Prüfung eingebaut. Es rechnet ja niemand damit, das ein Crawler eine komplette Seite fressen kann…

Die Lösung wäre in der Tat eine PHP Abfrage mit HTML Output gewesen: Der Benutzer wird vor dem Löschen also via HTML Text und zwei Links (Ja/Nein) gefragt, ob die Seite/Datei gelöscht werden soll. Der erste Link (Die Reihenfolge ist wichtig !) ist NEIN oder Abbrechen. Bei Klick wird aber nicht nur zur Ausgangsseite zurückgesprungen, sondern ein Flag gesetzt, das NEIN geklickt wurde.

Bei Klick auf JA muss überprüft werden, ob vorher bereits NEIN geklickt wurde. Wenn ja, dann Abbruch - andern falls löschen. Das Ist-Nein-Geklickt-Flag muss natürlich beim erneuten Anzeigen des Abfragedialogs wieder auf NULL gesetzt/initialisiert werden, damit ein echter Benutzer auch die Möglichkeit hat, es sich noch einmal zu überlegen…

So, jetzt meine Frage: Wer im Himmel hätte so eine Abfrage implementiert? Wir nicht :-( Auf jeden Fall hat der Crawler jetzt einen eigenen Account mit Besucherrechten - Das ist immer noch das sicherste Komdom für den Crawler des Todes!

Teile und genieße
  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

Dirk Olbertz meint dazu:

17. April 2007 um 17:59

Das kommt davon, wenn man GET und POST mischt. Wenn man unbedingt Links haben will, kann man mit Javascript ein POST-Form abschicken. Und in der Methode, die die Daten entgegen nimmt prüfen, ob es ein POST oder GET Request ist.

Das ganze kannst Du im Detail nachlesen, wenn Du im Netz mal nach REST suchst. Und wenn es Dich tröstet: eine ähnliche Geschichte ging vor ein paar Monaten schon einmal durch’s Netz. Dort wurden ebenfalls durch einen Crawler massenhaft GET-Request aufgerufen, die eigentlich per POST hätten übertragen werden sollen.

timi meint dazu:

17. April 2007 um 18:10

Den Fall, den Du ansprichst, kenne ich - ist aber anders gelagert.

Stimmt, mit REST w

Jonny meint dazu:

20. April 2007 um 21:51

Das ganze lässt sich relativ leicht lösen. Wenn in der javascript Sicherheitsabfrage auf “ok” geklickt wird, dann wird der lösch-Url ein weiterer Parameter wie &confirm=1′ angehängt oder alternativ ein hidden Formular Feld auf 1′ gesetzt. Vor dem eigentlichen Löschen überprüft das PHP Script dann noch ob die Variable “confirm” richtig gesetzt ist

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung