PHP Bot-Anfrage kam durch - aber wie ?

xep22

Banned
Registriert
Apr. 2018
Beiträge
395
Hallo, ich habe heute nacht bei beiden meiner Websiten wo man einen Eintrag melden kann eine Mail bekommen von einer Meldung. dabei sind alle Felder die man ausfüllen muss einfach leer in dieser Mail. im php-script wo die Mail gesendet wird, wird aber eigentlich alles geprüft, auch ob die felder nicht leer sind :

PHP:
if(empty($_SESSION['id'])){ header('Location: /'); exit;}
if(empty($_POST['email'])){ header('Location: /'); exit;}
if(empty($_POST['report_reason'])){ header('Location: /'); exit;}

darunter ist phpmailer. doch wie kann es sein dass die Mail doch durchkam ? was kann ich da tun damit das nicht nochmal passiert?
 
Meines Wissens prüft die Funktion empty() lediglich, ob eine Variable existiert und ob sie nicht leer ist. Nun gibt es aber diverse Zeichen, die nicht direkt sichtbar sind. Wurde also so ein Zeichen da eingetragen, ist die Variable nicht leer und das Skript bricht nicht ab. In der Mail siehst du aber trotzdem nichts, weil es eben nicht direkt zu sehen ist.

Im Großen und Ganzen musst du dir also einfach nur mehr Mühe geben herauszufinden, ob etwas in den Feldern steht oder nicht.

PS: Debugausgaben z.B. in ein Logfile können auch dabei helfen, das Problem einzugrenzen. Vielleicht versteckt sich das Problem auch an einer ganz anderen Stelle in deinem Skript. Das hast du ja nur minimal auszugsweise angegeben.
 
empty() prüft auf:

PHP:
"" (eine leere Zeichenkette)
0 (0 als Integer)
0.0 (0 als Fließkommazahl)
"0" (0 als Zeichenkette)
NULL
FALSE
array() (ein leeres Array)

demnach wäre ein Leerzeichen also (" ") nicht leer, empty wäre false und dein Skript wird ausgeführt.

Edit: Besser wäre folgedes

PHP:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$reportReason = filter_input(INPUT_POST, 'report_reason');
$id = filter_var($_SESSION['id']);

if (!id or !$email or !reportReason) {
    header('Location: /'); 
    exit;
}

Wobei das solch einen Abbruchkram mit Weiterleitung und Ablaufbeendigung persönlich schrecklich finde.
Ich würde da eher so etwas ähnliches machen mit PSR-4 Autoloading usw.:

PHP:
use \MyNamespace\SessionHandler;
use \MyNamespace\Environment;
use \OthersNamespace\MailGun;

require_once '../vendor/autoload.php';

try {
    $sess = new SessionHandler;
    $env = new Environment($sess);
    $mail = new MailGun;
    $data['email'] = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
    $data['reportReason'] = filter_input(INPUT_POST, 'report_reason');
    $data['id'] = $env->session->get('id');

    if ($data['id'] and $data['email'] and $data['reportReason']) {
        if (!$mail->send($data)) { 
            throw new \Exception("Error sending Email", 1);
        } 
    }
    header('Location: /');  // Weiter zur nächsten Seite?!?
} catch (\Exception $e) {
    throw new \Exception("Error MyNamespace\\MyModule\\FormMailSendMethod", 500, $e);
}
 
Zuletzt bearbeitet:
Zurück
Oben