diff --git a/process_email.php b/process_email.php index f1271bd..7b3bec6 100644 --- a/process_email.php +++ b/process_email.php @@ -4,6 +4,10 @@ ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); +// Erhöhen Sie das Speicherlimit und die Ausführungszeit für potenziell große E-Mails +ini_set('memory_limit', '256M'); +set_time_limit(120); + function parseEmailHeaders($emailContent) { $headers = []; $lines = explode("\n", $emailContent); @@ -75,41 +79,47 @@ function checkPhishing($headers, $emailContent) { // 2. Ungewöhnliche Zeichen oder Encoding im Betreff oder Absender $subject = isset($headers['Subject']) ? $headers['Subject'] : ''; - if (preg_match('/=\?UTF-8\?B\?/', $subject) || preg_match('/=\?UTF-8\?Q\?/', $subject)) { - // Dies ist nicht unbedingt ein Phishing-Indikator, da es legitimes Encoding sein kann. - // Aber in Kombination mit anderen Warnungen kann es relevant sein. - // $warnings[] = "Hinweis: Der Betreff enthält codierte Zeichen (Quoted-Printable oder Base64)."; - } + // Eine tiefergehende Prüfung würde hier das Decodieren des Betreffs erfordern + // und dann die Prüfung auf Homoglyphen oder ungewöhnliche Zeichen. // 3. Häufige Phishing-Keywords im Betreff oder Body (sehr rudimentär) $keywords = ['bestätigung', 'konto', 'passwort', 'sicherheit', 'aktualisieren', 'blockiert', 'dringend', 'zahlung', 'rechnung', 'gewinn', 'glückwunsch']; foreach ($keywords as $keyword) { if (stripos($subject, $keyword) !== false) { $warnings[] = "Hinweis: Das Wort '" . htmlspecialchars($keyword) . "' wurde im Betreff gefunden. Dies ist oft in Phishing-Mails zu finden."; - break; // Nur eine Warnung pro Betreff, wenn mehrere Keywords gefunden werden + break; } } foreach ($keywords as $keyword) { if (stripos($emailContent, $keyword) !== false) { $warnings[] = "Hinweis: Das Wort '" . htmlspecialchars($keyword) . "' wurde im E-Mail-Text gefunden. Dies ist oft in Phishing-Mails zu finden."; - break; // Nur eine Warnung pro Body, wenn mehrere Keywords gefunden werden + break; } } - // 4. Links prüfen (sehr komplex, hier nur ein Platzhalter für spätere Erweiterung) - // Man müsste hier alle URLs extrahieren und dann prüfen, ob sie von den angezeigten Domains abweichen, - // bekannte Blacklists abfragen, etc. + // 4. Links prüfen (verbessert: prüft auf offensichtliche URL-Diskrepanzen) if (preg_match_all('/https?:\/\/[^\s"\']+/i', $emailContent, $matches)) { foreach ($matches[0] as $url) { - // Beispiel einer sehr einfachen Prüfung: Wenn die URL-Domain nicht mit der From-Domain übereinstimmt $urlParts = parse_url($url); - $urlDomain = isset($urlParts['host']) ? $urlParts['host'] : ''; + $urlDomain = isset($urlParts['host']) ? strtolower($urlParts['host']) : ''; - if ($urlDomain && $fromDomain && strpos($urlDomain, $fromDomain) === false && strpos($fromDomain, $urlDomain) === false) { - // Diese Bedingung ist sehr einfach und kann viele False-Positives erzeugen. - // Echte Prüfungen würden hier viel komplexer sein. - $warnings[] = "Warnung: Ein Link mit der Domain '" . htmlspecialchars($urlDomain) . "' wurde gefunden, die sich von der Absenderdomain ('" . htmlspecialchars($fromDomain) . "') unterscheidet. Seien Sie vorsichtig bei solchen Links."; + // Check for direct IP address in URL + if (filter_var($urlDomain, FILTER_VALIDATE_IP)) { + $warnings[] = "Warnung: Ein Link enthält eine direkte IP-Adresse ('" . htmlspecialchars($url) . "'). Dies ist oft verdächtig."; + } + + // Check if the URL domain is significantly different from the From/Return-Path domain + if ($urlDomain && $fromDomain && !empty($fromDomain) && strpos($urlDomain, $fromDomain) === false && strpos($fromDomain, $urlDomain) === false) { + $warnings[] = "Warnung: Die Domain im Link ('" . htmlspecialchars($urlDomain) . "') weicht von der Absenderdomain ('" . htmlspecialchars($fromDomain) . "') ab. Vorsicht!"; + } + // Add check for URL shorteners (simple regex) + $shortenerDomains = ['bit.ly', 'goo.gl', 'tinyurl.com', 'ow.ly', 't.co']; // Add more as needed + foreach ($shortenerDomains as $shortener) { + if (strpos($urlDomain, $shortener) !== false) { + $warnings[] = "Hinweis: Ein Link verwendet einen URL-Shortener ('" . htmlspecialchars($url) . "'). Dies kann zur Verschleierung bösartiger Ziele genutzt werden."; + break; + } } } } @@ -124,21 +134,38 @@ function checkPhishing($headers, $emailContent) { } // 6. X-Mailer / User-Agent Prüfung - // Phisher nutzen oft generische oder ungewöhnliche Mailer $xMailer = isset($headers['X-Mailer']) ? strtolower($headers['X-Mailer']) : ''; $userAgent = isset($headers['User-Agent']) ? strtolower($headers['User-Agent']) : ''; if (empty($xMailer) && empty($userAgent)) { $warnings[] = "Hinweis: 'X-Mailer' oder 'User-Agent' Header fehlen. Dies ist manchmal bei automatisierten oder ungewöhnlichen Mail-Systemen der Fall."; - } elseif (strpos($xMailer, 'microsoft outlook') === false && strpos($xMailer, 'thunderbird') === false && - strpos($userAgent, 'microsoft outlook') === false && strpos($userAgent, 'thunderbird') === false && - strpos($xMailer, 'mail.app') === false && strpos($userAgent, 'mail.app') === false && - strpos($xMailer, 'gmail') === false && strpos($userAgent, 'gmail') === false && - !empty($xMailer)) { // Fügen Sie hier weitere gängige Clients hinzu + } elseif ( + (strpos($xMailer, 'microsoft outlook') === false && strpos($xMailer, 'thunderbird') === false && + strpos($xMailer, 'mail.app') === false && strpos($xMailer, 'gmail') === false && !empty($xMailer)) || + (strpos($userAgent, 'microsoft outlook') === false && strpos($userAgent, 'thunderbird') === false && + strpos($userAgent, 'mail.app') === false && strpos($userAgent, 'gmail') === false && !empty($userAgent)) + ) { $warnings[] = "Hinweis: Ungewöhnlicher oder unbekannter E-Mail-Client ('" . htmlspecialchars($xMailer . $userAgent) . "') im 'X-Mailer'/'User-Agent' Header erkannt. Kann ein Indikator für Massenversand oder Phishing sein."; } + // 7. Prüfung von Authentication-Results Header (SPF, DKIM, DMARC) - NEU! + $authResults = isset($headers['Authentication-Results']) ? $headers['Authentication-Results'] : ''; + if (!empty($authResults)) { + if (stripos($authResults, 'spf=fail') !== false || stripos($authResults, 'spf=softfail') !== false) { + $warnings[] = "Kritische Warnung: SPF-Authentifizierung fehlgeschlagen oder Softfail. Die Absenderdomain ist möglicherweise gefälscht."; + } + if (stripos($authResults, 'dkim=fail') !== false) { + $warnings[] = "Kritische Warnung: DKIM-Authentifizierung fehlgeschlagen. Die E-Mail wurde möglicherweise manipuliert oder ist gefälscht."; + } + if (stripos($authResults, 'dmarc=fail') !== false || stripos($authResults, 'dmarc=quarantine') !== false || stripos($authResults, 'dmarc=reject') !== false) { + $warnings[] = "Kritische Warnung: DMARC-Authentifizierung fehlgeschlagen oder Aktion ausgelöst (Quarantine/Reject). Dies ist ein starkes Anzeichen für Phishing."; + } + } else { + $warnings[] = "Hinweis: 'Authentication-Results' Header fehlen. Dies kann auf eine fehlende oder nicht standardmäßige E-Mail-Authentifizierung hindeuten."; + } + + return $warnings; } @@ -190,5 +217,4 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } else { header('Location: index.php'); exit(); -} -?> \ No newline at end of file +} \ No newline at end of file