Email Header Injection is een beveiligingskwetsbaarheid waarbij een aanvaller kwaadaardige e-mailheaders injecteert in een webformulier dat e-mails verstuurt, zoals een contactformulier of registratieformulier.
Hierdoor kan de aanvaller:
- SPAM versturen vanuit jouw server naar andere ontvangers.
- Phishing-aanvallen uitvoeren door vervalste e-mails te sturen.
- De inhoud van de e-mail manipuleren, zoals het wijzigen van het onderwerp of het toevoegen van CC- en BCC-ontvangers.
Hoe werkt Email Header Injection?
Wanneer een webformulier gebruikersinvoer direct opneemt in de e-mailheaders (zoals het onderwerp, de ontvanger of de afzender), kan een aanvaller speciale tekens zoals newline-karakters (\n
of \r\n
) gebruiken om nieuwe headers toe te voegen.
Voorbeeld van kwetsbare PHP-code:
<?php
$naam = $_POST['naam'];
$email = $_POST['email'];
$onderwerp = "Contactformulier";
$headers = "From: $email";
mail("info@voorbeeld.nl", $onderwerp, "Bericht van: $naam", $headers);
?>
Als een aanvaller het e-mailadres als volgt invult:
aanvaller@example.com\r\nCC: spammer@example.com
Dan wordt de header:
From: aanvaller@example.com
CC: spammer@example.com
Hierdoor krijgt spammer@example.com ook een kopie van het bericht, wat kan worden misbruikt voor spamming.
Gevolgen van Email Header Injection:
- SPAM- en phishingcampagnes: Aanvallers kunnen jouw mailserver misbruiken om spam te versturen, waardoor je domein op een blacklist kan belanden.
- Vertrouwensschade: Ontvangers kunnen denken dat kwaadaardige e-mails afkomstig zijn van jouw domein.
- Datalekken: Kopieën van berichten kunnen naar ongeautoriseerde ontvangers worden verzonden.
Hoe voorkom je Email Header Injection?
-
Inputvalidatie en -sanitatie:
- Sta alleen geldige e-mailtekens toe (letters, cijfers, @, punten en koppeltekens).
- Verwijder of blokkeer newline-karakters (
\n
,\r\n
), aangezien deze gebruikt kunnen worden voor headerinvoegingen.
-
Gebruik van ingebouwde validatiefuncties:
- In PHP:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Ongeldig e-mailadres.");
}
-
Geen directe invoer in e-mailheaders:
- Plaats gebruikersinvoer nooit direct in de
From
,CC
ofBCC
-headers. - Stel deze statisch in of gebruik vooraf gedefinieerde e-mailadressen.
- Plaats gebruikersinvoer nooit direct in de
-
Gebruik van beveiligde mailbibliotheken:
- Zoals PHPMailer of SwiftMailer. Deze ontsmetten automatisch de headers.
- Voorbeeld met PHPMailer:
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer();
$mail->setFrom('no-reply@voorbeeld.nl', 'Website');
$mail->addAddress('info@voorbeeld.nl');
$mail->Subject = 'Contactformulier';
$mail->Body = "Bericht van: $naam";
$mail->send();
Bescherm tegen newline-karakters:
- Verwijder newline-karakters uit invoervelden:
$email = str_replace(array("\r", "\n"), '', $email);
-
Rate Limiting en CAPTCHA:
- Beperk het aantal e-mails dat per IP-adres kan worden verzonden.
- Voeg CAPTCHA's toe om te voorkomen dat bots massaal formulieren indienen.
Voorbeeld van veilige implementatie:
<?php
$naam = strip_tags(trim($_POST['naam']));
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
// Controleer op een geldig e-mailadres
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Ongeldig e-mailadres.");
}
// Verwijder newline-karakters
$naam = str_replace(array("\r", "\n"), '', $naam);
$email = str_replace(array("\r", "\n"), '', $email);
$onderwerp = "Contactformulier";
$headers = "From: no-reply@voorbeeld.nl";
mail("info@voorbeeld.nl", $onderwerp, "Bericht van: $naam", $headers);
?>
-
Waarom veilig? Alle gebruikersinvoer wordt gesanitiseerd, newline-karakters worden verwijderd, en de
From
-header is statisch ingesteld.
Conclusie:
Email Header Injection is een gevaarlijke kwetsbaarheid die kan leiden tot SPAM, phishing-aanvallen en vertrouwensschade voor jouw domein. Door inputvalidatie, het vermijden van directe invoer in headers en het gebruik van veilige mailbibliotheken kun je deze vorm van aanval effectief voorkomen.