Goed script tegen emailinjection

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rene

Rene

23/02/2006 12:27:00
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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'>";
?>


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)
PHP script in nieuw venster Selecteer het PHP script
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
<?
$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;
}


?>
 
PHP hulp

PHP hulp

16/11/2024 08:26:29
 
Jan Koehoorn

Jan Koehoorn

23/02/2006 12:31:00
Quote Anchor link
Mocht je meer willen weten over e-mail injection en wat er tegen te doen is, bekijk dan eens deze pagina
 
Rene

Rene

23/02/2006 12:33:00
Quote Anchor link
Ziet er duidelijk uit. In dat verhaal komen ze met:

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
Jan Koehoorn

Jan Koehoorn

23/02/2006 12:37:00
Quote Anchor link
Zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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";
?>
 
Lissy Pixel

Lissy Pixel

23/02/2006 12:51:00
Quote Anchor link
Handig want ik loop hier ook al een tijdje mee te stoeien en weet nie hoe op te lossen :)
BEDANKT!!!
 
- wes  -

- wes -

23/02/2006 13:08:00
Quote Anchor link
vergeet niet je fifth parameter

,'-f'.$returnadres)
 
Rene

Rene

23/02/2006 13:25:00
Quote Anchor link
Die spammers zijn niet voor 1 gat te vangen...

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?
 
Lissy Pixel

Lissy Pixel

23/02/2006 14:19:00
Quote Anchor link
wes:
vergeet niet je fifth parameter

,'-f'.$returnadres)


Hoe en waar zet ik dit erin?
 
PurpleMadness -

PurpleMadness -

23/02/2006 15:02:00
Quote Anchor link
lissy:
wes:
vergeet niet je fifth parameter

,'-f'.$returnadres)


Hoe en waar zet ik dit erin?


ik denk in mail() ;)
 
Lissy Pixel

Lissy Pixel

23/02/2006 15:06:00
Quote Anchor link
Ohh OK dus zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mail ($To, $Subject, $Mail, $Verzender, $Headers, '-f'.$returnadres);
?>


Ik heb alleen geen $returnadres maar ik heb dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$Verzender
        = "Verzonden door: " . $_POST['Naam'] . " <" . $_POST['Email'] . ">";
?>


Wat doe ik dan?
 
Rene

Rene

23/02/2006 15:28:00
Quote Anchor link
Blijven we nog wel zitten met deze:

De injectie kan echter ook d.m.v. het veld 'onderwerp' gedaan worden.
 
Lissy Pixel

Lissy Pixel

23/02/2006 15:37:00
Quote Anchor link
Lastig en wat betreft mijn vraag wat is hierop het antwoord?

Voor wat betreft het veld onderwerp een OR erin zetten.
Dus wanneer het ene of het andere wordt gedaan?
 
Willem vp

Willem vp

24/02/2006 08:26:00
Quote Anchor link
Mijn korte antwoord:
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
 
Lissy Pixel

Lissy Pixel

24/02/2006 08:40:00
Quote Anchor link
@ Willem_vp : Dit bedoelde ik ook alleen weet ik niet hoe je dit dan hier neerschrijft:

if (preg_match(' /[\r\n,;\'"]/ ', $_POST['email'])) OR
{
 
Willem vp

Willem vp

24/02/2006 08:56:00
Quote Anchor link
Ik zou gewoon de hele if-then-else kopieren, omdat iktoch een andere foutmelding zou willen geven.

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
 
Lissy Pixel

Lissy Pixel

24/02/2006 09:18:00
Quote Anchor link
Helder en dit ga ik vandaag proberen (wordt later op de dag heb verplichtingen elders...)
Dank je wel Willen_vp voor wederom deze heldere uiteenzetting en heb ik wat draaien meld ik me zeker!!
 
Lissy Pixel

Lissy Pixel

24/02/2006 14:26:00
Quote Anchor link
Hij werkt bij mij niet bij 2 verschillende providers.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
//    {

?>


zoals je kan zien heb met de else geprobeerd en zonder en bij beide werkt het niet :(
 
Jan Koehoorn

Jan Koehoorn

24/02/2006 14:36:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// zonder spaties
if (preg_match('/[\r\n,;\'"]/', $_POST['Email']) or preg_match('/[\r\n,;\'"]/', $_POST['Bericht']))
?>


probeer hem zo eens, Lissy?
 
Lissy Pixel

Lissy Pixel

24/02/2006 14:41:00
Quote Anchor link
YESSSSS!!!
Deze werkt op server 1 :)))))))))))))))))))))))))))))
 
Rene

Rene

25/02/2006 12:37:00
Quote Anchor link
Enig idee hoe je deze twee scripts weer tot 1 script bakt?

Script 1

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
// {

?>


Script 2

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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";
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.