Kontaktformular in PHP - mit ChatGPT

RAMSoße

Lt. Commander
Registriert
März 2018
Beiträge
1.570
Guten Morgen zusammen

Heute habe ich versucht mit ChatGPU ein php Kontaktformular zusammen zu klöppeln.
Optisch finde ich das schon ganz ansprechend. Auch so, leistet die KI keine schlechte Arbeit. Ich kann nur empfehlen mal zu testen. Aber das nur nebenbei.

Das Formular seht ihr hier:

HTML:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    <title>Kontaktformular</title>
  </head>
  <body>
    <div class="container mt-5">
      <h1 class="text-center">Kontaktieren Sie uns</h1>
      <form action="kontaktformular.php" method="post">
        <div class="form-group">
          <label for="anrede">Anrede <span class="text-danger">*</span></label>
          <select class="form-control" name="anrede" id="anrede" required>
            <option value="Frau">Frau</option>
            <option value="Herr">Herr</option>
          </select>
        </div>
        <div class="form-group">
          <label for="vorname">Vorname <span class="text-danger">*</span></label>
          <input type="text" class="form-control" name="vorname" id="vorname" placeholder="Vorname" required>
        </div>
        <div class="form-group">
          <label for="nachname">Nachname <span class="text-danger">*</span></label>
          <input type="text" class="form-control" name="nachname" id="nachname" placeholder="Nachname" required>
        </div>
        <div class="form-group">
          <label for="email">E-Mail-Adresse <span class="text-danger">*</span></label>
          <input type="email" class="form-control" name="email" id="email" placeholder="E-Mail-Adresse" required>
        </div>
        <div class="form-group">
          <label for="nachricht">Nachricht <span class="text-danger">*</span></label>
          <textarea class="form-control" name="nachricht" id="nachricht" rows="5" required></textarea>
        </div>
        <button type="submit" class="btn btn-primary">Senden</button>
      </form>
    </div>
  </body>
</html>

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $anrede = $_POST['anrede'];
  $vorname = $_POST['vorname'];
  $nachname = $_POST['nachname'];
  $email = $_POST['email'];
  $nachricht = $_POST['nachricht'];

  $empfaenger = "empfaenger@example.com";
  $betreff = "Kontaktformular-Nachricht von $v

Wie bekomme ich denn da den MailServer rein? Und noch dazu, Passwort nicht im Klartext. Folgendes hat GPT ausgespuckt:
PHP:
<?php
if(isset($_POST['submit'])) {
  $anrede = $_POST['anrede'];
  $vorname = $_POST['vorname'];
  $nachname = $_POST['nachname'];
  $email = $_POST['email'];
  $text = $_POST['text'];
 
  require_once "vendor/autoload.php";
 
  $mail = new PHPMailer;
 
  $mail->isSMTP();
  $mail->Host = 'mail.gmx.net';
  $mail->SMTPAuth = true;
  $mail->Username = 'test@web.de';
  $mail->Password = '1212';
  $mail->SMTPSecure = 'tls';
  $mail->Port = 587;
 
  $mail->setFrom($email, $vorname . ' ' . $nachname);
  $mail->addAddress('leuchtturm-it@gmx.de');
  $mail->Subject = 'Nachricht von ' . $vorname . ' ' . $nachname;
  $mail->Body = $anrede . ' ' . $vorname . ' ' . $nachname . ' hat die folgende Nachricht gesendet: ' . $text;
 
  if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
  } else {
    echo 'Message has been sent';
  }
}
?>

Sicher ist das keine so schöne Methode etwas zu schreiben, selbst ist der Mensch :) ich dachte mir nur, das spart mir gerade etwas Zeit, die ich durch Familie nicht habe.

Stimmt der PHP Code? Wie bekomme ich beide zusammen und so, dass man im Code das Passwort nicht angezeigt bekommt. Geht das?
 
Zuletzt bearbeitet:
@cmi777

Ich habe sie unten nochmal gestellt. Sorry...ich hol mir mal lieber einen Kaffee
 
RAMSoße schrieb:
Passwort nicht im Klartext
An irgendeiner Stelle steht das Passwort halt im Klartext, weil du must es ja senden. Den PHP-Teil bekommt der Benutzer nicht zu sehen... das wird auf dem Server abgehandelt. Oder was genau ist dein Problem mit dem Passwort?

Du kannst natürlich mit "Vault"-Systemen anfangen und dir das Passwort zur Laufzeit abholen. Aber das führt in deinem Anwendungsszenario wohl zu weit ;)
 
  • Gefällt mir
Reaktionen: RAMSoße
@KillerCow

Ich dachte nur, auch wenn die PHP Datei da einfach herum liegt, gibt es vielleicht so eine Methode. Aber für meine Zweck wird das wohl reichen. Danke
Ich schaue grad mal das ich beides zusammen bekomme.
 
RAMSoße schrieb:
Stimmt der PHP Code? Wie bekomme ich beide zusammen und so, dass man im Code das Passwort nicht angezeigt bekommt. Geht das?

Puh. Du lässt ChatGPT für dich "programmieren" und andere sollen dann schauen, ob der Code stimmt? Hast du das Script denn mal ausprobiert? Deine Frage klingt jetzt ziemlich nach "eigentlich hab ich keine Lust Zeit mich selbst damit zu beschäftigen und habe eigentlich auch gar keine Ahnung vom Programmieren".

Aber um es "trotzdem" zu beantworten:

Es ist kein schöner Code, aber es sollte funktionieren. (Aber halt nur, wenn man auch bisschen Ahnung von PHP hat und bspw. mit Composer umgehen kann (Setup der Umgebung, Import von PHPMailer))

Was das Passwort angeht: das Script wird serverseitig ausgeführt (d.h. das Passwort sieht niemand). In irgendeiner Art musst du dich ja (hoffentlich/wahrscheinlich) authentifizieren. Die Settings kannst bspw. nur du sagen. Das hängt immer vom Anbieter ab. (Wahrscheinlich sind diese Daten aber auch schon von dir und nicht von ChatGPT)

KillerCow schrieb:
Du kannst natürlich mit "Vault"-Systemen anfangen und dir das Passwort zur Laufzeit abholen. Aber das führt in deinem Anwendungsszenario wohl zu weit ;)

Bei dem Vaultsystem brauchst du ja auch ein Passwort/Token :D Also so "ganz ohne" geht es da auch nicht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Hanni2k und KillerCow
cmi777 schrieb:
Puh. Du lässt ChatGPT für dich "programmieren" und andere sollen dann schauen, ob der Code stimmt? Hast du das Script denn mal ausprobiert? Deine Frage klingt jetzt ziemlich nach "eigentlich hab ich keine Lust Zeit mich selbst damit zu beschäftigen und habe eigentlich auch gar keine Ahnung vom Programmieren".
Hat jetzt zwar weniger mit dem Thema direkt zu tun, aber ich glaube das ist oder wird die Gefahr von Systemen wie ChatGPT. ChatGPT ist ein mächtiges Tool aber ohne Ahnung von dem was es ausspuckt ist es noch gefährlicher als irgendeinen Code von irgendeiner Seite kopieren und irgendwo einfügen...

ChatGPT kann einen unterstützen aber ohne das Ergebnis zu überprüfen bringt es einen null Mehrwert.
 
  • Gefällt mir
Reaktionen: ni-sc und cmi777
Heißt ja nicht das ich mir den Code nicht anschaue. Ich habe mich in den letzten Monaten, soweit es die Zeit zugelassen hat, in html eingearbeitet. nun ist php dran.
Zu faul bin ich sicher nicht. Nur geht mir oft die Zeit aus.
Klar, sind die Dinger gefährlich. Das ist wie mit Kernspaltung (unabhängig vom Müll) kann gut oder auch schlecht genutzt werden. Spannend ists momentan aber auf jeden Fall.

ich habe jetzt folgendes gemacht aber es funktioniert noch nicht wie soll heißt es kommt nix an:

PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  $anrede = $_POST['anrede'];
  $vorname = $_POST['vorname'];
  $nachname = $_POST['nachname'];
  $email = $_POST['email'];
  $nachricht = $_POST['nachricht'];

  $empfaenger = "xxxx@web.de";
  $betreff = "Kontaktformular-Nachricht von $vorname $nachname";
  $header = "From: $email\r\n";

  require_once "PHPMailer/PHPMailerAutoload.php";

  $mail = new PHPMailer();
  $mail->isSMTP();
  $mail->Host = "smtp.web.de";
  $mail->SMTPAuth = true;
  $mail->Username = "xxxxx@web.de";
  $mail->Password = "xxxxxx";
  $mail->SMTPSecure = "tls";
  $mail->Port = 587;

  $mail->setFrom($email, "$vorname $nachname");
  $mail->addAddress($empfaenger);
  $mail->Subject = $betreff;
  $mail->Body = "Anrede: $anrede\nVorname: $vorname\nNachname: $nachname\nE-Mail: $email\n\n$nachricht";

  if (!$mail->send()) {
    $message = "Beim Versenden der E-Mail ist ein Fehler aufgetreten: " . $mail->ErrorInfo;
  } else {
    $message = "Die E-Mail wurde erfolgreich versandt.";
  }
}
?>
 
Also ich hab hier mal für jemanden auf Computer Base sein Kontaktformular kurz überarbeitet, die Vorlage liegt noch bei mir auf GitHub. Kannst du ja adatieren, wenn du es brauchst.

Ich sende dort allerdings mit PHP mail() und nicht über PHPMailer.

https://github.com/srueegger/contactform-klaus-computerbase

RAMSoße schrieb:
ich habe jetzt folgendes gemacht aber es funktioniert noch nicht wie soll heißt es kommt nix an:
Wie bereits von @cmi777 erwähnt, dieses Beispiel geht davon aus, dass du PHPMailer über Composer installiert hast.

Fehler solltest du in in der PHP Error Log Datei auf deinem Server finden.
 
  • Gefällt mir
Reaktionen: mae1cum77 und RAMSoße
@kim88

das ist ja super dokumentiert. das kann ich gleich etwas lernen. Besten Dank

an alle
 
Dir schlägt SPF voll dazwischen.
Du setzt als ABSENDER-Adresse die $_POST-Email des Besuchers.
D.h. du versucht über deine web.de-Adresse Emails im Namen eines Besuchers zu versenden.
Das solltest du nicht tun, NIEMALS.

Versende die Mails im Namen von dir selbst, und füge als "Reply-To:"-Header die Adresse des Besuchers ein.

(Wenn ich zum Beispiel in deinem Kontaktformular meine Adresse eintippe, wird die Nachricht niemals bei dir landen, weil ich einen harten SPF-Eintrag habe.
Und aufgrund von DKIM und DMARC bekomme ich noch netterweise eine E-Mail deines Providers, welche IP-Adresse versucht hat, in meinem Namen eine Mail zu verschicken.)
 
  • Gefällt mir
Reaktionen: RAMSoße
unabhängig vom rest würde ich immer die $_POST Variablen testen & prüfen.

also aus jedem
PHP:
<?php
$var = $_POST['var'];
wird zumindest
PHP:
<?php
$var = !empty($_POST['var']) && is_string($_POST['var']) ? utf8_decode(htmlspecialchars(filter_var(trim($value), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK))) : '';

zum Vergleich, so ca. schaut das dann fertig aus:
PHP:
<?php
/**
 * Sanitize values
 * https://www.php.net/manual/en/filter.filters.sanitize.php
 */
function myApp_sanitize_string($value){
  return utf8_decode(htmlspecialchars(filter_var(trim($value), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK)));
}
function myApp_sanitize_date($value){
  return htmlspecialchars(filter_var(trim($value), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK));
}
function myApp_sanitize_integer($value){
  return abs(intval(filter_var(trim($value), FILTER_SANITIZE_NUMBER_INT)));
}
function myApp_sanitize_decimal($value){
  return round(floatval(filter_var(trim($value), FILTER_SANITIZE_NUMBER_FLOAT)));
}
function myApp_sanitize_email($value){
  return utf8_decode(filter_var(trim($value), FILTER_SANITIZE_EMAIL));
}
PHP:
<?php
/**
 * Validate values
 * https://www.php.net/manual/en/filter.filters.validate.php
 * https://stackoverflow.com/questions/597456/how-to-validate-a-mysql-date-in-php
 */
function myApp_validate_date($value){
  $pattern = '#^(?P<year>\d{2}|\d{4})([- /.])(?P<month>\d{1,2})\2(?P<day>\d{1,2})$#';
  return preg_match($pattern, $value, $matches) && checkdate($matches['month'], $matches['day'], $matches['year']);
}
function myApp_validate_integer($value){
  return filter_var($value, FILTER_VALIDATE_INT);
}
function myApp_validate_decimal($value){
  return filter_var($value, FILTER_VALIDATE_FLOAT);
}
function myApp_validate_email($value){
  return filter_var($value, FILTER_VALIDATE_EMAIL);
}
Anwendung:
PHP:
<?php
// string
$var = !empty($_POST('var')) ? $myApp_sanitize_string($_POST('var')) : '';
// date
$date_sanitized = $myApp_sanitize_date($_POST('var_date'));
$date = $myApp_validate_date($date_sanitized) ? $date_sanitized : null;
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: [ChAoZ] und BeBur
Zurück
Oben