process_email.php aktualisiert

This commit is contained in:
pw
2025-06-26 19:03:22 +02:00
parent 40b71a8c7c
commit 455803110a

View File

@ -4,6 +4,10 @@ ini_set('display_errors', 1);
ini_set('display_startup_errors', 1); ini_set('display_startup_errors', 1);
error_reporting(E_ALL); 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) { function parseEmailHeaders($emailContent) {
$headers = []; $headers = [];
$lines = explode("\n", $emailContent); $lines = explode("\n", $emailContent);
@ -75,41 +79,47 @@ function checkPhishing($headers, $emailContent) {
// 2. Ungewöhnliche Zeichen oder Encoding im Betreff oder Absender // 2. Ungewöhnliche Zeichen oder Encoding im Betreff oder Absender
$subject = isset($headers['Subject']) ? $headers['Subject'] : ''; $subject = isset($headers['Subject']) ? $headers['Subject'] : '';
if (preg_match('/=\?UTF-8\?B\?/', $subject) || preg_match('/=\?UTF-8\?Q\?/', $subject)) { // Eine tiefergehende Prüfung würde hier das Decodieren des Betreffs erfordern
// Dies ist nicht unbedingt ein Phishing-Indikator, da es legitimes Encoding sein kann. // und dann die Prüfung auf Homoglyphen oder ungewöhnliche Zeichen.
// Aber in Kombination mit anderen Warnungen kann es relevant sein.
// $warnings[] = "Hinweis: Der Betreff enthält codierte Zeichen (Quoted-Printable oder Base64).";
}
// 3. Häufige Phishing-Keywords im Betreff oder Body (sehr rudimentär) // 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']; $keywords = ['bestätigung', 'konto', 'passwort', 'sicherheit', 'aktualisieren', 'blockiert', 'dringend', 'zahlung', 'rechnung', 'gewinn', 'glückwunsch'];
foreach ($keywords as $keyword) { foreach ($keywords as $keyword) {
if (stripos($subject, $keyword) !== false) { if (stripos($subject, $keyword) !== false) {
$warnings[] = "Hinweis: Das Wort '" . htmlspecialchars($keyword) . "' wurde im Betreff gefunden. Dies ist oft in Phishing-Mails zu finden."; $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) { foreach ($keywords as $keyword) {
if (stripos($emailContent, $keyword) !== false) { 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."; $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) // 4. Links prüfen (verbessert: prüft auf offensichtliche URL-Diskrepanzen)
// Man müsste hier alle URLs extrahieren und dann prüfen, ob sie von den angezeigten Domains abweichen,
// bekannte Blacklists abfragen, etc.
if (preg_match_all('/https?:\/\/[^\s"\']+/i', $emailContent, $matches)) { if (preg_match_all('/https?:\/\/[^\s"\']+/i', $emailContent, $matches)) {
foreach ($matches[0] as $url) { 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); $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) { // Check for direct IP address in URL
// Diese Bedingung ist sehr einfach und kann viele False-Positives erzeugen. if (filter_var($urlDomain, FILTER_VALIDATE_IP)) {
// Echte Prüfungen würden hier viel komplexer sein. $warnings[] = "Warnung: Ein Link enthält eine direkte IP-Adresse ('" . htmlspecialchars($url) . "'). Dies ist oft verdächtig.";
$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 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 // 6. X-Mailer / User-Agent Prüfung
// Phisher nutzen oft generische oder ungewöhnliche Mailer
$xMailer = isset($headers['X-Mailer']) ? strtolower($headers['X-Mailer']) : ''; $xMailer = isset($headers['X-Mailer']) ? strtolower($headers['X-Mailer']) : '';
$userAgent = isset($headers['User-Agent']) ? strtolower($headers['User-Agent']) : ''; $userAgent = isset($headers['User-Agent']) ? strtolower($headers['User-Agent']) : '';
if (empty($xMailer) && empty($userAgent)) { 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."; $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 && } elseif (
strpos($userAgent, 'microsoft outlook') === false && strpos($userAgent, 'thunderbird') === false && (strpos($xMailer, 'microsoft outlook') === false && strpos($xMailer, 'thunderbird') === false &&
strpos($xMailer, 'mail.app') === false && strpos($userAgent, 'mail.app') === false && strpos($xMailer, 'mail.app') === false && strpos($xMailer, 'gmail') === false && !empty($xMailer)) ||
strpos($xMailer, 'gmail') === false && strpos($userAgent, 'gmail') === false && (strpos($userAgent, 'microsoft outlook') === false && strpos($userAgent, 'thunderbird') === false &&
!empty($xMailer)) { // Fügen Sie hier weitere gängige Clients hinzu 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."; $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; return $warnings;
} }
@ -191,4 +218,3 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header('Location: index.php'); header('Location: index.php');
exit(); exit();
} }
?>