Goed script tegen emailinjection
Zou iemand mij kunnen helpen om onderstaand script spamsafe te krijgen? Ik heb natuurlijk al wel op de site gekeken naar de spam vrij contact formulier, maar ik weet niet waar ik die tussen moet voegen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
$email = $_POST['email'];
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: ".$naam." <".$email.">";
// Dit stukje code verzend het script
mail($ontvanger,$onderwerp,$bericht,$verzender);
// Vul je de link in.
$link = "index.html";
// Dit redirect je naar een andere pagina.
echo "<meta http-equiv='refresh' content='0; url=$link'>";
?>
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
$email = $_POST['email'];
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: ".$naam." <".$email.">";
// Dit stukje code verzend het script
mail($ontvanger,$onderwerp,$bericht,$verzender);
// Vul je de link in.
$link = "index.html";
// Dit redirect je naar een andere pagina.
echo "<meta http-equiv='refresh' content='0; url=$link'>";
?>
En de juiste oplossing, maar waar hoortie? Ik zou je erg dankbaar zijn om mij te leren op welke plek ik het moet tussenvoegen!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?
$name = stripslashes($_POST["name"]);
$email = stripslashes($_POST["email"]);
if(isEmail($email)) // Merk op dat een 'goed' emailadres zowiezo nooit een [enter] of quote kan bevatten
{
$header = "From: \"" . protectMailHeaders($name) . "\" <" . $email . ">";
}
else // Fout afhandelen
{
exit("Ongeldig emailadres");
}
function protectMailHeaders($string)
{
$string = str_replace("\n", "", $string); // Verwijder \n
$string = str_replace("\r", "", $string); // Verwijder \r
$string = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $string)); // Slashes van quotes
return $string;
}
function isEmail($string)
{
$result = false;
if($string != "")
{
$expr = "/^([a-zA-Z0-9]){1,}(([a-zA-Z0-9\-_])|(([\.]){1,1}
-opmaakbreak-
([a-zA-Z0-9]){1,})){0,}([@]){1,1}([a-zA-Z0-9]){1,}
-opmaakbreak-
(([a-zA-Z0-9\-_])|(([\.]){1,1}([a-zA-Z0-9]){1,})){0,}
-opmaakbreak-
([\.]){1,1}([a-zA-Z0-9]){2,4}$/";
if(preg_match($expr, $string)) // voldoet aan expressie
{
$result = true;
}
}
return $result;
}
?>
$name = stripslashes($_POST["name"]);
$email = stripslashes($_POST["email"]);
if(isEmail($email)) // Merk op dat een 'goed' emailadres zowiezo nooit een [enter] of quote kan bevatten
{
$header = "From: \"" . protectMailHeaders($name) . "\" <" . $email . ">";
}
else // Fout afhandelen
{
exit("Ongeldig emailadres");
}
function protectMailHeaders($string)
{
$string = str_replace("\n", "", $string); // Verwijder \n
$string = str_replace("\r", "", $string); // Verwijder \r
$string = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $string)); // Slashes van quotes
return $string;
}
function isEmail($string)
{
$result = false;
if($string != "")
{
$expr = "/^([a-zA-Z0-9]){1,}(([a-zA-Z0-9\-_])|(([\.]){1,1}
-opmaakbreak-
([a-zA-Z0-9]){1,})){0,}([@]){1,1}([a-zA-Z0-9]){1,}
-opmaakbreak-
(([a-zA-Z0-9\-_])|(([\.]){1,1}([a-zA-Z0-9]){1,})){0,}
-opmaakbreak-
([\.]){1,1}([a-zA-Z0-9]){2,4}$/";
if(preg_match($expr, $string)) // voldoet aan expressie
{
$result = true;
}
}
return $result;
}
?>
This is one suggested way that you could use it in a PHP mail() script:
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['email'])) {
exit('Invalid email address');
}
else {
//code to send the mail
}
Is dat sluitend? en waar zou dat in de php-code moeten?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
$email = $_POST['email'];
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: ".$naam." <".$email.">";
// Dit stukje code verzend het script
mail($ontvanger,$onderwerp,$bericht,$verzender);
// Vul je de link in.
$link = "index.html";
// Dit redirect je naar een andere pagina.
echo "<meta http-equiv='refresh' content='0; url
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
$email = $_POST['email'];
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: ".$naam." <".$email.">";
// Dit stukje code verzend het script
mail($ontvanger,$onderwerp,$bericht,$verzender);
// Vul je de link in.
$link = "index.html";
// Dit redirect je naar een andere pagina.
echo "<meta http-equiv='refresh' content='0; url
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['email'])) {
exit('Invalid email address');
} else {
//code to send the mail
$email = $_POST['email'];
}
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: " . $naam . " <" . $email . ">";
// Dit stukje code verzend het script
mail($ontvanger, $onderwerp, $bericht, $verzender);
// Vul je de link in.
$link = "index.html";
?>
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
$naam = $_POST['naam'];
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['email'])) {
exit('Invalid email address');
} else {
//code to send the mail
$email = $_POST['email'];
}
$onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: " . $naam . " <" . $email . ">";
// Dit stukje code verzend het script
mail($ontvanger, $onderwerp, $bericht, $verzender);
// Vul je de link in.
$link = "index.html";
?>
BEDANKT!!!
,'-f'.$returnadres)
Ik heb de php-code even bekeken, en zo te zien kan het veld 'email' niet meer misbruikt worden. De injectie kan echter ook d.m.v. het veld 'onderwerp' gedaan worden. Blijkbaar wordt dat veld ook gebruikt, want kort na je testmailtjes zijn er nog een aantal spam-mailtjes verstuurd.
Iemand een idee over hoe dat te voorkomen zou zijn?
wes:
vergeet niet je fifth parameter
,'-f'.$returnadres)
,'-f'.$returnadres)
Hoe en waar zet ik dit erin?
lissy:
Hoe en waar zet ik dit erin?
wes:
vergeet niet je fifth parameter
,'-f'.$returnadres)
,'-f'.$returnadres)
Hoe en waar zet ik dit erin?
ik denk in mail() ;)
Ik heb alleen geen $returnadres maar ik heb dit:
Code (php)
1
2
3
2
3
<?php
$Verzender = "Verzonden door: " . $_POST['Naam'] . " <" . $_POST['Email'] . ">";
?>
$Verzender = "Verzonden door: " . $_POST['Naam'] . " <" . $_POST['Email'] . ">";
?>
Wat doe ik dan?
De injectie kan echter ook d.m.v. het veld 'onderwerp' gedaan worden.
Voor wat betreft het veld onderwerp een OR erin zetten.
Dus wanneer het ene of het andere wordt gedaan?
Ik zou de preg_match die je bij $_POST['email'] uitvoert ook doen bij $_POST['onderwerp'].
Mijn langere antwoord:
Alhoewel het volgens RFC-822 toegestaan is om een onderwerp te hebben dat bestaat uit meerdere regels (mits de vervolgregels beginnen met whitespace) vind ik het meestal niet nodig om daadwerkelijk meerdere regels toe te staan. En als je het toch wilt, moet je consequent zijn en het ook bij het To-veld toelaten, want volgens de officiële standaard mag elk veld newlines bevatten (mits gevolgd door whitespace).
Als je toch newlines wilt toestaan, zou je een preg_replace kunnen doen waarbij je elke \n omzet naar \n\t (let op: wees niet te actief door ook tussen een \r en een \n een \t te zetten, want dan vraag je om moeilijkheden).
Gewijzigd op 24/02/2006 08:27:00 door Willem vp
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['email'])) OR
{
Maar als je het in 1 if-then-else wilt doen, kan dat als volgt:
if (preg_match(blabla_voor_email) or preg_match(blabla_voor_onderwerp))
{
exit("foutmelding");
}
De else is eigenlijk niet eens nodig, omdat het script hardhandig wordt afgebroken (door de exit) als aan de conditie wordt voldaan. Door de sendmail-code niet in de else op te nemen, maar gewoon "los" in het script te zetten, is het gemakkelijker om te testen in meerdere if-condities, waardoor je code wellicht iets overzichtelijker blijft.
Gewijzigd op 24/02/2006 10:43:00 door Willem vp
Dank je wel Willen_vp voor wederom deze heldere uiteenzetting en heb ik wat draaien meld ik me zeker!!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//kijk of de variabelen bestaan, zo ja geef ik daar een naam aan
if(isset($_POST['Naam'])) { $Naam = $_POST['Naam']; }
if(isset($_POST['Email'])) { $Email = $_POST['Email']; }
if(isset($_POST['Adres'])) { $Adres = $_POST['Adres']; }
if(isset($_POST['Postcode'])) { $Postcode = $_POST['Postcode']; }
if(isset($_POST['Woonplaats'])) { $Woonplaats = $_POST['Woonplaats']; }
if(isset($_POST['Tel'])) { $Tel = $_POST['Tel']; }
if(isset($_POST['Bericht'])) { $Bericht = $_POST['Bericht']; }
if(isset($_POST['To'])) { $To = $_POST['To']; }
if(isset($_POST['Subject'])) { $Subject = $_POST['Subject']; }
// Toon het ip adres van de bezoeker
if(isset($_POST['IP'])) { $IP = $_SERVER['REMOTE_ADDR']; }
// een anti-emailinjection oplossing
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']) or preg_match(' /[\r\n,;\'"]/ ', $_POST['Bericht']))
{ exit('U ben niet bevoegd deze handeling te verrichten vul AUB een correct email adres in!'); }
//if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']))
// { exit('Invalid email address'); }
//else
// {
?>
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//kijk of de variabelen bestaan, zo ja geef ik daar een naam aan
if(isset($_POST['Naam'])) { $Naam = $_POST['Naam']; }
if(isset($_POST['Email'])) { $Email = $_POST['Email']; }
if(isset($_POST['Adres'])) { $Adres = $_POST['Adres']; }
if(isset($_POST['Postcode'])) { $Postcode = $_POST['Postcode']; }
if(isset($_POST['Woonplaats'])) { $Woonplaats = $_POST['Woonplaats']; }
if(isset($_POST['Tel'])) { $Tel = $_POST['Tel']; }
if(isset($_POST['Bericht'])) { $Bericht = $_POST['Bericht']; }
if(isset($_POST['To'])) { $To = $_POST['To']; }
if(isset($_POST['Subject'])) { $Subject = $_POST['Subject']; }
// Toon het ip adres van de bezoeker
if(isset($_POST['IP'])) { $IP = $_SERVER['REMOTE_ADDR']; }
// een anti-emailinjection oplossing
if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']) or preg_match(' /[\r\n,;\'"]/ ', $_POST['Bericht']))
{ exit('U ben niet bevoegd deze handeling te verrichten vul AUB een correct email adres in!'); }
//if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']))
// { exit('Invalid email address'); }
//else
// {
?>
zoals je kan zien heb met de else geprobeerd en zonder en bij beide werkt het niet :(
Code (php)
1
2
3
4
2
3
4
<?php
// zonder spaties
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
?>
// zonder spaties
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
?>
probeer hem zo eens, Lissy?
Deze werkt op server 1 :)))))))))))))))))))))))))))))
Script 1
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//kijk of de variabelen bestaan, zo ja geef ik daar een naam aan
if(isset($_POST['Naam'])) { $Naam = $_POST['Naam']; }
if(isset($_POST['Email'])) { $Email = $_POST['Email']; }
if(isset($_POST['Adres'])) { $Adres = $_POST['Adres']; }
if(isset($_POST['Postcode'])) { $Postcode = $_POST['Postcode']; }
if(isset($_POST['Woonplaats'])) { $Woonplaats = $_POST['Woonplaats']; }
if(isset($_POST['Tel'])) { $Tel = $_POST['Tel']; }
if(isset($_POST['Bericht'])) { $Bericht = $_POST['Bericht']; }
if(isset($_POST['To'])) { $To = $_POST['To']; }
if(isset($_POST['Subject'])) { $Subject = $_POST['Subject']; }
// Toon het ip adres van de bezoeker
if(isset($_POST['IP'])) { $IP = $_SERVER['REMOTE_ADDR']; }
// een anti-emailinjection oplossing
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
{ exit('U ben niet bevoegd deze handeling te verrichten vul AUB een correct email adres in!'); }
//if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']))
// { exit('Invalid email address'); }
//else
// {
?>
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//kijk of de variabelen bestaan, zo ja geef ik daar een naam aan
if(isset($_POST['Naam'])) { $Naam = $_POST['Naam']; }
if(isset($_POST['Email'])) { $Email = $_POST['Email']; }
if(isset($_POST['Adres'])) { $Adres = $_POST['Adres']; }
if(isset($_POST['Postcode'])) { $Postcode = $_POST['Postcode']; }
if(isset($_POST['Woonplaats'])) { $Woonplaats = $_POST['Woonplaats']; }
if(isset($_POST['Tel'])) { $Tel = $_POST['Tel']; }
if(isset($_POST['Bericht'])) { $Bericht = $_POST['Bericht']; }
if(isset($_POST['To'])) { $To = $_POST['To']; }
if(isset($_POST['Subject'])) { $Subject = $_POST['Subject']; }
// Toon het ip adres van de bezoeker
if(isset($_POST['IP'])) { $IP = $_SERVER['REMOTE_ADDR']; }
// een anti-emailinjection oplossing
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
{ exit('U ben niet bevoegd deze handeling te verrichten vul AUB een correct email adres in!'); }
//if (preg_match(' /[\r\n,;\'"]/ ', $_POST['Email']))
// { exit('Invalid email address'); }
//else
// {
?>
Script 2
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
} $onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: " . $naam . " <" . $email . ">";
// Dit stukje code verzend het script
mail($ontvanger, $onderwerp, $bericht, $verzender);
// Vul je de link in.
$link = "index.html";
?>
// Vul hier uw eigen e-mail adres in.
$ontvanger = "[email protected]";
// Deze code haalt de informatie uit het formulier.
} $onderwerp = $_POST['onderwerp'];
$bericht = $_POST['bericht'];
// Dit is voor het e-mail programma dat je kunt zie van wie de mail afkomstig is en dat
// je kunt re- playen op de mail.
$verzender = "From: " . $naam . " <" . $email . ">";
// Dit stukje code verzend het script
mail($ontvanger, $onderwerp, $bericht, $verzender);
// Vul je de link in.
$link = "index.html";
?>