Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: MODUL: Zeitfalle / Zeitsperre zur Abwehr von Bots, die ein Kundenkonto erstellen

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.195
    • Geschlecht:
    Ich wurde gebeten das folgende als Modul bereitzustellen:

    [...]
    Einfach die Datei /includes/extra/application_top/application_top_end/p3e_register_time_check.php
    mit folgendem Inhalt erstellen:

    Code: PHP  [Auswählen]
    <?php

    // p3e Zeitstempel Create Account 2019-10-23
    // diese Datei sollte im Verzeichnis shop\includes\extra\application_top\application_top_end stehen
    // CHK_TIME_MIN entspricht der Zeit in Sekunden, die der Kunde zum Ausfüllen mindestens benötigen soll
    // (default=2) - falls Bots durchkommen schrittweise erhöhen
    defined('CHK_TIME_MIN') || define('CHK_TIME_MIN', 2);

    if (basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_account' || basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_guest_account') {
            if(!isset($_POST['action']) || (isset($_POST['action']) && $_POST['action'] != 'process')) {
                            $_SESSION['timechk'] = time();   // Zeitstempel
                    }
                    if(isset($_POST['action']) && ($_POST['action'] == 'process')) {
                            if (isset($_SESSION['timechk'])) {
                                    if (time() - $_SESSION['timechk'] < CHK_TIME_MIN) {
                                            // stinkt nach Bot - ab auf die Startseite
                                            unset ($_SESSION['timechk']);
                                            xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                    }
                            } else {
                                    xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                            }
                    }
    }

    Als Minimum-Zeit die der Kunde zum Ausfüllen benötigen soll, habe ich zwei Sekunden vorgegeben.
    Ich kann das selber nicht testen, ob es bei Bots funktioniert, da ich erst einmal so eine Fakeanmeldung hatte. Eventuell sind 2 Sekunden zu kurz angesetzt.
    Falls Bots direkt mit $_POST['action'] == 'process' ein Konto anlegen wollen (also ohne zuvor in der selben Session das leere Formular aufgerufen zu haben), wird dies ebenfalls ignoriert.

    Quelle: Sorge um Sicherheit aufgrund von Fake-Konten

    Erweiterung mit Länderprüfung:

    Ich habe die Zeitfalle um einen Ländercheck erweitert. Das funktioniert bei mir aktuell wunderbar.
    Es gibt immer wieder Bots, die durchkommen und händisch gelöscht werden müssen. Ich habe bei mir 6 Sekunden eingestellt und habe so ca. zwei Bots alle drei Tage die es schaffen sich trotz Zeitfalle zu registrieren. In den Logs habe ich gesehen, dass diese Bots dann länger zum Ausfüllen benötigt haben und die Zeitkomponente hier "menschenähnlich" ist.
    Allen die die Zeitfalle umgehen gemein ist aber, dass im Formular das letzte Land in der Länderliste ausgewählt wurde (wenn man das nicht deaktiviert hat ist das Zimbabwe).
    Aus dem Grund habe ich den Code so erweitert, dass im Falle in der die Zeitfalle nicht greift auch das Land geprüft wird.
    Achtung: Kunden aus dem Land können dann nicht mehr ein neues Kundenkonto anlegen. Man sollte nur ein Land wählen, aus dem man keine Bestellungen will. Ggf. Kann man ein Phantasieland anlegen und die ID im Script übernehmen. Dazu muss in Zeile 12 hinter CHK_UNW_COUNTRY die Länder-ID eingegeben werden.

    Einfach die Datei /includes/extra/application_top/application_top_end/p3e_register_time_check.php
    mit folgendem Inhalt erstellen:
    CHK_TIME_MIN entspricht im Code die Zeit in Sekunden, die der Kunde zum Ausfüllen mindestens benötigen soll -- (default=6) - falls Bots durchkommen schrittweise erhöhen
    CHK_UNW_COUNTRY soll dem vom Bot genutzten Land in der Länderliste entsprechen -- (default=239) - im Admin unter Land/Steuer -> Land -> das Land anklicken, dass die Bots nutzen (bei mir immer das unterste = Zimbabwe) und im Browser die cID auslesen (z.B.: bei /admin/countries.php?page=12&cID=239&action=edit ist es die 239) und unter CHK_UNW_COUNTRY eintragen. Default ist hier 239 (bei mir für Zimbabwe). ACHTUNG! Mit dem Land Zimbabwe kann dann kein Konto mehr angelegt werden. Ggf. ein neues Land alphabetisch nach Zimbabwe erfinden und anlegen! Nutzung auf eigene Gefahr.

    Code: PHP  [Auswählen]
    <?php

    // p3e Zeitstempel + Landexclusion Create Account 2023-10-23
    // diese Datei sollte im Verzeichnis shop\includes\extra\application_top\application_top_end stehen
    // CHK_TIME_MIN entspricht der Zeit in Sekunden, die der Kunde zum Ausfüllen mindestens benötigen soll -- (default=6) - falls Bots durchkommen schrittweise erhöhen
    // CHK_UNW_COUNTRY soll dem vom Bot genutzten Land in der Länderliste entsprechen -- (default=239) - im Admin unter Land/Steuer -> Land -> das Land anklicken, dass
    //    die meisten Bots nutzen
    //    (bei mir immer das unterste = Zimbabwe) und im Browser die cID auslesen (z.B.: bei /admin/countries.php?page=12&cID=239&action=edit ist es die 239) und unter
    //    CHK_UNW_COUNTRY eintragen. Default ist hier 239 (bei mir für Zimbabwe). ACHTUNG! Mit dem Land Zimbabwe kann dann kein Konto mehr angelegt werden. Ggf. ein
    //    neues Land alphabetisch nach Zimbabwe erfinden und anlegen! Nutzung auf eigene Gefahr.
    defined('CHK_TIME_MIN') || define('CHK_TIME_MIN', 6);
    defined('CHK_UNW_COUNTRY') || define('CHK_UNW_COUNTRY', 239);

    if (basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_account' || basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_guest_account') {
            echo ((int)$_POST['country']); //p3e countrycheck
                    if(!isset($_POST['action']) || (isset($_POST['action']) && $_POST['action'] != 'process')) {
                            $_SESSION['timechk'] = time();   // Zeitstempel
                    }
                    if(isset($_POST['action']) && ($_POST['action'] == 'process')) {
                                    if (isset($_SESSION['timechk'])) {
                                                    if (time() - $_SESSION['timechk'] < CHK_TIME_MIN) {
                                                                    // stinkt nach Bot - ab auf die Startseite
                                                                    unset ($_SESSION['timechk']);
                                                                    xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                                    } elseif (isset($_POST['country']) && (int)$_POST['country'] == CHK_UNW_COUNTRY) {
                                                            xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                                    }
                                    } else {
                                                    xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                    }
                    }
    }

    Zusammen mit "MODUL: Captcha mit Würfeln ab Shopversion 2.0.5.0" sicherlich ein guter Weg um unerwünschte Bots aus dem Shop fern zu halten.

    Aber Vorsicht! Immer mehr Browser verwenden auch Formularmanager, die gerade eine Registrierung in Shops erleichtern sollen! Diese Kunden könntet ihr euch durch Einsatz dieser Erweiterung vergraulen! :!:

    Grüße

    Torsten

    [EDIT Tomcraft 31.10.2023: Code mit Länderprüfung ergänzt.]

    Linkback: https://www.modified-shop.org/forum/index.php?topic=41381.0

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    "Formularmanager", echt jetzt ?
    Hast du ein Beispiel, kenne ich so nicht ?

    Dann kann die Zeitfalle in der Tat kontraproduktiv sein.
    Evtl. kann man ja anstatt eines "silent fail" eine Meldung ausgeben, daß der Kunde bitte die eingestellten Sekunden warten bzw. ausnutzen soll bei Ausfüllen des Formulares.

    Gruß,
    noRiddle

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.195
    • Geschlecht:
    "Formularmanager" oder auch "Automatisches ausfüllen" genannt kennt man unter macOS und iOS, siehe:
    Ist dir das nie begegnet!?

    Grüße

    Torsten

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Ah, okay, nein nie gesehen, ich bin AntiMac. :-D
    Danke für die Info, habe inzwischen auch Browser-AddOns gefunden, die sowas machen.

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.271

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Moin

    Ich hab wegen der Formularmanager die Zeit vorsichtshalber mal runter gesetzt auf 5s. Dazu muss man in der Datei 6 eintragen, da es kleiner heißt und nicht kleiner gleich.

    Aber selbst mit Formularmanager und vollausgefülltem eigenen Kontakt im Adressbuch, schaff ich das nicht so schnell. Auf dem iPhone sowieso nicht und auf dem Mac muss man auch mindestens in 3 Felder gehen und den Datenschutz anklicken. Der füllt das nicht komplett mit einem Mal aus. Vermutlich weil es zwei Blöcke sind.

    Einmal füllt er Name und Email aus. Und dann den rechten Block mit Adresse. Und dann muss man noch ein Passwort vorschlagen lassen und bestätigen und dann noch den Datenschutz anhaken.

    Eigentlich wäre 8s optimal, da dies so die Zeit ist, die von den meisten Bots maximal genutzt wird. Gegen Ausnahmen die sich teilweise 40s Zeit lassen, kann man eh nichts machen. Sind aber nur wenige und die muss man halt per Hand löschen.

    Gruss Timm

    P.S. Vielleicht kann ja mal jemand auf einem Windows Rechner testen, wie schnell es da gehen würde das Formular auszufüllen mit den auto-fill-plugins.

    p3e

    • Experte
    • Beiträge: 2.395
    Ich habe bei mir auch die 8 Sekunden als optimale Lösung. Ich hatte vorher in den Logs geschaut, wer wie lange braucht und 99,9% der Bots lagen unter 8 Sekunden. Bei den realen Kunden hatte ich einen, der 16 Sekunden geschafft hat.

    Bei den Bots ist auffällig, dass die bisher immer als Land den obersten Eintrag genommen haben. Man könnte den ersten Eintrag auch"bitte wählen ..." nennen und nur noch die ausschließen, die unter 8 Sekunden brauchen UND kein Land ausgewählt haben. Ich glaube aber nicht wirklich, dass es jemand so schnell schafft und es sind echt viele Bots, die mit dadurch erspart werden.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    ...und wenn du das "MODUL: Captcha mit Würfeln ab Shopversion 2.0.5.0" noch dazunimmst ? Ich denke dann war's das erstmal völlig mit Bots.

    Gruß,
    noRiddle

    p3e

    • Experte
    • Beiträge: 2.395
    In meinem Shop reicht die Zeitfalle oder meinst Du Timm?

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Nee, meinte dich, ich schreibe nicht so kontextlos.
    Ich habe deinen Teilsatz

    [...] es sind echt viele Bots, die mit dadurch erspart werden.

    so gedeutet, daß noch ein paar durchkommen.

    Gruß,
    noRiddle

    p3e

    • Experte
    • Beiträge: 2.395
    Ja, es kommen noch ein paar durch, aber das ist minimal. Also löschen wir die wenigen manuell und erspart den echten Kunden das Captcha (auch wenn ich Deine Lösung sehr ansprechend finde).

    Gulliver72

    • Mitglied
    • Beiträge: 191
    • Geschlecht:
    Hallo zusammen,

    wir haben das Modul auf Github migriert und im MMLC als Modul aus dem modified Forum veröffentlicht.
    Ergänzt haben wir ein System-Modul für die komfortablere Einstellung der Zeit.

    Alle sind eingeladen, die Entwicklung auch auf Github weiterzuführen.
    https://github.com/ModifiedCommunityModules/timestamp-create-account

    Gerne sind wir bereit, Änderungen aus dem Forum auf Github zu übertragen, falls der Beitragende keine Zeit, Lust etc. auf Github hat.

    Das Modul steht ab sofort im MMLC zur Verfügung
    https://module-loader.de/modules/modifiedcommunitymodules/timestamp-create-account

    Selbstverständlich erfolgt eine Nennung des Modul-Erstellers   :thumbs:  und ein Verweis auf diesen Thread.

    Wir empfehlen die Installation des Moduls über den MMLC. (Geübte Entwickler können das Modul auch händisch ohne MMLC einbauen. Hierbei müssen die benötigten Abhängigkeiten und Autoloads manuell installiert werden.)

    Alternativ kann natürlich auch weiterhin das im ersten Beitrag verlinkte Paket genutzt werden.   ;-)
    Darin ist allerdings das System-Modul nicht enthalten.

    VG Bert

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.195
    • Geschlecht:
    Danke dir! :thx:

    Grüße

    Torsten

    p3e

    • Experte
    • Beiträge: 2.395
    Ich habe die Zeitfalle um einen Ländercheck erweitert. Das funktioniert bei mir aktuell wunderbar.
    Es gibt immer wieder Bots, die durchkommen und händisch gelöscht werden müssen. Ich habe bei mir 6 Sekunden eingestellt und habe so ca. zwei Bots alle drei Tage die es schaffen sich trotz Zeitfalle zu registrieren. In den Logs habe ich gesehen, dass diese Bots dann länger zum Ausfüllen benötigt haben und die Zeitkomponente hier "menschenähnlich" ist.
    Allen die die Zeitfalle umgehen gemein ist aber, dass im Formular das letzte Land in der Länderliste ausgewählt wurde (wenn man das nicht deaktiviert hat ist das Zimbabwe).
    Aus dem Grund habe ich den Code so erweitert, dass im Falle in der die Zeitfalle nicht greift auch das Land geprüft wird.
    Achtung: Kunden aus dem Land können dann nicht mehr ein neues Kundenkonto anlegen. Man sollte nur ein Land wählen, aus dem man keine Bestellungen will. Ggf. Kann man ein Phantasieland anlegen und die ID im Script übernehmen. Dazu muss in Zeile 12 hinter CHK_UNW_COUNTRY die Länder-ID eingegeben werden.

    Einfach die Datei /includes/extra/application_top/application_top_end/p3e_register_time_check.php
    mit folgendem Inhalt erstellen:
    CHK_TIME_MIN entspricht im Code die Zeit in Sekunden, die der Kunde zum Ausfüllen mindestens benötigen soll -- (default=6) - falls Bots durchkommen schrittweise erhöhen
    CHK_UNW_COUNTRY soll dem vom Bot genutzten Land in der Länderliste entsprechen -- (default=239) - im Admin unter Land/Steuer -> Land -> das Land anklicken, dass die Bots nutzen (bei mir immer das unterste = Zimbabwe) und im Browser die cID auslesen (z.B.: bei /admin/countries.php?page=12&cID=239&action=edit ist es die 239) und unter CHK_UNW_COUNTRY eintragen. Default ist hier 239 (bei mir für Zimbabwe). ACHTUNG! Mit dem Land Zimbabwe kann dann kein Konto mehr angelegt werden. Ggf. ein neues Land alphabetisch nach Zimbabwe erfinden und anlegen! Nutzung auf eigene Gefahr.

    Code: PHP  [Auswählen]
    <?php

    // p3e Zeitstempel + Landexclusion Create Account 2023-10-23
    // diese Datei sollte im Verzeichnis shop\includes\extra\application_top\application_top_end stehen
    // CHK_TIME_MIN entspricht der Zeit in Sekunden, die der Kunde zum Ausfüllen mindestens benötigen soll -- (default=6) - falls Bots durchkommen schrittweise erhöhen
    // CHK_UNW_COUNTRY soll dem vom Bot genutzten Land in der Länderliste entsprechen -- (default=239) - im Admin unter Land/Steuer -> Land -> das Land anklicken, dass
    //    die meisten Bots nutzen
    //    (bei mir immer das unterste = Zimbabwe) und im Browser die cID auslesen (z.B.: bei /admin/countries.php?page=12&cID=239&action=edit ist es die 239) und unter
    //    CHK_UNW_COUNTRY eintragen. Default ist hier 239 (bei mir für Zimbabwe). ACHTUNG! Mit dem Land Zimbabwe kann dann kein Konto mehr angelegt werden. Ggf. ein
    //    neues Land alphabetisch nach Zimbabwe erfinden und anlegen! Nutzung auf eigene Gefahr.
    defined('CHK_TIME_MIN') || define('CHK_TIME_MIN', 6);
    defined('CHK_UNW_COUNTRY') || define('CHK_UNW_COUNTRY', 239);

    if (basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_account' || basename($_SERVER["SCRIPT_NAME"], '.php') == 'create_guest_account') {
            echo ((int)$_POST['country']); //p3e countrycheck
                    if(!isset($_POST['action']) || (isset($_POST['action']) && $_POST['action'] != 'process')) {
                            $_SESSION['timechk'] = time();   // Zeitstempel
                    }
                    if(isset($_POST['action']) && ($_POST['action'] == 'process')) {
                                    if (isset($_SESSION['timechk'])) {
                                                    if (time() - $_SESSION['timechk'] < CHK_TIME_MIN) {
                                                                    // stinkt nach Bot - ab auf die Startseite
                                                                    unset ($_SESSION['timechk']);
                                                                    xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                                    } elseif (isset($_POST['country']) && (int)$_POST['country'] == CHK_UNW_COUNTRY) {
                                                            xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                                    }
                                    } else {
                                                    xtc_redirect(xtc_href_link(FILENAME_DEFAULT));
                                    }
                    }
    }

    [EDIT Tomcraft 31.10.2023: Code in Beitrag 1 ergänzt.]

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.853
    • Geschlecht:
    [...] In den Logs habe ich gesehen, dass diese Bots dann länger zum Ausfüllen benötigt haben und die Zeitkomponente hier "menschenähnlich" ist.
    Allen die die Zeitfalle umgehen gemein ist aber, dass im Formular das letzte Land in der Länderliste ausgewählt wurde (wenn man das nicht deaktiviert hat ist das Zimbabwe).
    [...]

    Servus p3e,

    mal ne Frage, welche Logs du da auswertest? Wo finde ich diese bzw. nach welchem Log muss ich schauen?

    Die Ländergeschichte ist nicht schlecht, aber im Kontaktformular (auf deiner Seite) muss man doch gar kein Land auswählen!? :-?

    Aktuell gehts mir wieder ziemlich auf den Zeiger, weil bei uns täglich wieder bis zu 5 Stück durchkommen...ist einfach unnötig, aber es gibt ja aktuell bis auf deine Zeitfalle wenig Ideen, die Sache in den Griff zu bekommen.

    Grüße
    Dominik
    33 Antworten
    13827 Aufrufe
    15. Oktober 2019, 21:17:37 von sEdeMi
    3 Antworten
    2654 Aufrufe
    11. November 2012, 17:38:50 von jannemann
    2 Antworten
    2093 Aufrufe
    07. Dezember 2014, 14:59:32 von Bonsai