Php mail form captcha

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart van Tol

Bart van Tol

27/01/2012 15:23:11
Quote Anchor link
Hallo,
Ik ben bezig captcha toe te voegen aan een al bestaand mailformulier. Wordt aangepast omdat we last hebben van spam.

Het is me gelukt de captcha toe te voegen in het formulier, dit is als volgt gedaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<tr valign="top">
      <td >
        <div align="right"><font class='maincontent'><label for='AntiSpam'><img src='/main_includes/captcha.php' /></label></font></div>
      </td>

      <td colspan="2" >
        <div align="left"><font class='maincontent'>
          <input class='input' type='text' id='AntiSpam' name='AntiSpam' style='width: 200'">
          </font></div>
        <div align="left"></div>
      </td>
    </tr>


De captcha.php ziet er al volgt 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
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
87
88
<?php
// SCRIPT GESCHREVEN DOOR STEVEN GROOTHUISMINK
// VOOR INFORMATIE NEEM CONTACT OP VIA TRAPPERDESIGN.COM
// BIJ GEBRUIK VAN DIT SCRIPT WORDT EEN LINK NAAR WWW.TRAPPERDESIGN.COM GEWAARDEERD
// ENJOY! STEVEN GROOTHUISMINK, -- WWW.TRAPPERDESIGN.COM -- 2009




// Start de Session die nodig is om de Captcha code te gebruiken.

session_start();

// Lijst met alle letters en cijfers die gebruikt worden om de Captcha aan te maken.
// Ik heb ervoor gekozen om een aantal letters en cijfers weg te laten aangezien deze veel op elkaar lijken (1, i).

$Characters = '2345678abcdefhjklmnpqrstuvwxyz';

// Aantal tekens dat gebruikt wordt om de Captcha aan te maken.
// Ik heb het aantal ingesteld op 5

$chars = 5;

// Stel hieronder de afmetingen voor de Captcha afbeelding in.
// Ik heb gekozen voor 150 pixels breed bij 50 pixels hoog.

$Width = 150;
$Height = 50;

// Maak de Captcha code aan. De code hieronder kiest willekeurig het aantal tekens uit dat is vastgelegd.
// In het geval van dit voorbeeld worden er 5 willekeurige tekens gekozen uit de lijst $Characters

$i = 0;
while ($i < $chars)
{

$randomnr .= substr($Characters, mt_rand(0, strlen($Characters)-1), 1);
$i++;
}


// Schrijf de aangemaakte Captcha code weg in een Session.
// Ik versleutel de code met een md5 hash zodat de code niet zomaar uit de Session te lezen is.

$_SESSION['randomnr2'] = md5($randomnr);

// Start met het aanmaken van de afbeelding.
$im = imagecreatetruecolor($Width, $Height);

// Bepaal de kleuren die je wilt gebruiken. Deze Captcha maakt gebruik van 3 kleuren.
// Kleur 1: $front is de Captcha Code waar het uitenidelijk om draait.
// Kleur 2: $shadow is de schaduw die ik achter de Captcha Code schrijf.
// Kleur 3: $background is de achtergrond kleur van de gehele Captcha afbeelding.

$front = imagecolorallocate($im, 0, 0, 0);
$shadow = imagecolorallocate($im, 128, 128, 255);
$background = imagecolorallocate($im, 255, 255, 255);

// Vul de aangemaakt afbeelding met de hierboven ingestelde achtergrond kleur.
imagefilledrectangle($im, 0, 0, $Width, $Height, $background);

// Stel het True Type Font in dat je wilt gaan gebruiken.
// Zorg ervoor dat je de juiste locatie van je .ttf bestand invult.
// Voor deze Captcha maak ik gebruik van Artbrush.ttf

$font = 'ArtBrush.ttf';

// Stel de max. en min. hoek in waarmee je de Captcha weg wilt schrijven. Gebruik hiervoor een getal tussen de 0 en 15.
// Deze hoeken worden hierna willekeurig bepaalt aan de hand van de ingestelde max. en min. waarden.
// $angle1 is de hoek waarin de Schaduw van de Captcha code wordt weergegeven.
// $angle2 is de hoek waarin de Captcha code zelf wordt weergegeven.

$angle1 = rand(-12, 12);
$angle2 = rand(-12, 12);

// Schrijf de Schaduw van de Captcha op de afbeelding.
// Het eerste getal (hier 25) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 20) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 28) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.

imagettftext($im, 25, $angle1, 20, 28, $shadow, $font, $randomnr);

// Schrijf de Captcha Code op de afbeelding.
// Het eerste getal (hier 20) is de grootte van de tekens die weggeschreven worden.
// Het tweede getal (hier 30) is de afstand in pixels dat de tekens van de rechterkant af weggeschreven worden.
// Het derde getal (hier 32) is de afstand in pixels dat de tekens van de bovenkant af weggeschreven worden.

imagettftext($im, 20, $angle2, 30, 32, $front, $font, $randomnr);

// Voorkom dat de afbeelding ge-cached wordt door headers te versturen.
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

// Verzend de aangemaakte afbeelding naar de browser.
header ("Content-type: image/gif");
imagegif($im);
imagedestroy($im);
?>


in de mailscript waarin alles wordt gecontroleerd, is de captcha nog niet toegevoegd, ik krijg het niet werkend. Het mailscript:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
<?

//---------------------------------------------//
// other_script.php - (c) 2004
// version 1.0
//
//---------------------------------------------//



session_start();
header("Cache-control: private");

$lang=$_GET['lang'];
$_SESSION['lang']=$lang;

if ($lang==""):$lang = "nl";
$_SESSION['lang']=$lang;
elseif ($lang=="nl"): $lang = "nl";
$_SESSION['lang']=$lang;
elseif ($lang=="eng"): $lang = "eng";
$_SESSION['lang']=$lang;
endif;


//read list of words in choosen language
if ($_SESSION[lang] == "nl") {
include ("../includes/variables_dutch01.inc.php");
}
else {
include ("../includes/variables_english01.inc.php");
}


$tnx=$_GET['tnx'];
$_SESSION['tnx']=$tnx;

$reciever=$_POST['reciever'];
$_SESSION['reciever']=$reciever;

$organisation=$_POST['organisation'];
$_SESSION['organisation']=$organisation;

$sex=$_POST['sex'];
$_SESSION['sex']=$sex;

$firstname=$_POST['firstname'];
$_SESSION['firstname']=$firstname;

$famname=$_POST['famname'];
$_SESSION['famname']=$famname;

$email=$_POST['email'];
$_SESSION['email']=$email;

$street=$_POST['street'];
$_SESSION['street']=$street;

$code=$_POST['code'];
$_SESSION['code']=$code;

$city=$_POST['city'];
$_SESSION['city']=$city;

$telephone=$_POST['telephone'];
$_SESSION['telephone']=$telephone;

$subject=$_POST['subject'];
$_SESSION['subject']=$subject;

$remark=$_POST['remark'];
$_SESSION['remark']=$remark;$subject=$_POST['subject'];
$_SESSION['subject']=$subject;


//---------------------------------------------//
// set variables for this script
//---------------------------------------------//

//$_SESSION['reciever'] = "";

$_SESSION['reciever'] = "[email protected]";
//$_SESSION['reciever'] = "";
$_SESSION['composition'] = "";
$_SESSION['missing'] = "! ";
$_SESSION['oops'] = "";
$_SESSION['no_data'] = $no_data;
$pointer = "";
$ok1 = "";
$ok2 = "";

//---------------------------------------------//
// check posted form
//---------------------------------------------//


if ($_SESSION['organisation'] == ""): $_SESSION['organisation'] = $_SESSION['no_data'];
$_SESSION['missing'] .= $no_org;
    elseif ($_SESSION['organisation'] == $_SESSION['no_data']): $_SESSION['organisation'] = $_SESSION['no_data'];
    $_SESSION['missing'] .= $no_org;
endif;


$_SESSION['composition'] = "<p>organisatie: ";
$_SESSION['composition'] .= $_SESSION['organisation'];
$_SESSION['composition'] .= "</p>";

if ($_SESSION['sex'] == ""): $_SESSION['sex'] = $_SESSION['no_data'];
$_SESSION['missing'] .= $no_sex;
    elseif ($_SESSION['sex'] == $_SESSION['no_data']): $_SESSION['sex'] = $_SESSION['no_data'];
    $_SESSION['missing'] .= $no_sex;
endif;


$_SESSION['composition'] .= "man/vrouw: ";
$_SESSION['composition'] .= $_SESSION['sex'] . "<br>";

if ($_SESSION['firstname'] == ""): $_SESSION['firstname'] = $_SESSION['no_data'];
$_SESSION['missing'] .= $no_first;
    elseif ($_SESSION['firstname'] == $_SESSION['no_data']): $_SESSION['firstname'] = $_SESSION['no_data'];
    $_SESSION['missing'] .= $no_first;
endif;


$_SESSION['composition'] .= "Naam van de afzender: ";
$_SESSION['composition'] .= $_SESSION['firstname'];

if ($_SESSION['famname'] == ""): $_SESSION['famname'] = $_SESSION['no_data'];
$missing .= $no_fam;
    elseif ($_SESSION['famname'] == $_SESSION['no_data']): $_SESSION['famname'] = $_SESSION['no_data'];
    $missing .= $no_fam;
endif;


$_SESSION['composition'] .= " ";
$_SESSION['composition'] .= $_SESSION['famname'] . "<br>";

//---------------------------------------------//
// validation of (e-mail) address sender
//---------------------------------------------//


if ($_SESSION['email'] == "geen") {
    $_SESSION['email'] = $_SESSION['email'];
        if ($_SESSION['street'] == ""): $pointer = "a";
        $missing .= $communication006;
        endif;

        if ($_SESSION['code'] == ""): $missing .= $communication007;
        $pointer = "a";
        endif;

        if ($_SESSION['city'] == ""): $missing .= $communication008;
        $pointer = "a";
        endif;

        if ($_SESSION['telephone'] == ""): $missing .= $communication009;
        $pointer = "a";
        endif;

    if ($pointer == "a"): $missing .= $communication010;
    endif;

    }


elseif (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $_SESSION['email'])) {
            $_SESSION['missing'] .= $emailnotcor;
                if ($_SESSION['email'] == ""):$_SESSION['email'] = $communication011;
                endif;
            }


    $_SESSION['email'] = $_SESSION['email'];
    $_SESSION['composition'] .= "Straat en nummer: ";
    $_SESSION['composition'] .= $_SESSION['street'] . "<br>";
    $_SESSION['composition'] .= "Postcode en plaats: ";
    $_SESSION['composition'] .= $_SESSION['code'];
    $_SESSION['composition'] .= " ";
    $_SESSION['composition'] .= $_SESSION['city'] . "<br>";
    $_SESSION['composition'] .= "Telefoonnummer: ";
    $_SESSION['composition'] .= $_SESSION['telephone'] . "<br>";


//@@@@@@@@@@@@@@@@@@@@@@@@@@@@//
// check and compose posted data
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@//


if ($_SESSION['subject'] == ""): $_SESSION['subject'] = $_SESSION['no_data'];
$_SESSION['missing'] .= $nosub;
    elseif ($_SESSION['subject'] == $_SESSION['no_data']): $_SESSION['subject'] = $_SESSION['no_data'];
$_SESSION['missing'] .= $nosub;
endif;


if ($_SESSION['remark'] == ""): $_SESSION['remark'] = $_SESSION['no_data'];
    $_SESSION['missing'] .= $no_name;
        elseif ($_SESSION['remark'] == $_SESSION['no_data']): $_SESSION['remark'] = $_SESSION['no_data'];
    $_SESSION['missing'] .= $no_name;
endif;


//**************************** compose message *********************************


$_SESSION['composition'] .= "<p>**************************************************</p><p>Het onderwerp: ";
$_SESSION['composition'] .= $_SESSION['subject'] . "<br>";

$_SESSION['composition'] .= "Inhoud van het bericht: ";
$_SESSION['composition'] .= $_SESSION['remark'];

//---------------------------------------------//
//      create message with-out attachment     //
//---------------------------------------------//


function create_header ()
    {

    global $header, $email, $boundery, $composition, $body;

    $header = "From:";
    $header .= $_SESSION['email'];
    $header .= "\n";
    $header .= "Reply-To:";
    $header .= $_SESSION['email'];
    $header .= "\n";
    $header .= "X-Mailer: AccommodateProduction.Com PHP version \n";

    $boundery = strtoupper(md5(uniqid(time())));// create uniq boundery

    // create rest of header

    $header .= "MIME-version: 1.0\n";
    $header .= "Content-type: multipart/mixed;\n";
    $header .= "\tboundery=" . $boundery . "\n\n";
    $header .= "This is a multi-part message in MIME-format.\n\n";

    // create point of message body
    $header .= "--" . $boundery . "\n";
    $header .= "Content-type: text/html;\n";
    $header .= "\tcharset=\"iso-8859-1\"\n";
    $header .= "Content-Transfer-Encoding: quoted-printable\n\n";

    $body = $_SESSION['composition'];
    $header .= $body . "\n\n";
    }



//---------------------------------------------//

create_header ();

//---------------------------------------------//
//          check and send        //
//---------------------------------------------//

//echo "Variable missing=";
//echo $missing;
//exit;


if ($_SESSION['missing'] != "! "): $_SESSION['oops'] = "o";
    header ("Location: ../index.php?lang=" . $lang . "&pid=p007\n");
    else: mail($_SESSION['reciever'], $_SESSION['subject']," ", $header);
header ("Location: ../index.php?lang=" . $lang . "&pid=p007&tnx01=y\n");endif;

?>


Hetgeen wat er nog in moet is dus de controle van de captcha, volgens mij iets als dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
if (md5($_POST['AntiSpam']) == $_SESSION['randomnr2']){
$Spam = 0;
}

else{
$Spam = 1;
$errstr[] = "Vul de juiste code van het plaatje in!";
Gewijzigd op 27/01/2012 15:24:01 door Bart van Tol
 
PHP hulp

PHP hulp

29/04/2024 05:10:22
 
Obelix Idefix

Obelix Idefix

27/01/2012 16:40:53
Quote Anchor link
Bart van Tol op 27/01/2012 15:23:11:
Hetgeen wat er nog in moet is dus de controle van de captcha, volgens mij iets als dit:


Dan zet je dat er toch in ;-)

Script is uit 2004. Zie o.a. staan eregi. Is verouderd.
Waarom al die variabelen in dat script telkens kopiëren?
 
Bart van Tol

Bart van Tol

27/01/2012 16:50:28
Quote Anchor link
Zoals ik al zei, werkt dat niet.

Is het dan beter op zoek te gaan naar een nieuw mailscirpt waar de catchpa al in zit verwerkt?
 
Obelix Idefix

Obelix Idefix

27/01/2012 17:09:17
Quote Anchor link
Wat werkt er niet dan?

Captcha-scripts zijn er genoeg. Overigens zijn de mening verdeelt over de gebruiksvriendelijkheid er van. Als alternatief wordt o.a. aangegeven dat je een hidden field opneemt in je form. Als dat gevuld wordt, is het spam. Of het idd werkt; geen idee.
 
Reshad F

Reshad F

27/01/2012 23:19:18
Quote Anchor link
yup de hidden field zou ik voor gaan of gewoon simpel weet niet of het wel goed beveiligd is maar ik denk als je er iets van een

random() bijzet zodat het nummertje steeds verandert of een switch zodat je steeds een andere som krijgt kan je dit doen.
als dit hieronder heel fout is wil ik het graag horen heb het even zelf bedacht en ben nog niet zo heel lang met php bezig dus alle tips zijn welkom.. denk wel dit is een voorbeeldje uiteraard kan je het beetje uitbreiden om het niet steeds met een dezelfde getal te krijgen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
if($captcha != 5){
            
            echo "u heeft de anti-spam beveiliging niet doorstaan<br/> vul het formulier opnieuw in a.u.b.";
            
            }
 



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.