Kontaktformular mit Bestätigungsmail?

Allgemeine Fragen
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

@Tommy, war das exit hier an der Stelle schon immer drinnen oder ist das neu?

Code: Alles auswählen

 // Umleitung auf erstellte Fehlerseite und Abbruch vom Script
    header("Location: " . "Kontakt-Captcha.php");
    exit;
Weil ein header("Location: " sagt dem Browser nur dass er jetzt umleiten soll, ggf. macht er das auch aber das Skript würde ohne exit nicht unbedingt enden.
Verwendet man statt einem Browser z.B. curl dann würde das Skript da ganz normal weiter laufen und ggf. ne Mail senden.
Bei curl müsste man wenn man es so wie im Browser haben will ein -L (Follow Redirects) extra angeben ... was SPAM Bots natürlich nicht machen (falls sie überhaupt curl verwenden).

Bzgl. Session löschen, da hatte ich mich ggf. etwas unklar ausgedrückt, was ich meinte ist damit die Daten mit 1 mal gelösten Captch nicht 1000+ noch mal so gesendet werden können sollte captcha_result nach erfolgreicher Prüfung neu gesetzt werden damit das Captch neu gelöst werden muss wenn eine Mail versendet wurde.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Moin Klaus,

danke für Deine Hilfe.

Das gesamte Captcha ist ja von mir, bzw. das habe ich mit Hilfe der KI "ChatGPT" erstellt. Das ist also nicht vom Werner.

Andererseits hat "ChatGPT" das "mailscript.php" nicht gesehen, sondern lediglich das Captcha für mein Formular mit mir entwickelt.

Ich habe keine Ahnung von der Programmbibliothek "cURL" und noch weniger darüber, ob Spambots diese nutzen könnten oder würden. Eigentlich kommt es mir jetzt ausschließlich auf Spambots an und nicht auf das Können irgendwelcher Hacker.



Ja - dieses "exit" war dort schon immer.

Das habe allerdings ich dort gesetzt und nicht ChatGPT, weil ich das Captcha-Script zur Prüfung ja mit in das "mailscript.php" mit eingebaut habe. Bei richtiger Lösung muss es ja mit dem "mailscript.php" darunter auch weiter gehen.

Deswegen das "exit" an dieser Stelle, weil ja die Lösung der Captcha-Aufgabe dort dann als falsch erkannt wurde und dann auf diese Fehlerseite "Kontakt-Captcha.php" weitergeleitet wird und das "mailscript.php" abgebrochen werden muss.

Ist denn die SESSION an dieser Stelle, also unterhalb der Captcha-Teils, so richtig oder nicht? Sollte das lieber im Captcha-Script drinnen stehen, wenn die Lösung korrekt war? Ich hatte gedacht, dass es eigentlich egal sein sollte, ob ich das im IF oder darunter schließe.

Das Schließen der SESSION ist neu, das war bei Deinen Versuchen vor einer Woche noch nicht drinnen.

Ich habe alle Kommentare im Skript belassen, damit jeder die Möglichkeit hat, selbst zu testen und sich die Ausgaben mittels `echo` anzeigen zu lassen, wenn er die Kommentarzeichen // entfernt.


Code: Alles auswählen

// Optionaler Captcha Spamschutz von Tommy vom 07.10.2024
session_start(); // Startet oder übernimmt die Session

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $captchaUserInput = $_POST['captcha'];
  $captchaCorrectResult = $_SESSION['captcha_result'];

  // Optional: Speichere die Benutzereingabe zur Ausgabe auf anderer Seite
  $_SESSION['captcha_user_input'] = $captchaUserInput;

  // Debugging: Ausgabe der Werte zur Überprüfung
  // echo "Eingabe: " . $captchaUserInput . "<br>";
  // echo "Erwartetes Ergebnis: " . $captchaCorrectResult . "<br>";

  // Überprüfe das Captcha
  if (intval($captchaUserInput) === intval($captchaCorrectResult)) {
    // Debugging: Werte vergleichen - richtig
    // Captcha korrekt - Hier weiter mit dem Senden der Mail
    // echo "Nachricht wurde erfolgreich verschickt!";
    
  } else {
    
    // Debugging: Werte vergleichen - falsch
    // Captcha falsch - Fehlermeldung anzeigen und Link zurück zur Seite
    // echo "Das Captcha wurde falsch beantwortet. Bitte versuche es erneut.<br>";
    // echo '<a href="Mail-Senden.php">Zurück zum Formular</a>';
    
    // Umleitung auf erstellte Fehlerseite und Abbruch vom Script
    header("Location: " . "Kontakt-Captcha.php");
    exit;
  }
}

// Session beenden, da sie nicht mehr benötigt wird
session_unset(); // Löscht die Session-Variablen
session_destroy(); // Beendet die Session
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Frage an "ChatGPT":

Inwieweit nutzen Spambots "cURL"?

ChatGPT hat geschrieben:
Spambots nutzen cURL häufig als Teil ihres automatisierten Skripting-Prozesses, um Webformulare auszufüllen, Anfragen an APIs zu senden oder Webseiten zu scrapen. cURL (Client URL) ist ein Kommandozeilen-Tool und eine Bibliothek, die HTTP-Anfragen senden und empfangen kann. Hier sind einige Wege, wie Spambots cURL nutzen:

1. Automatisiertes Absenden von Formularen

Spambots verwenden cURL, um HTTP-POST- oder GET-Anfragen zu senden und dabei Anmelde-, Kontakt- oder Kommentarformulare automatisiert auszufüllen. Beispiel:

Code: Alles auswählen

curl -X POST -d "name=SpamBot&email=spam@example.com&message=Buy now!" https://example.com/contact-form

2. Scraping von Webseiten

Spambots nutzen cURL, um Webseiten-Inhalte zu extrahieren, z. B. E-Mail-Adressen oder Preislisten. Sie senden GET-Anfragen und parsen den HTML-Code:

Code: Alles auswählen

curl -s https://example.com | grep -E -o "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"

3. Bruteforce-Angriffe auf Logins

Spambots versuchen, mit cURL verschiedene Passwörter in Login-Formulare einzufügen:

Code: Alles auswählen

curl -X POST -d "username=admin&password=123456" https://example.com/login

4. Verteilung von Spam-Kommentaren

Spambots posten automatisierte Nachrichten in Foren oder Blogs:

Code: Alles auswählen

curl -X POST -d "comment=Check out this amazing deal!&author=SpamBot" https://example.com/blog/comment

5. Proxy- und User-Agent-Verschleierung

Um nicht erkannt zu werden, ändern Spambots mit cURL ihre User-Agent-Zeichenfolge oder verwenden Proxys:

Code: Alles auswählen

curl -x socks5://127.0.0.1:9050 -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://example.com

Schutzmaßnahmen gegen cURL-Spambots:

> CAPTCHAs einbauen
> Rate Limiting aktivieren
> User-Agent-Strings analysieren
> IP-Blacklisting & Geo-Blocking
> JavaScript-gestützte Formulare verwenden

Hast du ein spezifisches Szenario im Kopf, das du näher beleuchten möchtest?
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Volker »

Hab auch mal nachgefragt ;)

1. Captcha regenerieren nach jeder Anfrage
Der häufigste Fehler ist, dass das Captcha nach der ersten Generierung weiterhin gültig bleibt. Falls jemand das Captcha ausliest, kann er es beliebig oft verwenden. Lösung: Lösche das Captcha direkt nach der Überprüfung:

Code: Alles auswählen

session_start();

if (!isset($_SESSION['captcha_word']) || trim($_POST['captcha']) !== $_SESSION['captcha_word']) {
    header("Location: fehler.html");
    exit;
}

// Captcha direkt ungültig machen!
unset($_SESSION['captcha_word']); 

echo "Captcha korrekt!";
2. Captcha-Token einführen
Statt nur das Wort zu speichern, kannst du zusätzlich ein Token verwenden.

Der Nutzer bekommt das Captcha-Bild + einen zufälligen Token.
Beim Absenden wird geprüft, ob Token und Captcha-Wort übereinstimmen.

Code: Alles auswählen

session_start();

$captcha_word = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789"), 0, 6);
$captcha_token = bin2hex(random_bytes(16)); // Sichere, zufällige ID

$_SESSION['captchas'][$captcha_token] = $captcha_word; // Captcha speichern

// Captcha-Bild generieren (z. B. mit GD oder ImageMagick)
header("Content-Type: image/png");
// Hier dein Code zur Captcha-Erstellung einfügen...

echo json_encode(["token" => $captcha_token]); // Token an den Nutzer senden
Captcha-Prüfung (mailendfassung.php):

Code: Alles auswählen

session_start();

$token = $_POST['captcha_token'] ?? '';
$captcha = $_POST['captcha'] ?? '';

if (!isset($_SESSION['captchas'][$token]) || $captcha !== $_SESSION['captchas'][$token]) {
    header("Location: fehler.html");
    exit;
}

// Nach Überprüfung löschen
unset($_SESSION['captchas'][$token]); 

echo "Captcha korrekt!";
🔒 Vorteil: Selbst wenn das Captcha sichtbar ist, kann es nicht ohne den passenden Token benutzt werden.

3. Rate-Limit setzen
Verhindere, dass jemand unendlich viele Captchas ausprobiert:

IP-Sperre: Speichere die Anzahl der Versuche pro IP.
Zeitbasierte Sperre: Zwinge einen kurzen Delay zwischen Versuchen.

Code: Alles auswählen

session_start();
$ip = $_SERVER['REMOTE_ADDR'];
$versuche = $_SESSION['captcha_versuche'][$ip] ?? 0;

if ($versuche >= 5) {
    die("Zu viele Versuche, bitte warten.");
}

$_SESSION['captcha_versuche'][$ip] = $versuche + 1;

// Captcha-Überprüfung ...
⏳ Vorteil: Angreifer können nicht einfach per cURL Millionen von Captchas testen.

4. Referrer prüfen
Akzeptiere nur Captcha-Eingaben von deiner Website:

Code: Alles auswählen

if (!isset($_SERVER['HTTP_REFERER']) || !str_contains($_SERVER['HTTP_REFERER'], "niederastroth.de")) {
    die("Ungültige Anfrage!");
}
🚨 Achtung: HTTP_REFERER kann manipuliert werden, aber es hilft gegen einfache cURL-Angriffe.

Mit diesen Methoden machst du es Angreifern schwer, das Captcha einfach per cURL zu umgehen. 🚀

Falls du Fragen hast, gerne fragen! 😊
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Danke Volker,

aber es ist schon ein wenig merkwürdig, wenn ein Blinder einen Lahmen führt :blind:

Ich habe das doch so. Sobald das Captcha gelöst wurde, wird das Ergebnis gelöscht. Allerdings fehlte das noch, als Klaus es getestet hatte.

Es sollte eigentlich ausreichen, wenn eine Schutzmaßnahme korrekt implementiert ist. Darum geht es mir. Ich werde doch kein Formular anbieten, das mit einem Dutzend unterschiedlicher Maßnahmen überladen ist.

Übrigens wurde dieses Formular in den letzten 8 Jahren, abgesehen von Klaus' Test über cURL, noch nie gespammt.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Klaus,

bist Du so lieb und guckst nochmals über mein jetzt ganz neu erstelltes "mailscript.php" (Code unten), nun habe ich den Captcha-Spamschutz bereits mit eingebaut.

Da das alles ziemlich unübersichtlich fand, habe ich jetzt kurzerhand dieses Skript, zusammen mit dem neuesten "PHPMailer v6.9.3", als Download zur Verfügung gestellt. Dabei habe ich das "mailscript.php" vom Werner etwas überarbeitet.


https://www.mobirise-tutorials.com/Kont ... aptcha-New
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Volker »

Mag sein das ich Blind und eventuell sogar taub und lahm bin ;)

Aber ich habe mir erlaubt ( für mich ) das Script von Werner mit allen sinnvollen Maßnahmen vollzustopfen weil es
1. nicht schadet und 2. das script noch einen Ticken sicherer macht ( wie ich finde )

Das Captcha wird mit einem token ausgeliefert - da nutzt also das reine Captcha den Bots nichts ;)
Alle anderen Maßnahmen wie bereits beschrieben habe ich auch mit drin.

Falls also einer Interesse an diesem "vollgestopften" Script hat kann es gerne von mir bekommen.

Hier das ganze im Einsatz:
https://niederastroth.de/Mail1
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Moin,

ja klar kannst Du das machen. Ich mag aber kein Skript mit so vielen Schutz-Elementen zum Download anbieten. Da blickt ja kein Mensch dann durch. Ich halte das auch für übertrieben und daher wenig sinnvoll.
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

Das Problem wenn man nur einen Schutz hat ist, wenn der versagt hat man gar keinen und die Bots können unbegrenzt rausfeuern.
Falls ich Dich vor ca. 1 Jahr richtig verstanden hatte war genau das das Problem mit Werners einfachen Rechen Captcha.

... und wie ich gerade sehe hast Du in Deinem Skript vermutlich noch einen 2ten Bug und der ist noch viel schlimmer.

Muss noch mal kurz austesten aber der wäre dann auch die Erklärung für Detlevs Beobachtung.

Tipp:
Rate mal was passiert wenn ein Bot (oder curl) der nicht in einer PHP Session ist das Skript direkt aufruft?
$captchaUserInput = '' und $captchaCorrectResult = '' ... was kommt wohl dabei raus wenn man die zwei vergleicht?
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Volker »

Klaus kannst Du mein neues auch bitte nochmals testen ?
Wäre echt klasse und super nett :D

https://niederastroth.de/Mail1/
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Klaus hat geschrieben: So 16. Mär 2025, 11:58 Muss noch mal kurz austesten aber der wäre dann auch die Erklärung für Detlevs Beobachtung.

Tipp:
Rate mal was passiert wenn ein Bot (oder curl) der nicht in einer PHP Session ist das Skript direkt aufruft?
$captchaUserInput = '' und $captchaCorrectResult = '' ... was kommt wohl dabei raus wenn man die zwei vergleicht?

Klaus,

ich weiß jetzt nicht wie Du das meinst? Ohne das ein POST gesendet wurde kommt man doch eigentlich nicht an das "mailscript.php" ran.

Code: Alles auswählen

if ($_SERVER["REQUEST_METHOD"] == "POST")
Wenn ein Formular gesendet wurde, dann ist auch die SESSION im Script "captcha_image.php" gestartet:

Code: Alles auswählen

<?php
  // Tommy October 7, 2024
  // Save this code as a file named captcha_image.php

  session_start();

  // Zufallszahlen für die Rechenaufgabe
  $num1 = rand(1, 10);
  $num2 = rand(1, 10);
  $captchaResult = $num1 + $num2;

  // Das richtige Ergebnis in einer Session-Variable speichern
  $_SESSION['captcha_result'] = $captchaResult;

  // Erstelle ein Bild
  $img = imagecreatetruecolor(120, 40);

  // Farben definieren
  $bg_color = imagecolorallocate($img, 255, 255, 255); // Weißer Hintergrund
  $text_color = imagecolorallocate($img, 0, 0, 0); // Schwarzer Text
  $line_color = imagecolorallocate($img, 64, 64, 64); // Graue Linien

  // Fülle den Hintergrund
  imagefilledrectangle($img, 0, 0, 120, 40, $bg_color);

  // Optional: Verwirrende Linien einfügen
  for($i = 0; $i < 5; $i++) {
    imageline($img, rand(0, 120), rand(0, 40), rand(0, 120), rand(0, 40), $line_color);
  }

  // Text für die Rechenaufgabe (Captcha)
  $captcha_text = "$num1 + $num2 = ?";
  imagestring($img, 5, 20, 10, $captcha_text, $text_color);

  // Header für die Bildausgabe
  header("Content-type: image/png");
  imagepng($img);
  imagedestroy($img);
?>

Captcha-Bereich im Formular:

Code: Alles auswählen

<!-- Captcha-Bereich -->
<div class="col-md-3 mbr-form">
  <label mbr-text mbr-theme-style="display-7" for="captcha" class="form-control-label mbr-fonts-style">Captcha:</label>
  <img id="captchaImage" style="max-width: 150px;" src="https://www.mobirise-tutorials.com/captcha_image.php" alt="Captcha-Bild">
  <br>
  <input type="text" name="captcha" required="required" class="form-control" placeholder="Ergebnis eingeben" autocomplete="off" maxlength="6">
</div>
Wenn da etwas fehlt, bitte sei so nett und schreibe mir was und wo. Ich habe da nicht genügend PHP-Kenntnisse.
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

Wenn ich curl so aufrufe kommt unten dass auf die danke.html umgeleitet wird ... also hast Du den Post angenommen:

... curl ... aus Sicherheitsgründen entfernt ...
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Klaus,

das hilft mir nix. Ich kann damit nicht umgehen.

Was muss ich denn in mein Script schreiben um das zu unterbinden?
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

Kommen denn die Mails dann an oder nicht, falls ja nimm das Skript erst mal weg und meinen Post oben raus?
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Bei mir ist bisher keine einzige Mail angekommen.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Doch jetzt sind sie alle auf einmal gekommen ...
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

Hab das curl dann fix rausgenommen.

Erklärung kommt gleich aber benenne das Skript erst mal um.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

Geht das zum Beispiel:

Code: Alles auswählen

if (strpos($_SERVER['HTTP_USER_AGENT'], 'curl') !== false) {
    die("Direkter Zugriff nicht erlaubt.");
}
Klaus
Supporter
Supporter
Beiträge: 524
Registriert: Mi 21. Jul 2021, 00:43

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Klaus »

Also Dein Skript geht von der Annahme aus dass schon eine Session besteht weil ja das Formular aufgerufen wurde und dadurch eine Session mit dem Captcha Ergebnis "hinterlegt" wurde.
In der mailscript.php prüfst Du dann ob die Benutzereingabe vom Captch zu dem passt was in der Session als Ergebnis steht.

Problem dabei wenn man z.B. mittels curl die mailscript.php direkt aufruft gab es vorher keine Session und es kann somit beim gewünschten Ergebnis auch nichts drinnen stehen, wenn man dann zusätzlich auch keine Benutzereingabe fürs Captch mitsendest vergleicht Du nix mit nix und das ist wahr! ;-)

->Du musst zusätzlich prüfen ob im "gewünschten Ergebnis" überhaupt was drinnen steht, nur dann macht ein Vergleich sinn.

... und HTTP_USER_AGENT bringt da auch nix, das kann man beliebig mitsenden oder man kann auch im Browser vor dem absenden das Session Cookie löschen ...
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7758
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Kontaktformular mit Bestätigungsmail?

Ungelesener Beitrag von Tommy Herrmann »

So???

Code: Alles auswählen

if (empty($captchaUserInput) || empty($captchaCorrectResult) || intval($captchaUserInput) !== intval($captchaCorrectResult)) {
    // Captcha-Eingabe fehlt oder ist falsch → Umleitung zur Fehlerseite
    header("Location: Kontakt-Captcha.php");
    exit();
}
Habe das jetzt so mal eingebaut:

https://www.mobirise-tutorials.com/Kont ... p#Formular
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot], Amazon [Bot] und 6 Gäste