PHP Kontaktformular wird von Strato-Sicherheit getriggert

Klaus_I

Cadet 4th Year
Registriert
Mai 2013
Beiträge
71
Hallo zusammen,

ich bin leider sehr unbedarft in Sachen Websites und der Techniken dahinter. Für meine beginnende Selbständigkeit, habe ich mir schnell eine Website mit php-Kontaktformular (Beispiel aus dem Internet) zusammengeschustert, was soweit eigentlich funktioniert.

Allerdings hat mein Webhoster Strato vor einigen Monaten ein neues Sicherheits-Feature zur Überprüfung meiner Website aktiviert (Namen weiß ich leider nicht mehr). Anfangs habe ich täglich eine leere Rückmeldung aus dem Kontaktformular bekommen, dann waren es zwei pro Tag und seit kurzem werde ich alle 2 Stunden damit zugespamt. Die Strato-Hotline konnte mir hier leider nicht weiterhelfen.

Im Anhang habe ich mal meine zwei php-Dateien etwas reduziert angehängt:
kontakt.php ist auf meiner Website sichtbar und löst über den Button "Senden" dann
send_kontakt.php aus.

Wenn ich selbst auf der Website ohne Eingaben auf den Button "Senden" drücke bekomme ich folgende Email:
:: Gesendet am Montag, den 05.09.2022 - 16:51 Uhr ::

::: Name :::


::: Email :::


::: Betreff :::


::: Nachricht :::
Bei den vermutlich von Strato getriggerten Emails, steht da immer nur die erste Zeile mit der Datumsangabe.

Habt Ihr Ideen woran das liegen könnte und wie ich die leeren Emails aus dem Kontaktformular verhindern kann?

Vielen Dank und beste Grüße
Klaus

P.S.: Ich bin auch offen für weitere Verbesserungsvorschläge. Habe gerade gesehen, dass ich keine Umleitung auf eine Fehlerseite habe.
 

Anhänge

Hi,

also mal so grundsätzlich gefragt, du kriegst da Spam-Mails von deinem Formular, in dem du weder einen Spam-Schutz noch eine Abfrage hast, ob überhaupt alle notwendigen Felder ausgefüllt sind?

Aber nicht so leer, wie es sein sollte, sondern eine ganz leere E-Mail? Und das soll Strato durch ihren Virenscanner oder sowas triggern?

Und du bist sicher, dass dein E-Mail-programm da nicht irgendwelche Dinge ausblendet?
 
Klaus_I schrieb:
ich bin leider sehr unbedarft in Sachen Websites und der Techniken dahinter. Für meine beginnende Selbständigkeit, habe ich mir schnell eine Website mit php-Kontaktformular (Beispiel aus dem Internet) zusammengeschustert, was soweit eigentlich funktioniert.
Ich wäre da vorsichtig. Häufig hosten unbedarfte schnell mal Malware und Phishing-Seiten, weil die Website Sicherheitslücken so groß wie Scheunentore haben. Aber ok, als ich jung wahr, wusste ich es auch noch nicht besser.

So wie ich das sehe überprüft dein "send_kontakt.php"-Code nicht mit welcher HTTP-Methode (GET/POST/PUT/etc.) es aufgerufen wird und ob es überhaupt alle Formulardaten erhält. Daher wann immer ein Crawler (z.B. die google Suchmaschine) vorbei kommt und "send_kontakt.php" abruft (ohne dabei Formulardaten mitzuliefern) wird es versuchen eine E-Mail zu erzeugen und zu versenden. Was wohl auch klappt, denn du erhältst ja quasi leere Emails. Klassischer Fall unzureichender Eingabeüberprüfung.

Ob der Crawler nun Google oder das Sicherheitsfeature von Strato ist ist dabei völlig egal. Jeder Aufruf wird gerade eine E-Mail erzeugen.
 
  • Gefällt mir
Reaktionen: Klaus_I und Kalsarikännit
Sehe ich auch so. Die Skripte sind schon sehr basic. Da würde sich ein WordPress oder ähnliches anbieten. Da kriegt man mit relativ kleinen Invest, ein wenig Zeit und Geduld sehr schicke Seiten hin, vor allem wenn auch noch Elementor mit dahinter steckt.

Dem Skript da oben ist Spam Tür und Tor geöffnet. Ein Webspace hast du ja schon bei Strato, Datenbank machen, installieren, fertig.

Mit Hilfe aus dem Forum hier sicherlich kein Hexenwerk :)
 
FlaTLin3 schrieb:
Ich wäre da vorsichtig. Häufig hosten unbedarfte schnell mal Malware und Phishing-Seiten, weil die Website Sicherheitslücken so groß wie Scheunentore haben. Aber ok, als ich jung wahr, wusste ich es auch noch nicht besser.
Leider bin ich nicht mehr jung ;) und die Gefahren habe ich auch im Hinterkopf. Allerdings ist es eine Zwangslage, ich musste mir schnell eine Website zaubern und habe auch kein Geld für professionelle Anbieter. Dazu habe ich auch kaum Zeit mich da selbst halbwegs reinzufuchsen. Das Themengebiet erscheint mir auch viel zu komplex und schnell veränderlich. Eigentlich sollten das Profis machen, die das auch ständig machen. Ist halt leider gerade nicht möglich bei mir.

FlaTLin3 schrieb:
So wie ich das sehe überprüft dein "send_kontakt.php"-Code nicht mit welcher HTTP-Methode (GET/POST/PUT/etc.) es aufgerufen wird
OK, das sagt mir gar nichts. Da muss ich mich erstmal schlau machen. Vielen Dank für die Schlagwörter.

FlaTLin3 schrieb:
und ob es überhaupt alle Formulardaten erhält.
Ja, ich denke auch, da sollte ich ansetzen.

//Hier werden alle Eingabefelder abgefragt
foreach($_POST as $name => $value) {
if (in_array($name, $ignore_fields)) {
continue; //Ignore Felder wird nicht in die Mail eingefügt
}
$msg .= "::: $name :::\n$value\n\n";
}
Wie könnte ich hier noch prüfen ob bestimmte Felder (vor allem der Nachrichtentext) leer sind? Da habe ich überhaupt ein Verständnisproblem, wie man von den Texteingabefelder der einen php-Seite auf die Variablen der send_kontakt.php Seite kommt. Das mit "ignore" bekommt bestimmt aus der Vorlage.

Kann da vielleicht jemand ein Code-Schnippsel liefern oder ist das zu kompliziert?

Beste Grüße
Ergänzung ()

Xiaolong schrieb:
Sehe ich auch so. Die Skripte sind schon sehr basic.
So wie der Rest meiner Website. ;)

Xiaolong schrieb:
Da würde sich ein WordPress oder ähnliches anbieten. Da kriegt man mit relativ kleinen Invest, ein wenig Zeit und Geduld sehr schicke Seiten hin, vor allem wenn auch noch Elementor mit dahinter steckt.
Damit habe ich übrigens am Anfang auch einiges ausprobiert. Hat aber nicht wirklich so funktioniert, wie ich es mir vorstellen könnte. Ein Bekannter hat seine Website durch Profis umstellen lassen und seitdem viel weniger Besucher. Vielleicht haben wir da einfach auch eine andere Zielgruppe?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: FlaTLin3
Klaus_I schrieb:
Ein Bekannter hat seine Website durch Profis umstellen lassen und seitdem viel weniger Besucher.

Dann waren das keine Profis :) Passiert leider häufiger als man denkt.
 
Also du kannst vieles Abfangen in dem du das HTML leicht anpasst:

HTML:
<section>
    <h2 id="Kontakt"> Kontakt </h2>

    <p>Für Fragen, Anregungen oder Kommentare nutzen Sie bitte die oben genannte Email-Adresse oder dieses Kontakt-Formular.</p>

    <form method="post" action="send_kontakt.php">

        <label for="Name"><b>Name:</b></label><br>
        <input required type="text" id="Name" size="40" name="Name"><br><br>

        <label for="Email"><b>E-Mail:</b></label><br>
        <input required type="email" id="Email" size="40" name="Email"><br><br>

        <label for="Betreff"><b>Betreff:</b></label><br>
        <input required type="text" id="Betreff" size="40" name="Betreff"><br><br>

        <label for="Nachricht"><b>Nachricht:</b></label><br>
        <textarea required class="KontaktFormular" id="Nachricht" name="Nachricht" rows="8" cols="40"></textarea> <br><br>

        <input type="submit" name="submit">
    </form>

</section>

Ich hab bei allen Felder noch das Attribute "required" hinzugefügt. Dadurch stoppt der Browser das Absenden des Formulars, wenn es dort keinen Inhalt gibt.

Auf die Prüfung sollte man sich allerdings nicht verlassen. Ich würde empfehlen, in der PHP Datei ebenfalls zu prüfen, ob die Felder Inhalt haben, und wenn nicht das senden der E-Mail abbrechen.

z.b so:

PHP:
<?php
//send_kontakt.php
$absender = "kontakt.formular@XYZ.de";   //Absender falls keiner angegeben wurde
$sendermail_antwort = true;      //E-Mail Adresse des Besuchers als Absender. false= Nein ; true = Ja
$name_von_emailfeld = "Email";   //Feld in der die Absenderadresse steht
 
$empfaenger = "kontakt.formular@XYZ.de"; //Empfänger-Adresse
$mail_cc = ""; //CC-Adresse, diese E-Mail-Adresse bekommt einer weitere Kopie
$betreff = "Neue Kontaktanfrage"; //Betreff der Email
 
$url_ok = "https://www.XYZ.de"; //Zielseite, wenn E-Mail erfolgreich versendet wurde
$url_fehler = "https://www.XYZ.de"; //Zielseite, wenn E-Mail nicht gesendet werden konnte
 
 
//Diese Felder werden nicht in der Mail stehen
$ignore_fields = array('submit');
 
//Datum, wann die Mail erstellt wurde
$name_tag = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
$num_tag = date("w");
$tag = $name_tag[$num_tag];
$jahr = date("Y");
$n = date("d");
$monat = date("m");
$time = date("H:i");
 
//Erste Zeile unserer Email
$msg = ":: Gesendet am $tag, den $n.$monat.$jahr - $time Uhr ::\n\n";

///////////////////Kleine Anpassung von kim88///////////////
$fields_are_not_empty = true; //Variable setzen, mit Wert True
 
//Hier werden alle Eingabefelder abgefragt
foreach($_POST as $name => $value) {
   if (in_array($name, $ignore_fields)) {
        continue; //Ignore Felder wird nicht in die Mail eingefügt
   }
    ///Hier prüfen ob das Feld einen Inhalt hat
    if( !empty( $value ) ) {
        ///// Feld hat einen Inhalt - Nachricht erweitern
        $msg .= "::: $name :::\n$value\n\n";   
    } else {
        ///// Feld hat KEINEN Inhalt: Variable auf False setzen und Schleife abbrechen
        $fields_are_not_empty = false;
        ///Schleife abbrechen
        break;
    }
}
 
 
/////// E-Mail nur senden wenn, die Variable auf true gesetzt ist:
if( $$fields_are_not_empty ) {
    //E-Mail Adresse des Besuchers als Absender
    if ($sendermail_antwort and isset($_POST[$name_von_emailfeld]) and filter_var($_POST[$name_von_emailfeld], FILTER_VALIDATE_EMAIL)) {
       $absender = $_POST[$name_von_emailfeld];
    }

    $header="From: $absender";

    if (!empty($mail_cc)) {
       $header .= "\n";
       $header .= "Cc: $mail_cc";
    }

    //Email als UTF-8 senden
    $header .= "\nContent-type: text/plain; charset=utf-8";

    $mail_senden = mail($empfaenger,$betreff,$msg,$header);   
}
 
//Weiterleitung, hier konnte jetzt per echo auch Ausgaben stehen
if($mail_senden){
  header("Location: ".$url_ok); //Mail wurde gesendet
  exit();
} else{
  header("Location: ".$url_fehler); //Fehler beim Senden
  exit();
}

Bitte beachtet, das ganze ist ungetestet, und jetzt nur so schnell schnell niedergeschrieben - sollte aber funktionieren.

Was ich noch erwähnen will. Ich finde den PHP Code der den Versand regelt furchtbar lange und für das was es tut (ein E-Mail senden) auch furchtbar kompliziert.
Ergänzung ()

Und bitte in Zukunft hier wie ich die Code Tags nutzen und keine Anhänge das ist super nervend ;)
 
  • Gefällt mir
Reaktionen: Phoenixwiger, Smartass und Klaus_I
Ich denke bei einem Anbieter wie jimondo o.ä. wärst du besser aufgehoben. Vorallem weil dir die Kenntnisse fehlen.
Dein Domain Namen kannst du ja dann auf deine jimondo Seite weiterleiten, oder einem anderen Homepage Baukasten Anbieter.
Sollte dir das Leben ungemein Vereinfachen.
 
kim88 schrieb:
Ich hab bei allen Felder noch das Attribute "required" hinzugefügt. Dadurch stoppt der Browser das Absenden des Formulars, wenn es dort keinen Inhalt gibt.
Ok, damit kann ich zumindest keine leeren Emails verschicken. Mal ein paar Stunden abwarten, wie sich das auf Bots & Spiders auswirkt.


kim88 schrieb:
Auf die Prüfung sollte man sich allerdings nicht verlassen. Ich würde empfehlen, in der PHP Datei ebenfalls zu prüfen, ob die Felder Inhalt haben, und wenn nicht das senden der E-Mail abbrechen.
Copy&Paste mit meinen wirklichen Daten hat leider spontan nicht funktioniert. Ich schaue mir Deinen Code morgen aber genauer an. Dann habe ich hoffentlich wieder Zeit und Nerven dafür. :)


kim88 schrieb:
Und bitte in Zukunft hier wie ich die Code Tags nutzen und keine Anhänge das ist super nervend ;)
Sorry, ich habe zwar danach gesucht und bin deswegen auf Zitate ausgewichen. Aber jetzt habe ich gefunden wo das mit den Code Tags ist.

Aber erstmal vielen Dank an alle, insbesondere an kim88.

Gute Nacht!
Klaus
 
  • Gefällt mir
Reaktionen: kim88
Du prüfst in deiner send_kontakt.php ja gar nicht ob die Datei mit der POST-Methode aufgerufen wurde. Das heißt auch wenn man www.xyz.de/send_kontakt.php einfach so im Browser aufruft (=GET Methode) wird eine Mail versandt.

Die meisten Bots/Crawler werden auch nicht das Absenden des Formulares simulieren, sondern einfach alle URLs aus dem HTML Code fischen und dann gesondert abfragen.

Siehe dir vielleicht mal die semantische Bedeutung von den HTTP Methoden an. GET darf keine Veränderung in deinem Datenbestand herbeiführen (also auch keine Nachrichten verschicken) sondern nur Daten abfragen. Crawler/Bots/Scanner müssen deine Seite beliebig mit GET Anfragen durchlöchern können. Wenn dies Nebenwirkungen hat, hast du selber Schuld.

Davon ab kannst du /send_kontakt.php auch in der robots.txt verbieten, aber Security scanner werden darauf keine Rücksicht nehmen. Ist auch die falsche Lösung in diesem Fall.
 
  • Gefällt mir
Reaktionen: FlaTLin3
Zurück
Oben