PHP contactformulier beveiliging tegen spammers
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)
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
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
}
}
}
?>
////////////////////////////////////////////////
//////// 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
Om te controleren of een formulier verzonden is:
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.
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
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.
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
Heb ik al aangepast zie hieronder
Quote:
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
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
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
}
}
}
?>
////////////////////////////////////////////////
//////// 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
ik ben nu gestart met deze: http://www.phpcaptcha.org/
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++;
{$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.
Quote:
Inmiddels wilden ik als het contactformulier voor telefoon wordt ingevuld, dat dit elke met cijfers is.
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.
Quote:
if(strlen($_POST['telefoon'])!preg_match('/^[0-9]{10}$/', $_POST['telefoon']))
{$error .= "- U heeft geen geldig geldig telefoonnummer ingevuld! <BR />";
$aantal++;
{$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?