Spam vrije contact formulieren

Door Martijn Wieringa, 18 jaar geleden, 17.730x bekeken

Uitleg over hoe spam scripts en kwaadwilligen misbruik kunnen maken van contact formulieren.

Gesponsorde koppelingen

Inhoudsopgave

  1. Waarom deze tutorial?
  2. Input controle (hoe moet het niet)
  3. Waar gaat het mis?
  4. Input controle (hoe moet het wel)
  5. Hoe kun je dit voorkomen?

 

Er zijn 28 reacties op 'Spam vrije contact formulieren'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
DDragonz
DDragonz
18 jaar geleden
 
0 +1 -0 -1
Sow... kan ik wel gebruiken :) Ik ben nu bezig met een validatie script. En nadat ik dat af had wow ik een contact script maken :) >> alleen hoe werkt dit dan?:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$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
        {
?>

Ik weet wel iets van dat wat je gebruikt in ereg (dit is geloof ik het zelfde), maar uj snap alleen dat -opmaakbreak- niet... Ik ga het eens ontleden en kjken of ik het dan snap
EdwinG
EdwinG
18 jaar geleden
 
0 +1 -0 -1
Een opmerking over $expr
$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}$/";

// De volgende dingen kunnen anders (niet verplicht, misschien wel duidelijker):
{0,} -> *
{1,} -> +
{1,1} -> (leeg laten)
[@] -> @

Verder: Door achter de $/ een i te zetten
$/i
Kun je alle a-zA-Z vervangen door a-z

Bepalen van de toegelaten TLD's gaat wel fout:
([\.]){1,1}([a-zA-Z0-9]){2,4}
1: Geen enkele tld (zoals .nl, .com etc) heeft cijfers
2: Het langste tld (.museum) heeft 6 tekens
Het laatste deel moet dus zijn:
(\.)([a-zA-Z]){2,6}

Mooi script voor de rest :)


18 jaar geleden
 
0 +1 -0 -1
Controlleren op spaties in e-mail adres
CC: vervangen in C C : , zelfde geld voor BCC.
Veder kunnen die str_replaces beter d.m.v. een array.

Mijn formulieren waren vorige week ook misbruikt, 750 pogingen in 7 dagen.
CB2thephp
CB2thephp
18 jaar geleden
 
0 +1 -0 -1
Oke jammer voor de gene die het echt had geschreven. Alleen dit is een duidelijker opbouw voor een tutorial. Perfect. Oh ja mooie aanvulling voor niet alleen mailforms, maar alles. Vertrouw nooit maar ook nooit input. Zelfs niet bij een adminaccount. Beschouw alles uit de database ook als input.

groeten,
Christian Bolster
 
0 +1 -0 -1
Is die van mij zo goed beveiligd?
Mailer - AndriesLouw.tk
Legolas
Legolas
18 jaar geleden
 
0 +1 -0 -1
je kan het aan adres opgeven?
Eveliena
Eveliena
18 jaar geleden
 
0 +1 -0 -1
*Webmakerij schreef op 12.02.2006 22:44
Controlleren op spaties in e-mail adres
CC: vervangen in C C : , zelfde geld voor BCC.
Veder kunnen die str_replaces beter d.m.v. een array.

Mijn formulieren waren vorige week ook misbruikt, 750 pogingen in 7 dagen. *

Ik vraag me nu af..
Hoe kan ik controleren of er misbruik van mijn formulieren word gemaakt?

Alvast bedankt :)
Martijn Wieringa
Martijn Wieringa
18 jaar geleden
 
0 +1 -0 -1
Ik kwam nog langs deze website.. misschien leuk als extra achtergrond info.. maar ut princiepe blijft allemaal utzelfde

http://securephp.damonkohler.com/index.php?title=Email_Injection&redirect=no


@Eveliena:
Op moment dat je vage mailtjes binnen krijgt met afzendernamen/subjects/ed
die de woorden 'to', 'cc', 'bcc' of 'content-type' bevatten, kun je er zeker van zijn dat ze pogingen doen ;)
Danny K
Danny K
18 jaar geleden
 
0 +1 -0 -1
Er is ook nog captcha
Dit is dat met die letters en cijfertjes die je dan ter controle moet invullen.

Ik heb het nu een paar keer gebruikt en dat beviel me super!
Vincent
vincent
18 jaar geleden
 
0 +1 -0 -1
Ik snap dat er veel over techniek gesproken wordt door de echte kenners maar zou het niet handig zijn om ook in een dergelijke opgave een punt mee te nemen ( Wat kun je ermee!) Ik denk dat voor een beginner NewBie het best een handige leerschool kan zijn hoe je scripts kunt gebruiken en waarvoor je ze kan gebruiken.

Geeft wel een meerwaarde aan de site denk ik los van het feit dat je vragen kunt stellen aan een ieder. :)

Inhoudsopgave:

Waarom deze tutorial?
WAT KUN JE MET DEZE TUTORAIL?
Waar gaat het mis?
Hoe kun je dit voorkomen?
Input controle (hoe moet het niet)
Input controle (hoe moet het wel)
Gert Mallegrom
Gert Mallegrom
17 jaar geleden
 
0 +1 -0 -1
Ik heb een vraag. Uit mijn formulier komen de velden email en naam. Ik gebruik het script:

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
46
47
<?php
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-z0-9])+(([a-z0-9\-_])|(([\.]){}  
-opmaakbreak-
([a-z0-9])+))*(@){}([a-z0-9])+
-opmaakbreak-
(([a-z0-9\-_])|(([\.]){}([a-z0-9])+))*
-opmaakbreak-
(\.)([a-z]){2,6}$/i"
;


        if(preg_match($expr, $string)) // voldoet aan expressie
        {
            $result = true;
            
        }
    }


    return $result;
}


$name_from = stripslashes($_POST["naam"]);
$from = stripslashes($_POST["email"]);

if(isEmail($from)) // Merk op dat een 'goed' emailadres zowiezo nooit een [enter] of quote kan bevatten
{
    $header = "From: \"" . protectMailHeaders($name_from) . "\" <" . $from . ">";
}

else // Fout afhandelen
{
    exit("Ongeldig emailadres");
}

?>

Maar het werkt niet.
Ik krijg telkens de melding ongeldig emailadres.
Wat doe ik fout?
Arian Stolwijk
Arian Stolwijk
17 jaar geleden
 
0 +1 -0 -1
Ik krijg ook telens de foutmelding "Ongeldig emailadres" terwijl ik heb gewoon hier vandaan http://www.phphulp.nl/php/tutorials/10/340/698/ heb gekopieerd.
Martijn Wieringa
Martijn Wieringa
17 jaar geleden
 
0 +1 -0 -1
Ik heb nog een handig trucje dat ik regelmatig toepas om te voorkomen dat niet een 'gekloond' formulier geautomatiseerd berichten kan posten naar je site.

Bij het laden van een formulier neem ik een verborgen veld 'geheime code' op, en deze vul ik met een random code. Tevens sla ik deze code op in een sessie-variabele.

Wanneer het formulier wordt 'gepost' wordt deze code gevalideerd, en zo ja wordt het formulier verwerkt. Tevens wordt de code in de sessie-variabele weer gewist.

Elke keer als een bezoeker het formulier wil posten krijgt deze een nieuw random code. Op deze manier kan dezelfe code geen tweede keer gebruikt worden op het formulier op nieuw te posten.

Hiermee bereik je dat je legetieme bezoekers geen overlast hebben van het moeten invullen van 'rare codes' enzo (voor hun is het veld met de geheime code verborgen), en dat spammers je formulier niet kunnen misbruiken in een 'BULK' proces omdat het ze het steeds handmatig moeten invullen (anders weten ze de 'geheime code' immers niet).
Eelko
Eelko
17 jaar geleden
 
0 +1 -0 -1
@Pholeron; ik denk dat jouw code nog het meest fool proof is
je kan ook een combi doen een randNum() in een veld en 1 in een randNum() in de sessionID

of mis ik iets?
Majid Ahddin
Majid Ahddin
17 jaar geleden
 
0 +1 -0 -1
Quote:
Ik kwam er echter al snel achter dat door een textfield op te nemen in het formulier met de naam 'HTTP_REFERER', je deze waarde volledig naar eigen inzicht manupuleren. Daarnast blijkt dat niet elke browser deze 'HTTP_REFERER' ondersteunt. Dit zou je website onnodig minder compatible maken voor verschillende browsers.

HUH als je serieus HTTP_REFERER uit de _POST array haalt ben je wel echt een stomme oele!!! Wat je ook in je POST data krijgt, verandert _niets_ aan je HTTP_REFERER.
Een referer is echter supersupereasy te faken, omdat het gewoon een http header is (voila: HTTP_*) in het request. Dus met beetje socket kennis kan je elk form posten met elke referer dan ook ( en met elke post data dan ook, maar daar kan je natuurlijk op controleren: if ( isset(1,2,3) && 3 == count(_POST) ) )

GET /form.php HTTP/1.1
Host: bla.com
Referer: http://bla.com/form.php?invulle

ofzo


-- edit

je bent trouwens ook een OELE als je user input in je email headers zet :S:S Daar moet gewoon iets statisch in staan en je moet het zeker niet af laten hangen van de gebruiker!
Martijn Wieringa
Martijn Wieringa
17 jaar geleden
 
0 +1 -0 -1
@RUDIE

de $_SERVER["HTTP_REFERER"] wordt (op oudere versies van PHP/met bepaalde settings) door de server automatisch overschreven wanneer je dit veld in je formulier laat posten..

Daarnaast kun je, zoals je zelf eigenlijk al aangeeft, deze zelf instellen in sommige browsers.

Quote:
je bent trouwens ook een OELE als je user input in je email headers zet :S:S Daar moet gewoon iets statisch in staan en je moet het zeker niet af laten hangen van de gebruiker!


Als je de input netjes controleerd/afvangt is er totaal geen bezwaar om input op te nemen in de header. Kan soms erg makkelijk zijn om het opgegeven emaildres als 'afzender van de mail' op te geven, zodat de ontvanger de reply knop kan gebruiken op direct de bezoeker terug te mailen o.i.d.
Ronald
ronald
17 jaar geleden
 
0 +1 -0 -1
Ik krijg constant de melding dat het email adres fout is.

In mijn contact formulier gebruik ik een form met als naam email:
<input type="text" name="email">

Mijn php pagina om de mail te verzenden ziet er zo uit:

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
46
47
48
49
50
51
<?php

$naam
= stripslashes($_POST["naam"]);
$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 e-mailadres");
}

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;
}



mail("info@domein.nl", "$onderwerp", "$Date \n nog meer bladiebla ", $header);



?>
Jan geen
Jan geen
17 jaar geleden
 
0 +1 -0 -1
mooie tut, zag laatst ook al een vaag bericht in mn inbox uit een contact formulier. zal dat is even gaan aanpassen. tx!
- Jim  -
- Jim -
17 jaar geleden
 
0 +1 -0 -1
Even over het controleren/valideren van een E-mail adres:

Ik gebruik meestal checkdnsrr() of getmxrr() voor het valideren van een mailadres. Als er een ongeldig email-adres wordt opgegeven, wordt er direct gekeken of er een MX-record bestaat. Het kan zijn de er een domeinnaam wordt opgegeven voor een email adres, maar misschien heeft het betreffende domein geen email mogelijkheden.

Voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

function check_mail($email)
 {

 list($account, $domain) = split('@',$email);
 $result = checkdnsrr($domain, "MX");
 return $result;
 }


?>


Je kunt wellicht om het nog verder te verbeteren een reguliere expressie gebruiken om de account te controleren op ongeldige tekens.

Succes.
Richard
Richard
16 jaar geleden
 
0 +1 -0 -1
Het forumulier werkte perfekt maar nu heb ik mijn website wat aangepast en nu werkt het niet meer ik denk dat t komt omdat ik de colgende code gebruik om me pagina's te laden maar ik weet niet hoe ik het kan verhelpen.
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
          <?php
error_reporting (E_ALL ^ E_NOTICE);

if($_GET['go'] == "" or $_GET['go'] == "home"){
   include("home.php");
}

elseif($_GET['go'] == "about"){
   include("about.php");
}

elseif($_GET['go'] == "portofolio"){
   include("portofolio.php");
}

elseif($_GET['go'] == "contact"){
   include("contact.php");
}

?>

mischien weet iemand hier een oplossing voor want nu als je op versturen klikt gaat hij automatichs terug naar de homepage
Bas Kreleger
Bas Kreleger
16 jaar geleden
 
0 +1 -0 -1
Als je een formulier post, dan wordt het $_POST in plaats van $_GET. Jij kijkt in je if statement alleen maar naar $_GET. Verdere vragen graag op het forum :).
Cmug
cmug
16 jaar geleden
 
0 +1 -0 -1
Ik heb er als amateur een paar uur op moeten puzzelen(pff, en geen antwoord hier boven) maar nu werkt het. Er waren meer lezer die het niet aan de praat kregen lees ik hier boven Zij kregen net als mij de foutmelding: 'ongeldig emailadres' terug. De oplossing is te simpel n.l.: haal uit de $expr de tekst -opmaakbreak- en de spaties weg en dan zal het werken.
Cmug
cmug
16 jaar geleden
 
0 +1 -0 -1
Ik heb er als amateur een paar uur op moeten puzzelen(pff, en geen antwoord hier boven) maar nu werkt het. Er waren meer lezer die het niet aan de praat kregen lees ik hier boven Zij kregen net als mij de foutmelding: 'ongeldig emailadres' terug. De oplossing is te simpel n.l.: haal uit de $expr de tekst -opmaakbreak- en de spaties weg en dan zal het werken.
Niek Kasius
Niek Kasius
15 jaar geleden
 
0 +1 -0 -1
is het mischien ook mogelijk het zo te maken dat men niet meer dan 1 email adres kunt invoeren.
ik heb in mijn gastenboek geen email meer verwerkt zodat ze dat al niet meer kunnen misbruiken. maar heb nu wel steeds een of andere idioot die mijn boek vol pleurt met allerlei troep, heb er al een woordenfilter in gezet zodat die in het bericht ook geen E_mail adressen of URLs in kan plaatsen, maar hij blijft bezig. en ik denk dat het een robot is want als die ziet wat het resultaat van die berichten is, denk ik dat het wel op houd.
heb vandaag weer 26 berichten verwijderd, en een paar dagen geleden (doordat ik een paar dagen niet gekeken had) 267 berichten.
ik zal maar eens iets gaan zoeken waardoor men een bericht niet meer rechtstreeks kan plaatsen, maar eerst moet worden toe gestaan.
maarja waar vind je een veilig contact formulier.
Joep de Jong
Joep de Jong
10 jaar geleden
 
0 +1 -0 -1
Kan je ook instellen dat je met checkboxes dingen aan kan vinken en dat die dan worden verzonden?
 - Diov  -
- Diov -
10 jaar geleden
 
0 +1 -0 -1
@ Joep, dit script is 8 jaar oud...
Joep de Jong
Joep de Jong
10 jaar geleden
 
0 +1 -0 -1
:P
maar dan kan het toch alsnog?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Wouter J
Wouter J
10 jaar geleden
 
0 +1 -0 -1
Het zou vast wel kunnen, enige nadeel is dat dit script 8 jaar oud is en in de programmeerwereld alles voortdurend veranderd. Daardoor is dit script niet meer te gebruiken.
Ook zijn er nieuwe hackmethoden bijgekomen waarvan dit script waarschijnlijk nog niet op de hoogte was. Daardoor is dit ook niet meer spam vrij.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Waarom deze tutorial?
  2. Input controle (hoe moet het niet)
  3. Waar gaat het mis?
  4. Input controle (hoe moet het wel)
  5. Hoe kun je dit voorkomen?

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

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.