Frage von klugshicer, 45

Wie wirkt sich ein "sleep(10)" auf andere User aus?

Mal angenommen man würde die Ausgabe einer PHP-Seite für bestimmte User (aus welchen Gründen auch immer) mit der Funktion "sleep()" für 10 Sekunden verzögern - um z.B. einen Bot auszubremsen.....

Würde sich dadurch die Perfomance eines Webservers verschlechtern?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 11

Du erleichterst damit massiv einen DoS-Angriff! Dank der Verzögerung reicht theoretisch ein einziger (!) schwachbrüstiger RasPi mit sehr langsamer Anbindung völlig aus, um damit ein kleines Rechenzentrum aus Hochleistungsservern binnen Sekunden in die Knie zu zwingen!

Die Idee ist also ganz ganz gaaaaanz schlecht, auch wenn man im Internet immer wieder von diesen sog. "Teergruben" liest.

Ich schreibe auch ab und zu mal einen Crawler / Bot / Spider / Wasauchimmer und in den Logs sehe ich dann später, dass wohl einige Hosts tatsächlich so eine Teergrube eingesetzt haben.

Bloß: Davon bekomme ich im Betrieb überhaupt nichts mit! Es stört den Botbetreiber kein bisschen ... das juckt nichtmal! :)

Wenn von 10000 Verbindungen, eine einzige Verbindung statt einer einzigen Sekunde plötzlich mehr als 10 Sekunden braucht, wird sie abgebrochen und der Server auf eine Blacklist gesetzt. Fertig. Und selbst wenn nicht, wird sie nach 60 Sekunden abgebrochen, und danach gibt es ein paar neue Versuche.

Ob da jetzt eine von mehreren Tausend Verbindungen mal für kurze Zeit in einer Teergrube hängt, oder nicht, das ist mir völlig egal! :)

PHP funktioniert aber so, dass der Interpreter-Prozess trotzdem normal weiter läuft, selbst wenn Client oder Server die Verbindung gekappt haben. Das heißt, wenn ich einen Request abschicke, und binnen 200 Millisekunden die Verbindung trenne, ist ein Prozess / Thread deines Servers immer noch für weitere 9.8 Sekunden NICHT ansprechbar!

Diese Art von Angriff nennt man "Resource Exhaustion" (da gibt es noch mehr mögliche Angriffsszenarien):

https://en.wikipedia.org/wiki/Resource\_exhaustion\_attack

Beim Apache ist das so, dass der Webserver einen Pool an Prozessen bereit hält, die wiederum jeweils einen Pool aus mehreren relativ "leichten" Threads vorhalten. Insgesamt sind das bei einem regulären Apache-Server mit PHP-Modul im höchstfall einige Tausend.

Bei einem eingehenden Request wird ein Handle über IPC an die Unterprozesse weitergereicht, die sich fortan um die Verbindung kümmern.

Ein RasPi kann locker 10000 Requests pro Sekunde abfeuern und wenn auf der Serverseite jeder Prozess / Thread durch sleep(10) für 10 Sekunden lahmgelegt ist, könnte jemand mit bösen Absichten sehr bequem deinen Server lahm legen.

Fazit: Deine Idee ist zwar "clever" in der Theorie, aber in der Praxis öffnest du damit ein Scheunentor großes Sicherheitsloch, über das man deinen Server auf Dauer lahmlegen kann!

Die Idee würde ich also an deiner Stelle ganz schnell wieder vergessen! Du schadest dir damit nur selbst, und ein Botbetreiber wird vermutlich nicht mal etwas davon mitbekommen, dass du versuchst ihn zu behindern.

Trotzdem noch viel Erfolg mit deinem Server! :)

Disclaimer: Die Bots, die ich so schreibe, beachten i. d. R. die "robots.txt" und schicken nur höchstens einmal alle 90 Sekunden eine Anfrage an einen Server. Ich achte immer peinlich darauf, die Server nicht zu "vergewaltigen" und darauf, dem Serverbetreiber keinen Schaden / Nachteil zu bereiten.

Also bitte differenzieren! Es gibt gute, und auch schlechte Crawler! Trotzdem muss man natürlich immer defensiv arbeiten, und seine Server schützen, da es leider viel zu viele Idioten gibt, die böse Bots schreiben. Aber wirf mich mit solchen Leuten bitte nicht in einen Topf! ;)

Kommentar von klugshicer ,

Gute Ausführung - also das mit dem Sleep fliegt raus. Für einen Bekannten habe ich inzwischen ein Script schreiben können, dass vom Prinzip wie "fail2ban" funktioniert.

Antwort
von dan030, 26

Die Performance des Servers sinkt deswegen erstmal nicht direkt. Denn der sleep() wird direkt auf Systemebene ausgewertet, führt dort zu einer zeitgesteuerten Blockade des Prozesses, und der Scheduler vergibt in der Zwischenzeit die Rechenzeit eben an andere Prozesse.

ABER: Der Prozess liegt halt erstmal auf Halde. D. h. Du hast eben einen Prozess im System, der Speicher allokiert hat, für den ein wenig Grundverwaltungsaufwand anfällt usw.

Wenn nun jemand sehr viele Anfragen auf Deine Kiste macht, und die alle in diesen sleep() reinlaufen, dann kann sich daraus eine "denial of service"-Situation ergeben. Denn typischerweise ist die Zahl maximal laufender (Apache-)Prozesse limitiert, und auch der Hauptspeicher ist endlich.

Vor allem die Kombination Apache/PHP tendiert leider dazu, eine Menge Speicher pro in Bearbeitung befindlicher Anfrage zu konsumieren. Das ist halt keine wirklich leichtgewichtige Software.

Kommentar von klugshicer ,

Vielen Dank für diese ausführliche Erklärung.

Kommentar von TeeTier ,

Ich sehe gerade, dass du sinngemäß das gleiche geschrieben hast, wie ich in meiner Antwort. Das nächste mal werde ich die bisherigen Antworten wenigstens mal überfliegen, bevor ich eine eigene verfasse! :)

Antwort
von Bluewater1403, 26

Die Funktion sleep()  legt nicht den ganzen Server lahm, sondern pausiert das Skript nur für Denjenigen, der das Skript aufruft.

Antwort
von LeonardM, 20

1 verbindung mehr bleibt länger geöffnet => es kann theoretisch eine verbindung weniger paralell aufgebaut bzw verarbeitet werden.. bei angriffen (dos/ddos) dürfte das angreifern ganz gut passen das der server freiwillig wartet und blockiert.. ausserdem stockt ja alles (speicher bleibt natürlich bis zum ende mit allen aktuellen Verbindungsdaten & nutzdaten voll)

Kommentar von LeonardM ,

meiner meinung nach total falscher ansatz angriffe ausbremsen zu wollen

Kommentar von klugshicer ,

Das hatte ich befürchtet - ich nutze seit Jahren auf einer Webseite ein Login-System, das die Ausgabe der Seiten bei bei falschen Passworteingaben um 3 Sekunden verzögert.

Angeblich sollte das Bruteforce-Angriffe erschweren - aber das System wird in kürze eh ersetzt.

Kommentar von LeonardM ,

naja gut den bruteforce angriff via http erschwerts natürlich durch die länge der wartezeit aber dafür hat das system gewisse nachteile

Kommentar von klugshicer ,

Deshalb werde ich in Zukunft auch anstatt von Sleep einen Counter für falsche Eingaben verwenden.

Wer dann das Paswort zu oft falsch eingegeben hat, der darf sich für eine Weile meine 403-Seite ansehen.

Kommentar von LeonardM ,

besser :D

Antwort
von triopasi, 15

Das wird nicht's ändern. ABER einen Bot wirst du damit auch nicht wirklich ausbremsen ;)

Keine passende Antwort gefunden?

Fragen Sie die Community