Verarbeitungs-Dateien - Direktaufruf verhindern

  • PHP

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Mokki.

    Verarbeitungs-Dateien - Direktaufruf verhindern

    Hey Leute, ich bin gerade n bissl mit PHP dran und möchte n bissl mehr über Sicherheit usw. dort lernen.

    Stellt euch folgendes vor:
    - Ihr habt ein Registrierungs-Formular (.php) Endung.
    - Das Action Attribut der Form ist mit z.B. "doregister.php" bestückt.

    Wie verhindere ich nun, dass jemand dieses Formular missbraucht um 10.000 Accounts zu erstellen.
    Sprich es einfach in VB mehrfach mit nem WebClient() und UploadValues aufzurufen!?

    Ich habe nun gegoogelt und dort wird empfohlen Htaccess für Includes zu verwenden.
    Das macht auch Sinn (vermutlich auch bei Require/Once), weil diese ja Server seitig eingebunden werden und nicht per HTTP aufgerufen werden.

    Aber im Falle dieser Weiterleitung muss der Benutzer ja per HTTP wenn auch nur zeitweilig drauf zugreifen können.


    Eine andere Lösung die mir einfiel:
    Sollte ich ggf. beim besuchen der register.php n Flag setzen, dass diese "GUI" aufgerufen wurde und die Registrierung an sich nur zulassen, wenn diese Flag beim Aufruf der "doregister.php" existiert?

    Wie geht man da sonst vor?

    Bin für jede Hilfe dankbar :)!

    LG! :thumbsup:


    EDIT: Eine weitere Möglichkeit die mir eingefallen ist wäre, wenn man Ajax verwendet? Könnte das dort hilfreich sein?
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    Oder per Captcha. Denke das ist das einfachste. Damit verifizierst du das das vor dem Rechner ein Mensch sitzt und kein Bot
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hey Link, wie meinst du das?

    Das man beim besuchen der ersten Seite ein Token an die URL anhängt? Oder wie oben schon von mir vorgeschlagen n Flag in ne Session Variable schreibt?

    Ja das mit dem Captcha hatte ich auch noch im Kopf. Ist wahrscheinlich das Beste.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Wie ich Capchas hasse :D
    Ich würde eine zwei Schritte Methode implementieren, eine einfache Registrierung mit Email-Adresse, dann an die Adresse eine Mail schicken mit dem Bestätigungslink und wenn man den öffnet kann man die restlichen Infos eintragen. Der generierte Link (der per Mail verschickt wird) ist für zb. 2h gültig und dann per Cron (alle 30 min.) alle "vor angemeldeten User" die die Registrierung nicht abgeschlossen haben entfernen, fertig.
    Okay, mit ner Emai-Registrierung hab ich auch schon gearbeitet.
    Muss nur mitm Cronjob gucken, denn mein Webhosting bietet das innerhalb meines Vertrages nicht an :/.

    Der Cronjob würde dann die "Spams" regeln, aber doof isses trotzdem irgendwie, weil n Bot ja immer noch zig Registrierungen reinhauen kann, bzw. Voranmeldungen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Mir fällt jetzt noch evercookie (Github) ein. Hast aber halt dann nen Problem mit No-Script. (Wenn ich das Problem grad richtig verstanden hab)

    Ne 100% Sicherheit hast du halt nie. Für Captchas gibts Apis die das Captcha nach China schicken wo es von nem Arbeiter gelöst wird und zurückgeschickt wird.(Is aufwendig aber möglich)

    Rootbob91 schrieb:

    zig Registrierungen reinhauen kann

    Du könntest auch den Regestrierungsprozesss verlangsamen, dann sind zumindest nicht mehr so viele möglich.


    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Danke für die Hilfe bisher.

    Letztendlich habe ich mir überlegt die ganze Geschichte mitm Google Login zu machen, da die Leute die meine PHP Scripte verwenden sollen sowieso einen Google-Account haben müssen :)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Was ich meinte war dass man die Registrierung.php nur aufrufen kann wenn zuvor das Formular ordnungsgemäß submitted wurde. Theoretisch brauchst auch keinen Session key. Validieren reicht. Und die tatsächliche Datenbank Eintragung eines Accounts würde ich eh erst machen nachdem der User einen Link in der email bestätigt hat.
    Hello World
    Huhu, okay.

    Naja gut aber die POST Variable vom Submit kann man ja faken oder? Kann ich ja simpel mitschicken obwohl kein Form-Submit stattgefunden hat.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Link schrieb:

    ordnungsgemäß submitted wurde

    Wenn ich des richtig verstehe, magst du das jmd einen Button klickt, aber wenn ich nen Javascript Bot benutze tut der des doch auch, oder?

    Link schrieb:

    Validieren reicht

    Der Bot kann doch auch valide Daten eingeben, oder verstehe ich deine Art von validieren nicht?


    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    POST kannste nur faken, wenn der Angreifer sich ßelber ein Formular baut, welches das entsprechende Feld setzt. Dazu muss er aber den Namen kennen. Mach es mit Session, die sind sicher
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator Und wie stellst du dir vor, sollen die vom Nutzer eingegebenen Daten zum Server kommen? Richtig, mit einem Request (POST/GET/Foobar).
    Ihr könnt versuchen was ihr wollt, alles was ein User senden kann, kann ein Bot ebenfalls senden.

    @Rootbob91 Ich sehe da kein Problem, das ist je Voranmeldung ein Datensatz (Id, Hash der IP, Emailaddr, Token, Timestamp), damit kannst du eine mehrfach Voranmeldung von einer IP aus blockieren, bzw. eine neue Voranmeldung von der selben IP ist nur möglich, wenn die erste Anmeldung abgeschlossen ist.
    Ne nicht unbedingt...eigentlich gar ned, per Java kannst du ja ned auf das PHP-POST Array zugreifen. Was der Angreifer versuchen kann, ist per Javascript und DOM einen HTML Kontext zu erzeugen und über den an die PHP Seite das ganze zu schicken.
    Warscheinlich hast du genau das gemeint, aber ich wiederhole es gerne einmal.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Was hat den jetzt Java hier zu suchen? Noch mal für dich, es geht hier darum Informationen vom Client zum Server zu bekommen, wie du damit Serverseitig umgehst spielt absolut keine Rolle.
    Edit: Und das am besten so, das der Vorgang nicht durch einen "Bot" automatisiert werden kann - was nicht möglich ist, man kann es nur erschweren, was es wiederum für den User schwerer macht.
    Hi,

    deswegen sagte ich ja, dass die Erstellung des Accounts erst erfolgen soll nachdem man nen Link in einer Email angeklickt hat. Der Link übergibt in der URL (GET) nen Token der bei der Registrierung in der DB hinterlegt wurde. Stimmt der Token aus der URL mit dem in der DB überein, kann es losgehen.

    Weitere Mechanismen die man ausprobieren kann:
    - Validierung (teils unsicher, weil wir schon erwähnt auch Bots das können - so ein Teil schreib ich dir in 10 Minuten, ist kein Ding)
    - Captcha - höhere Sicherheit, je nach verwendeter Lib. reCaptcha ist nich übel.
    - Abfrage der IP - neue Registrierungen von gleicher IP nur gestatten wenn eine Weile verstrichen ist bzw. generell den Zugriff blockieren wenn zuviele Zugriffe innerhalb sehr kurzer Zeit erfolgen.
    - Ähnlich wie bei der IP könntest du das auch über ne Session machen, aber das ist nicht sicher (ich hab zuerst ja auch gedacht dass es darum geht dass man die PHP-Datei nur direkt aufrufen kann wenn zuvor das Formular submitted wurde).

    Gut wär ein Mix aus beidem. Session Key um sicherzustellen dass das Formular von der Seite kommt (zusätzlich kannst du noch den HTTP_REFERER zum Abgleich hinzuziehen) und Captcha sowie Token damit alles andere legitimiert wird.


    Link
    Hello World

    Link schrieb:

    Abfrage der IP

    Es ist meines Wissens nach in Deutschland verboten die Ip im Klartext zu speichern. Ich glaube auch zu wissen, dass es in Deutschland erlaubt ist,wenn man die Ip als Hash speichert.

    Link schrieb:

    dass das Formular von der Seite kommt

    Dann verwendet der Angreifer einen Javascript Bot....

    Link schrieb:

    Captcha

    Ist auch nicht sicher, aber zumindest sicherer. Es gibt Apis die die Captcha in ein Land schicken in dem es günstige/billige Arbeitsplätze gibt. Dort lösen dann Menschen die Captcha und senden das Ergebnis der Api zurück. Oder sie nehmen sich eine Captcha-Api vor und lesen über Brute-Force alle Captchas aus, damit ist das ganze dann auch gelöst.

    Link schrieb:

    sowie Token

    Das bringt dann glaub ich die meiste Sicherheit. Solang der Token natürlich Random generiert ist(aber davon geh ich aus).

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mokki“ ()

    Ist auch nicht sicherer, aber zumindest sicherer

    Das is mal ne Aussage... xD

    Sicher, die IP kann man auch als Hash speichern, Sha512 oder sonstwas. Wie auch immer. Je nach Zugänglichkeit (was erlaubt dein Hoster dir alles) hat man ja oft gar nicht die Möglichkeit das zu unterbinden, weil es in den Logfiles gespeichert wird (Errorlog, Accesslog, usw.).

    Ich hab es bei mir immer so gelöst dass ich ein Captcha hab für das Formular. Anschließend wird validiert (Email korrekt, Pflichtfelder ausgefüllt etc..) und ein Token generiert. Der wird in der DB eingetragen, zusammen mit nem Timestamp und der Mailadresse. Somit kann man schonmal Mehrfachregistrierung vorbeugen, weil zuvor jeweils abgefragt wird, ob für die E-Mail Adresse schon ein Token existiert. Falls ja ist der Status einer Registrierung ja quasi auf "Bestätigung ausstehend" und somit keine Neuregistrierung für diese Mailadresse möglich. Aber das schützt natürlich nicht davor, wenn jemand über einen Bot Accounts mit Random-Mailadressen erstellen möchte. Zudem können Bots ja einen Server haben auf dem sie die Bestätigungs-Mails tatsächlich öffnen (random-zeichen@feste-domain.tld) indem sie einen CatchAll für Mails einrichten - über Cronjobs oder wenn der Eingang einer Mail als Event getriggert wird. Das heißt komplett verhindern kann man das nicht, aber so gut es geht vorbeugen. Im Zweifelsfall wär's immer noch möglich dass sich jemand tatsächlich hinsetzt und Nonstop Accounts erstellt und sich dazwischen jedes Mal ne neue IP "holt" und auch jedes Mal den Bestätigungslink in der Mail öffnet und den Browser-Cache leert usw. Muss man einfach abwägen wie hoch die Chancen stehen dass derlei "Attacken" sich als rentabel für Angreifer erweisen - mit anderen Worten ob deine Webseite ein attraktives Ziel darstellt. Generell bietet ja alles was es im Internet gibt (Webapplikationen, Seiten, Portale) mehr Angriffsfläche als lokale Software, logisch.

    Ein weiterer Mechanismus wäre eine künstliche Verzögerung im PHP-Script (mit sleep(3); zum Beispiel). So kann nur alle 3 Sekunden ein Formular abgesendet und ausgewertet werden. Wobei ich jetzt nicht weiß ob der Schuss nach hinten losgehen kann (wenn 1000 Leute zur gleichen Zeit ein Formular absenden mit 3 Sekunden Verzögerung) - ich kenn mich nicht aus wie da die Belastung für den Server ist. @3daycliff hast du Erfahrungen hiermit? Du kennst dich ja auch gut aus.
    //EDIT: was interessantes gefunden hierzu: stackoverflow.com/questions/23…ion-uses-server-resources und stackoverflow.com/questions/16359491/how-sleep-eats-cpu-php

    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Link“ ()

    Link schrieb:

    und den Browser-Cache leert usw.

    Ja, kann man aber erschweren indem man an anderen Stellen speichert.
    Hab ja oben schonmal auf ne javascript Api hingewiesen:

    Mokki schrieb:

    Mir fällt jetzt noch evercookie (Github) ein. Hast aber halt dann nen Problem mit No-Script.

    Link schrieb:

    eine künstliche Verzögerung im PHP-Script

    Meine Rede :) :

    Mokki schrieb:

    Du könntest auch den Regestrierungsprozesss verlangsamen, dann sind zumindest nicht mehr so viele möglich.

    Link schrieb:

    Das is mal ne Aussage... xD

    Doofe Autokorrektur....


    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread