PDA

Volledige versie bekijken : Email injection


Rainman
%Europe/Berlin %680 %2005, 17:20
Hallo scripters,

De laatste tijd heb ik, en met mij nog vele anderen, last van "email injection" in mijn php email formulieren. Zelf ben ik geen scripter, dus ik zou graag wat hulp willen krijgen.
Ik heb veel over dit onderwerp gelezen, maar de "oplossingen" die worden gegeven blijken niet of maar voor even te werken òf ik kan ze niet implementeren in mijn huidige script (dankzij mijn gebrek aan kennis van php).

Nu dacht ik dat het volgende mijn probleem zou kunnen oplossen:
ik controleer bijvoorbeeld het tekstveld "naam" om te zien of daar een @ wordt gebruikt. Zo ja, krijg je een foutmelding. Zo nee, dan kan het formulier verzonden worden.
Dit kan natuurlijk bij elk tekstveld worden gedaan, maar ik heb geen idee hoe ik hieraan moet beginnen.

Heeft iemand van jullie tijd en zin om dit stukje code te schrijven?


Hieronder mijn huidige code (tabellen etc heb ik weggehaald uit de code:
<?php
$thankyou = "Bedankt voor uw bericht. <br /><br />
Indien nodig, krijgt u zo spoedig mogelijk bericht terug<br /><br />";
$errors = "<span class=\"red_text\">";
$colspan = "";
$send = "yes";

$start = 0;
$end = 3;

if (@!$_POST['printer']) {
$yesStatus = "checked";
$noStatus = "";
} else {
if ($_POST['contact'] == "Yes"){
$yesStatus = "checked";
$noStatus = "";
} else {
$yesStatus = "";
$noStatus = "checked";
}
}

$formBlock =
"<form method=\"post\" action=\"$_SERVER[PHP_SELF]\">
Voor vragen, een vrijblijvende offerte, suggesties, op- of aanmerkingen, kunt u het onderstaande formulier invullen. Velden met een * zijn verplicht.<br /><br /><br /></td>
Naam: * <input type=\"text\" name=\"name\" id=\"name\" class=\"textfield\" size=\"50\" value=\"$_POST[name]\" />
E-mail: * <input type=\"text\" name=\"uEmail\" id=\"uEmail\" class=\"textfield\" size=\"50\" maxlength=\"50\" value=\"$_POST[uEmail]\" />
Bedrijfsnaam: <input name=\"company\" type=\"text\" class=\"textfield\" id=\"company\" size=\"50\" maxlength=\"50\" value=\"$_POST[company]\" />
Woonplaats: <input name=\"city\" type=\"text\" class=\"textfield\" id=\"city\" size=\"50\" maxlength=\"50\" value=\"$_POST[city]\" />
Telefoonnummer: <input name=\"phone\" type=\"text\" class=\"textfield\" id=\"phone\" size=\"50\" maxlength=\"50\" value=\"$_POST[phone]\" />
Faxnummer: <input name=\"fax\" type=\"text\" class=\"textfield\" id=\"fax\" size=\"50\" maxlength=\"50\" value=\"$_POST[fax]\" />
Bericht: * <textarea name=\"msg\" id=\"msg\" cols=\"40\" rows=\"6\" value=\"$_POST[msg]\" class=\"messagefield\"></textarea>
<input name=\"B2\" type=\"reset\" class=\"text\" value=\"Invoer wissen\">
<input name=\"B1\" type=\"submit\" class=\"text\" onClick=\"submit\" value=\"Verzenden\">
<input type=\"hidden\" name=\"printer\" id=\"printer\" value=\"paper\" />

</form>";
if (@!$_POST['printer']) {
echo ("$formBlock");
} else {
if (!$_POST['name']) {
$errors .= "Vul a.u.b. uw naam in.<br />";
$send = "no";
}
if ($_POST['uEmail']) {
if (!strstr($_POST['uEmail'], "@") && !strstr($_POST['uEmail'], ".")) {
$errors .= "Vul a.u.b. een geldig email adres in.<br />";
$send = "no";
}
}
if (!$_POST['uEmail']) {
$errors .= "Vul a.u.b. een geldig email adres in.<br />";
$send = "no";
}
if (!$_POST['msg']) {
$errors .= "Vul a.u.b. uw vraag of opmerking in bij \"Bericht\".<br />";
$send = "no";
}
$errors .= "</span>";
if ($send != "no") {
$name = addslashes($name);
$uEmail = addslashes($uEmail);
$company = addslashes($company);
$city = addslashes($city);
$phone = addslashes($phone);
$fax = addslashes($fax);
$msg = addslashes($msg);

$to = "mijn@email.nl";
$subject = "Informatie aanvraag";
$message =
"Naam:
$_POST[name]

E-mail:
$_POST[uEmail]

Bedrijf:
$_POST[company]

Woonplaats:
$_POST[city]

Telefoon:
$_POST[phone]

Fax:
$_POST[fax]


$_POST[name] Heeft het volgende bericht gestuurd:
-------------------------
$_POST[msg]";


mail($to, $subject, $message, "From: \"$_POST[name]\" <$_POST[uEmail]>\r\nReply-To: \"$_POST[name]\" <$_POST[uEmail]>\r\nX-Mailer: chfeedback.php 2.04" );
echo ("$thankyou");
} else {
echo ("$errors" . "$formBlock");
}
}
?>

WernerL
%Europe/Berlin %686 %2005, 17:28
Wat bedoel je precies met email injectie?

Rainman
%Europe/Berlin %690 %2005, 17:34
Dan wordt er een stuk code toegevoegd in één van je velden, waardoor je email adres wordt doorgestuurd naar de hacker. Deze gebruikt jouw email adres dan voor alles behalve legale doeleinden.

Meer informatie is hier te vinden: Interesting Crack Attempt (http://www.anders.com/cms/75/Crack.Attempt/Spam.Relay)

Dit is de code die eens is toegevoegd aan een van de tekstvelden:

Content-Type: multipart/mixed;
boundary="===============1588588624=="
MIME-Version: 1.0
Subject: 40d7e77
To: ejrkjfkn@nowhere.com
bcc: killerhamster@punkass.com
From: ejrkjfkn@nowhere.com

This is a multi-part message in MIME format.

--===============1588588624==

Content-Type: text/plain;
charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

yyo

--===============1588588624==--
]

WernerL
%Europe/Berlin %721 %2005, 18:18
Nu je het zegt, heb ik ook last van, als iemand een antwoord weet maak je mij ook blij. :)

dioneo
%Europe/Berlin %452 %2005, 11:51
met de injection wordt een mailheader toegevoegd, in dit geval wordt een to: en bcc: toegevoegd.
een van dem anier om dit te voorkomen is bijvoorbeeld een reguliere expressie-match te doen, en als er een match is dan de mail niet te versturen. Ik ben gen held in reguliere expressies maar volgens mij kun je het hiermee doen:

preg_match_all("/([b]{0,1}cc[\s]*:[\s]*[^\s@]+[@]{1}[^\s@]+)/i",$_POST['tekstveld'],$matches);
if(count($matches[0])>0){
// niets doen, of waarschuwing geven
} else {
// wel versturen
}

LET WEL; deze checkt alleen case-insensitive op
[evt een b]cc[evt whitespace]:[evt whitespace][alles wat geen whitespace is maar ook geen @]@[alles wat geen whitespace is maar ook geen @]

Ik heb de expressie niet getest, dus garantie tot de voordeur. Het geeft iig aan hoe je het zou kunnen ondervangen

walle
%Europe/Berlin %686 %2006, 17:28
Simpelste manier om mail injection tegen te gaan en ook good practice om altijd je velden te limiteren. Hier bv, naam en email niet langer dan 255 caracters. Als je dan nog eens een str_replace doet van de "\n" naar "" in deze velden die niet meer dan 1 lijn mogen/hoeven te hebben is het al vrij waterdicht. :D

brossiekoppie
%Europe/Berlin %746 %2006, 18:55
Simpelste manier om mail injection tegen te gaan en ook good practice om altijd je velden te limiteren. Hier bv, naam en email niet langer dan 255 caracters. Als je dan nog eens een str_replace doet van de "\n" naar "" in deze velden die niet meer dan 1 lijn mogen/hoeven te hebben is het al vrij waterdicht. :D

Controleer ook of alle velden true teruggeven via ctype_print() Zo weet je zeker dat er enkel printable karakters inzitten.

TheZwier
%Europe/Berlin %905 %2006, 22:44
je moet bij mail gewoon een mail validation reg-exp gebruiken, dan kunnen er zeker geen verkeerde dingen in staan:

eregi('^[a-z0-9\._\-]+@[a-z0-9\.\-]+\.[a-z]{2,6}$', $_POST['email'])

(over die laatste {2,6} valt te debateren, maar er is een mogelijkheid dat er een www.domein.museum extensie komt)

latino
%Europe/Berlin %370 %2006, 09:53
misshien heb je hier iets aan:

http://www.securephpwiki.com/index.php/Email_Injection

De Kale
%Europe/Berlin %422 %2006, 11:08
je moet bij mail gewoon een mail validation reg-exp gebruiken, dan kunnen er zeker geen verkeerde dingen in staan:

eregi('^[a-z0-9\._\-]+@[a-z0-9\.\-]+\.[a-z]{2,6}$', $_POST['email'])

(over die laatste {2,6} valt te debateren, maar er is een mogelijkheid dat er een www.domein.museum extensie komt)

dat is niet afdoende, er kunnen via _alle_ velden die je in je email stopt (txt, naam afzender etc) headers geinjecteerd worden.
de \n escaping is al erg goed icm de validatie op alle velden (qua lengte en content)
de \r\n escape is nodig voor headers om goed geplaatst te kunnen worden, iedere regel van een email header wordt geeindigd met \r\n om geldig te zijn...