PHP contactformulier beveiliging tegen spammers

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robbert B

Robbert B

26/05/2013 15:42:30
Quote Anchor link
Heey,

Door het volgen van diverse tutorial en scripts heb ik het volgende contact formulier in elkaar gedraaid.

Als iemand het contactscript heeft gepost, dan kan hij binnen 10 seconden dit niet nog eens doen!Het contactscript blijft dan gewoon staan enkel ontvang hij dan een foutmelding.

Om zo spammers/f5 gebruikers af te schikken

Verbeterde versie
Quote:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
    
    ////////////////////////////////////////////////
    //////// robbert.uphero.com ////////////////////
    //////// Door Robbert B ////////////////////////
    ////////////////////////////////////////////////
    
    
    
    //Kijken of er op de submit button is gedrukt.

    if($_SERVER['REQUEST_METHOD'] == "POST"){
    
    
    // Definiëren variablen
    // Vaste variablen

    
    $ontvanger = '[email protected]';   //Email van de ontvanger
    $naar = 'Robbert B';                      //Naam
    $onderwerp = "Ingevuld contactformulier";             //Onderwerp van de mail
    $spam = 30;                             //Anti Spam, in seconden
    
    //Controle of de waarden zijn ingevuld!

    
    $error = '';                            // Begint met het aantal aanwezige errors
    $aantal = 0;                            // Telt het aantal errors
    
            if(isset($_COOKIE['mailform']))
            {
$show = true;        
            echo 'Vanwege veiligheids redenen kunt u maar eens in de '.$spam.' seconden een e-mail versturen!';
                  
            }

          
            else {
          
            if(strlen($_POST['naam']) < 2)
            {
$error .= "- U heeft u naam niet ingevuld! <BR />";
                    $aantal++;
            }

            if(strlen($_POST['email']) < 6 || preg_match('~^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=[A-Za-z0-9]*[^A-Za-z0-9])\S{6,}$~', $_POST['email']))
            {
$error .= "- U heeft geen geldig e-mailadres ingevuld! <BR />";
                    $aantal++;
            }

            if (strlen($_POST['tekst']) < 10 )
            {
$error .= "- U heeft geen geldige bericht ingevuld. <BR />";
                    $aantal++;
            }

                    if (!empty($error))                     // Als er fouten zijn
                    {
                  
                    echo ($aantal == 1) ? 'De volgende fout is opgetreden: <BR />' : 'De volgende fouten zijn opgetreden <BR />';  //Controllen enkelfout of meervoud.
                    echo "".$error."<BR />";
                    }

                  
                    else { // Het mailen
                                  
                    //Headers      

                    $header = "Content-type: text/html; charset=iso-8859-1\r\n";
            $header .= "MIME-Version: 1.0\r\n";  
                    $header .= "To: ".$naar." <".ontvanger.">\r\n";
                    $header .= "From: ".$_POST['naam']." <".$_POST['email'].">\r\n";
                    $header .= "Reply-To: ".$naar." <".$ontvanger.">\r\n";
      
                    //Het daadwerkelijke bericht
    
                    $bericht = "
                    Afzender:                   '"
.$_POST['naam']."'
                    E-mailadres:       '"
.$_POST['email']."'
                    Telefoonnummer:  '"
.$_POST['telefoon']."'
                    Onderwerp:                  '"
.$_POST['subject']."'
                    Bericht:                    '"
.$_POST['tekst']."'";
    
                    //De mail
                  
                    mail($ontvanger, $onderwerp, $bericht, $header);
    
                    //Bevestigingsbericht
    
                    echo "Uw bericht is verzonden, u ontvangt zo spoedig mogelijk reactie.";
                    setcookie('mailform',1,time()+($spam*1));                                     // cookie zetten tegen spammen
                    $show = true; // foutmelding wordt weergeven
          
                    }
            }
            }

          
    ?>


Ook een hidden field toegevoegd in me contact html / css script

Quote:
<input type="text" name="btest" style="display:none;" />


Graag feedback hierop + mogelijk verbetering en beveiligingen

Alvast bedankt
Gewijzigd op 27/05/2013 21:24:55 door Robbert B
 
PHP hulp

PHP hulp

27/04/2024 21:07:58
 
Obelix Idefix

Obelix Idefix

26/05/2013 16:04:35
Quote Anchor link
Bij een goed script zou je geen ob_start nodig moeten hebben.

Om te controleren of een formulier verzonden is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if(($_SERVER['REQUEST_METHOD'] == "POST")


Het is wat zinloos om nieuwe variabelen aan te maken (regel 24-28).

Eregi is verouderd. Kijk naar preg_match

Houd het overzichtelijk: plaats niet meerdere scriptregels op 1 regel (37, 40, 43)

Maak het jezelf wat makkelijker en gebruik bij echo ', zodat je HTML niet hoeft te escapen (regel 49).
Overigens is het gebruik van inline css niet echt meer van deze tijd.

Je controle op aantal fouten gaat volgens mij ook fout: als er 1 fout is, wordt die getoond. Als er 0, 2 of 3 fouten zijn, wordt de mail verstuurd.

Wat je met $show wilt, begrijp ik niet. Je kunt toch controleren of de cookie bestaat? Als die bestaat, dan mag het formulier niet verzonden worden. Zou daarom de volgorde omgooien: eerst controleren of er een cookie bestaat. Zo ja, dan niets doen, anders verwerken formulier.
 
Ozzie PHP

Ozzie PHP

26/05/2013 16:06:00
Quote Anchor link
Je moet je eerst eens afvragen wat je precies wilt.

Wat nu als ik een mail heb gestuurd, en ik realiseer me daarna dat ik iets vergeten ben? Dan vul ik opnieuw het formulier in met de ontbrekende informatie, en dan krijg ik vervolgens een bericht dat ik een spammer ben? Lekker klantvriendelijk.

Daarnaast werk je met cookies. Het is voor een spammer natuurlijk een koud kunstje om z'n cookies te verwijderen of te blokkeren zodat jouw hele idee niet werkt.

Daarnaast moet je je een heel andere vraag stellen. Waarom zou een spammer jou heel veel mailtjes gaan sturen. Wat voor voordeel heeft hij daarvan?

Wat je wel zou kunnen doen is in je formulier een hidden input field opnemen. (Spam)robots vullen bijna altijd alle velden in. Als dat hidden field is ingevuld, weet je dat je met een robot te maken hebt.

Succes.
Gewijzigd op 26/05/2013 16:08:04 door Ozzie PHP
 
Robbert B

Robbert B

26/05/2013 18:38:21
Quote Anchor link
Heb enkele van de bovenstaande aanwijzingen verbeterd, wel nog wat vragen die volgen zo ivm eten!

Quote:
Inmiddels verouderd zie onderstaande script


Bedankt!

Quote:
Het is wat zinloos om nieuwe variabelen aan te maken (regel 24-28).


Bedankt

Quote:
Eregi is verouderd. Kijk naar preg_match


Opvallend dat er dan veel oude scripts op het internet zwerven, aangepast!

Quote:
Houd het overzichtelijk: plaats niet meerdere scriptregels op 1 regel (37, 40, 43)


Gedaan!

Quote:
Maak het jezelf wat makkelijker en gebruik bij echo ', zodat je HTML niet hoeft te escapen (regel 49).


Kan je dit nader toelicht, is mij niet helemaal duidelijk wat je hier bedoelt?

Quote:
Overigens is het gebruik van inline css niet echt meer van deze tijd.


aangepast

Quote:
Je controle op aantal fouten gaat volgens mij ook fout: als er 1 fout is, wordt die getoond. Als er 0, 2 of 3 fouten zijn, wordt de mail verstuurd.


Werkt wel, als ik niks invul werkt niet krijg ik namelijk 3 foutmeldingen

Quote:
Wat je met $show wilt, begrijp ik niet. Je kunt toch controleren of de cookie bestaat? Als die bestaat, dan mag het formulier niet verzonden worden. Zou daarom de volgorde omgooien: eerst controleren of er een cookie bestaat. Zo ja, dan niets doen, anders verwerken formulier.


Zie de bovenstaande code heb ik het anders toegepast en nu werkt het wel, enkel van plan dit te verwijderen of het aantal minuten te verlagen. Bijvoorbeeld 20 seconden.





Toevoeging op 26/05/2013 19:27:13:

Ozzie PHP op 26/05/2013 16:06:00:
Je moet je eerst eens afvragen wat je precies wilt.

Wat nu als ik een mail heb gestuurd, en ik realiseer me daarna dat ik iets vergeten ben? Dan vul ik opnieuw het formulier in met de ontbrekende informatie, en dan krijg ik vervolgens een bericht dat ik een spammer ben? Lekker klantvriendelijk.

Daarnaast werk je met cookies. Het is voor een spammer natuurlijk een koud kunstje om z'n cookies te verwijderen of te blokkeren zodat jouw hele idee niet werkt.

Daarnaast moet je je een heel andere vraag stellen. Waarom zou een spammer jou heel veel mailtjes gaan sturen. Wat voor voordeel heeft hij daarvan?

Wat je wel zou kunnen doen is in je formulier een hidden input field opnemen. (Spam)robots vullen bijna altijd alle velden in. Als dat hidden field is ingevuld, weet je dat je met een robot te maken hebt.

Succes.


Goed punt heb je daar, was al van plan het aantal minuten drastisch te verlagen. Bijvoorbeeld 10 of 20 seconden. Verder ga ik opzoek naar een hidden field script of tutorial waar het mij duidelijk wordt hoe dit werkt.

Bedankt
Gewijzigd op 27/05/2013 21:24:07 door Robbert B
 
Robbert B

Robbert B

27/05/2013 21:19:54
Quote Anchor link
Inmiddels het volgende gedaan

Heb ik al aangepast zie hieronder

Quote:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
    
    ////////////////////////////////////////////////
    //////// robbert.uphero.com ////////////////////
    //////// Door Robbert B ////////////////////////
    ////////////////////////////////////////////////
    
    
    
    //Kijken of er op de submit button is gedrukt.

    if($_SERVER['REQUEST_METHOD'] == "POST"){
    
    
    // Definiëren variablen
    // Vaste variablen

    
    $ontvanger = '[email protected]';   //Email van de ontvanger
    $naar = 'Robbert B';                      //Naam
    $onderwerp = "Ingevuld contactformulier";             //Onderwerp van de mail
    $spam = 30;                             //Anti Spam, in seconden
    
    //Controle of de waarden zijn ingevuld!

    
    $error = '';                            // Begint met het aantal aanwezige errors
    $aantal = 0;                            // Telt het aantal errors
    
            if(isset($_COOKIE['mailform']))
            {
$show = true;        
            echo 'Vanwege veiligheids redenen kunt u maar eens in de '.$spam.' seconden een e-mail versturen!';
                  
            }

          
            else {
          
            if(strlen($_POST['naam']) < 2)
            {
$error .= "- U heeft u naam niet ingevuld! <BR />";
                    $aantal++;
            }

            if(strlen($_POST['email']) < 6 || preg_match('~^(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=[A-Za-z0-9]*[^A-Za-z0-9])\S{6,}$~', $_POST['email']))
            {
$error .= "- U heeft geen geldig e-mailadres ingevuld! <BR />";
                    $aantal++;
            }

            if (strlen($_POST['tekst']) < 10 )
            {
$error .= "- U heeft geen geldige bericht ingevuld. <BR />";
                    $aantal++;
            }

                    if (!empty($error))                     // Als er fouten zijn
                    {
                  
                    echo ($aantal == 1) ? 'De volgende fout is opgetreden: <BR />' : 'De volgende fouten zijn opgetreden <BR />';  //Controllen enkelfout of meervoud.
                    echo "".$error."<BR />";
                    }

                  
                    else { // Het mailen
                                  
                    //Headers      

                    $header = "Content-type: text/html; charset=iso-8859-1\r\n";
            $header .= "MIME-Version: 1.0\r\n";  
                    $header .= "To: ".$naar." <".ontvanger.">\r\n";
                    $header .= "From: ".$_POST['naam']." <".$_POST['email'].">\r\n";
                    $header .= "Reply-To: ".$naar." <".$ontvanger.">\r\n";
      
                    //Het daadwerkelijke bericht
    
                    $bericht = "
                    Afzender:                   '"
.$_POST['naam']."'
                    E-mailadres:       '"
.$_POST['email']."'
                    Telefoonnummer:  '"
.$_POST['telefoon']."'
                    Onderwerp:                  '"
.$_POST['subject']."'
                    Bericht:                    '"
.$_POST['tekst']."'";
    
                    //De mail
                  
                    mail($ontvanger, $onderwerp, $bericht, $header);
    
                    //Bevestigingsbericht
    
                    echo "Uw bericht is verzonden, u ontvangt zo spoedig mogelijk reactie.";
                    setcookie('mailform',1,time()+($spam*1));                                     // cookie zetten tegen spammen
                    $show = true; // foutmelding wordt weergeven
          
                    }
            }
            }

          
    ?>




Vond 10 minuten erg lang vandaar er 30 seconden van gemaakt

Verder heb ik mijn contactform [html/css]

Een hidden field ingemaakt tegen spammen!

<input type="text" name="btest" style="display:none;" />

Graag hier feedback op of verbeteringen van het script

Graag feedback hierop
 
Jan R

Jan R

28/05/2013 07:38:26
Quote Anchor link
wat met een captcha
ik ben nu gestart met deze: http://www.phpcaptcha.org/
 
Robbert B

Robbert B

28/05/2013 08:19:09
Quote Anchor link
Capatcha wordt vaak beschouwd als erg klant ontvriendelijk, dus ik weet niet of ik daar aan wil beginnen.



Toevoeging op 28/05/2013 08:49:43:

Inmiddels wilden ik als het contactformulier voor telefoon wordt ingevuld, dat dit elke met cijfers is.

Quote:
if(strlen($_POST['telefoon'])!preg_match('/^[0-9]{10}$/', $_POST['telefoon']))
{$error .= "- U heeft geen geldig geldig telefoonnummer ingevuld! <BR />";
$aantal++;


Krijg alleen de volgende fout

syntax error, unexpected '!' in /home/a4596531/public_html/action.php on line 43

Lijn 43 is de bovenste lijn van mijn quote.

Maar stel er wordt geen telefoon nummer ingevoegd, dan moet hij niks aangeven. Dus enkel controllere wanneer hij door iets wordt ingevoerd.
 
Albert de Wit

Albert de Wit

28/05/2013 10:31:04
Quote Anchor link
Captcha kan heel erg vervelend zijn voor een bezoeker, dat klopt. Maar je moet wel verificatie hebben dat degene menselijk is.

Er is wel een heel mooi alternatief!
Kijk hier eens naar.
http://areyouahuman.com/
 
Robbert B

Robbert B

28/05/2013 11:25:44
Quote Anchor link
Quote:
Inmiddels wilden ik als het contactformulier voor telefoon wordt ingevuld, dat dit elke met cijfers is.

Quote:
if(strlen($_POST['telefoon'])!preg_match('/^[0-9]{10}$/', $_POST['telefoon']))
{$error .= "- U heeft geen geldig geldig telefoonnummer ingevuld! <BR />";
$aantal++;


Krijg alleen de volgende fout

syntax error, unexpected '!' in /home/a4596531/public_html/action.php on line 43

Lijn 43 is de bovenste lijn van mijn quote.

Maar stel er wordt geen telefoon nummer ingevoegd, dan moet hij niks aangeven. Dus enkel controllere wanneer hij door iets wordt ingevoerd.


Iemand die mij hier mee kan helpen?
 



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.