Captcha in PHP formulier
Ik heb even hulp nodig want onze mailbox word overspoeld met spam , dus ik kwam op het idee om captcha te implementeren alleen ik krijg het niet voor elkaar.
Kunnen jullie me helpen wat ik moet invoeren en waar het moet staan in mijn PHP formulier?
>>>
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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
<?php
session_start(); // zorg ervoor dat session_start ALTIJD bovenaan ALLES van je pagina staat, anders werkt het niet!
// E-mailadres van de ontvanger
$mail_ontv = '[email protected]'; // <<<----- voer jouw e-mailadres hier in!
// Speciale checks voor naam en e-mailadres
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// naam controle
if (!preg_match('/[ a-zA-Z-]$/', $_POST['naam']))
$naam_fout = 1;
// e-mail controle
if (function_exists('filter_var') && !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
$email_fout = 1;
}
$website_naam = '.....nl';
// HTML mail? True/False
$html = true;
// Kijk of alle velden zijn ingevuld - naam mag alleen uit letters bestaan en het e-mailadres moet juist zijn
if (($_SERVER['REQUEST_METHOD'] == 'POST' && ( empty($_POST['naam']) || !empty($naam_fout) || empty($_POST['mail']) || !empty($email_fout) || empty($_POST['bericht']))) || $_SERVER['REQUEST_METHOD'] == 'GET')
{
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (!empty($naam_fout))
echo '<p>Uw naam mag alleen letters bevatten.</p>';
elseif (!empty($email_fout))
echo '<p>Uw e-mailadres is niet juist.</p>';
elseif (!empty($antiflood))
echo '<p>U mag slechts één bericht per ' . $seconde . ' seconde versturen.</p>';
else
echo '<p>U bent uw naam, e-mailadres, onderwerp of bericht vergeten in te vullen.</p>';
}
// HTML e-mail formlier
echo '<form method="post" action="' . $_SERVER['REQUEST_URI'] . '" />
<p>
<label for="naam">Naam :</label><br />
<input type="text" id="naam" name="naam" value="' . htmlspecialchars($_POST['naam']) . '" /><br />
<label for="mail">E-mailadres :</label><br />
<input type="text" id="mail" name="mail" value="' . htmlspecialchars($_POST['mail']) . '" /><br />
<label for="naam">Telefoonnummer :</label><br />
<input type="text" id="telefoonnummer" name="telefoonnummer" value="' . htmlspecialchars($_POST['telefoonnummer']) . '" /><br />
<label for="bericht">Uw Vraag :</label><br />
<textarea id="bericht" name="bericht" rows="8" style="width: 400px;">' . htmlspecialchars($_POST['bericht']) . '</textarea><br />
<input type="submit" name="submit" value=" Versturen " />
</p>
</form>';
}
// versturen naar
else
{
// set datum
$datum = date('d/m/Y H:i:s');
$inhoud_mail = "===================================================<br />";
$inhoud_mail .= "<b><font color=Blue>Ingevuld contact formulier Website</font></b> " . $_SERVER['HTTP_HOST'] . "<br />";
$inhoud_mail .= "===================================================<br /><br />";
$inhoud_mail .= "<b><font color=Green>Naam :</font></b> " . htmlspecialchars($_POST['naam']) . "<br />";
$inhoud_mail .= "<b><font color=Green>E-mail adres :</font></b> " . htmlspecialchars($_POST['mail']) . "<br />";
$inhoud_mail .= "<b><font color=Green>Telefoonnummer :</font></b> " . htmlspecialchars($_POST['telefoonnummer']) . "<br /><br />";
$inhoud_mail .= "<b><font color=Green>Vraag :</font></b><br />";
$inhoud_mail .= htmlspecialchars($_POST['bericht']) . "<br /><br />";
$inhoud_mail .= "===================================================<br />";
$inhoud_mail .= "Verstuurd op " . $datum . " via het IP adres " . $_SERVER['REMOTE_ADDR'] . "<br />";
$inhoud_mail .= "===================================================<br />";
// --------------------
// spambot protectie
// --------------------
$headers = 'From: ' . htmlspecialchars($_POST['naam']) . ' <' . $_POST['mail'] . '>' . PHP_EOL;
$headers .= 'Reply-To: ' . htmlspecialchars($_POST['naam']) . ' <' . $_POST['mail'] . '>' . PHP_EOL;
$headers .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . PHP_EOL;
$headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . PHP_EOL : '';
$headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
$headers .= 'X-Priority: Normal' . PHP_EOL;
$headers .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
$headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL : '';
if (mail($mail_ontv, 'Vraag via ....nl', $inhoud_mail, $headers))
{
echo '<h1>Uw vraag is verzonden</h1>
<p>Bedankt voor het invullen van het contactformulier. We zullen zo spoedig mogelijk uw vraag beantwoorden.</p>';
}
else
{
echo '<h1>Uw vraag is niet verzonden, er is iets mis gegaan.</h1>
<p><b>Onze excuses.</b> Uw vraag kon niet verzonden worden, er is iets mis gegaan.</p>';
}
}
?>
session_start(); // zorg ervoor dat session_start ALTIJD bovenaan ALLES van je pagina staat, anders werkt het niet!
// E-mailadres van de ontvanger
$mail_ontv = '[email protected]'; // <<<----- voer jouw e-mailadres hier in!
// Speciale checks voor naam en e-mailadres
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// naam controle
if (!preg_match('/[ a-zA-Z-]$/', $_POST['naam']))
$naam_fout = 1;
// e-mail controle
if (function_exists('filter_var') && !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
$email_fout = 1;
}
$website_naam = '.....nl';
// HTML mail? True/False
$html = true;
// Kijk of alle velden zijn ingevuld - naam mag alleen uit letters bestaan en het e-mailadres moet juist zijn
if (($_SERVER['REQUEST_METHOD'] == 'POST' && ( empty($_POST['naam']) || !empty($naam_fout) || empty($_POST['mail']) || !empty($email_fout) || empty($_POST['bericht']))) || $_SERVER['REQUEST_METHOD'] == 'GET')
{
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (!empty($naam_fout))
echo '<p>Uw naam mag alleen letters bevatten.</p>';
elseif (!empty($email_fout))
echo '<p>Uw e-mailadres is niet juist.</p>';
elseif (!empty($antiflood))
echo '<p>U mag slechts één bericht per ' . $seconde . ' seconde versturen.</p>';
else
echo '<p>U bent uw naam, e-mailadres, onderwerp of bericht vergeten in te vullen.</p>';
}
// HTML e-mail formlier
echo '<form method="post" action="' . $_SERVER['REQUEST_URI'] . '" />
<p>
<label for="naam">Naam :</label><br />
<input type="text" id="naam" name="naam" value="' . htmlspecialchars($_POST['naam']) . '" /><br />
<label for="mail">E-mailadres :</label><br />
<input type="text" id="mail" name="mail" value="' . htmlspecialchars($_POST['mail']) . '" /><br />
<label for="naam">Telefoonnummer :</label><br />
<input type="text" id="telefoonnummer" name="telefoonnummer" value="' . htmlspecialchars($_POST['telefoonnummer']) . '" /><br />
<label for="bericht">Uw Vraag :</label><br />
<textarea id="bericht" name="bericht" rows="8" style="width: 400px;">' . htmlspecialchars($_POST['bericht']) . '</textarea><br />
<input type="submit" name="submit" value=" Versturen " />
</p>
</form>';
}
// versturen naar
else
{
// set datum
$datum = date('d/m/Y H:i:s');
$inhoud_mail = "===================================================<br />";
$inhoud_mail .= "<b><font color=Blue>Ingevuld contact formulier Website</font></b> " . $_SERVER['HTTP_HOST'] . "<br />";
$inhoud_mail .= "===================================================<br /><br />";
$inhoud_mail .= "<b><font color=Green>Naam :</font></b> " . htmlspecialchars($_POST['naam']) . "<br />";
$inhoud_mail .= "<b><font color=Green>E-mail adres :</font></b> " . htmlspecialchars($_POST['mail']) . "<br />";
$inhoud_mail .= "<b><font color=Green>Telefoonnummer :</font></b> " . htmlspecialchars($_POST['telefoonnummer']) . "<br /><br />";
$inhoud_mail .= "<b><font color=Green>Vraag :</font></b><br />";
$inhoud_mail .= htmlspecialchars($_POST['bericht']) . "<br /><br />";
$inhoud_mail .= "===================================================<br />";
$inhoud_mail .= "Verstuurd op " . $datum . " via het IP adres " . $_SERVER['REMOTE_ADDR'] . "<br />";
$inhoud_mail .= "===================================================<br />";
// --------------------
// spambot protectie
// --------------------
$headers = 'From: ' . htmlspecialchars($_POST['naam']) . ' <' . $_POST['mail'] . '>' . PHP_EOL;
$headers .= 'Reply-To: ' . htmlspecialchars($_POST['naam']) . ' <' . $_POST['mail'] . '>' . PHP_EOL;
$headers .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . PHP_EOL;
$headers .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . PHP_EOL : '';
$headers .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
$headers .= 'X-Priority: Normal' . PHP_EOL;
$headers .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
$headers .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL : '';
if (mail($mail_ontv, 'Vraag via ....nl', $inhoud_mail, $headers))
{
echo '<h1>Uw vraag is verzonden</h1>
<p>Bedankt voor het invullen van het contactformulier. We zullen zo spoedig mogelijk uw vraag beantwoorden.</p>';
}
else
{
echo '<h1>Uw vraag is niet verzonden, er is iets mis gegaan.</h1>
<p><b>Onze excuses.</b> Uw vraag kon niet verzonden worden, er is iets mis gegaan.</p>';
}
}
?>
Gewijzigd op 16/08/2011 14:25:41 door Wouter Snijders
Gewoon een simpel formuliertje ála; 'Hoeveel is 2 + 3?'. En dan even het antwoord checken rond regel 25.
Zo ver was ik namelijk ook al maar ik krijg het niet werkende....
Wat lukt er dan niet? Zet het captcha inputveld in je formulier en controleer het vanuit de $_POST['captchaveldnaam'].
Dus mijn vraag was kunnen jullie me een voorbeeld geven , en waar ik dat moet verwerken in mijn PHP script.
Of wijs me even in de goede richting van een goed script met duidelijk uitleg of zoiets ^_^
Toevoeging op 17/08/2011 14:46:40:
Deze bijvoorbeeld , heb ik gedaan , maar werkt niet , krijg elke keer melding >
"Method not Allowed" na invoeren antwoord , en als ik hem verwerk in mijn script laadt de pagina niet eens meer ... -__-
http://www.phphulp.nl/php/script/beveiliging/som-captcha/1912/
Gewijzigd op 17/08/2011 14:48:20 door Wouter Snijders
Op regel 52 kan je het <input> veld zetten.
Als ik een fout antwoord invul word de mail alsnog verzonden , dus wat zou ik dan nog fout doen?
blijkbaar heb je een if verkeerd
if ($_SERVER['REQUEST_METHOD'] == 'POST')
if (isset($_POST['antwoord']) && isset($_SESSION['som_antwoord'])) {
echo ($_POST['antwoord'] == $_SESSION['som_antwoord']) ? 'Goed' : 'Fout';
Dat is alleen een echo. Je moet voordat je mailt ook checken of het goed was.
http://www.phphulp.nl/php/script/beveiliging/som-captcha/1912/indexphp/1651/
maar dat wil zeggen dat wat daar in staat niet genoeg is , er ontbreekt dus een check.
Deze regel <img src="c' . $i[array_rand($i)] . '.php" /> , werkt niet goed...
Dit moet verwijzen naar mijn class.captcha.php , maar op 1 of andere vage manier zet hij elke keer een nummer erbij , dus dan zoekt hij weer naar c1.php of c4.php , ik snap echt niet wat ik nu weer fout doe... (stoot met hoofd tegen muur -__-)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?
// We willen op de hoogte gehouden worden van alle errors / notices
ini_set('display_errors', 1);
error_reporting(E_ALL);
// we gaan met sessies werken
session_start();
?>
// We willen op de hoogte gehouden worden van alle errors / notices
ini_set('display_errors', 1);
error_reporting(E_ALL);
// we gaan met sessies werken
session_start();
?>
<html>
<head>
<title>Captcha Class</title>
</head>
<body>
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
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
<?
// controlen of het formulier gesubmit is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(!empty($_POST['captcha_code']) && sha1(md5($_POST['captcha_code'])) == $_SESSION['captcha_code'])
{
echo 'De code is correct, Gefeliciteerd!';
}
else {
echo 'De ingevoerde code is niet juist!';
}
}
else {
$i = range(1, 8);
echo '
<form method="post" action="'.$_SERVER['PHP_SELF'].'">
<p>
<img src="c' . $i[array_rand($i)] . '.php" />
</p>
<p>
Neem de code precies zo over zoals aangegeven hierboven.<br />
Hou dus rekening met Hoofdletter en Kleine letters.<br /><br />
<label for="captcha_code">Beveiligingscode :</label>
<input type="text" name="captcha_code">
</p>
<p>
<input type="submit" name="submit" value="Controleer">
</p>
</form>
';
}
?>
// controlen of het formulier gesubmit is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(!empty($_POST['captcha_code']) && sha1(md5($_POST['captcha_code'])) == $_SESSION['captcha_code'])
{
echo 'De code is correct, Gefeliciteerd!';
}
else {
echo 'De ingevoerde code is niet juist!';
}
}
else {
$i = range(1, 8);
echo '
<form method="post" action="'.$_SERVER['PHP_SELF'].'">
<p>
<img src="c' . $i[array_rand($i)] . '.php" />
</p>
<p>
Neem de code precies zo over zoals aangegeven hierboven.<br />
Hou dus rekening met Hoofdletter en Kleine letters.<br /><br />
<label for="captcha_code">Beveiligingscode :</label>
<input type="text" name="captcha_code">
</p>
<p>
<input type="submit" name="submit" value="Controleer">
</p>
</form>
';
}
?>
Je zet zelf 1 t/m 8 in $i, dus dat zal een cijfer geven.
Wat zou dat moeten zijn volgens jou?
Nu zoekt hij wel naar class.captcha.php :)
Alleen nu laat hij nog steeds het plaatje niet zien , alleen een rood kruisje waar het plaatje moet staan , GD Library werkt wel dus dat is het niet.
Ik denk dat het aan het fonts path ligt , klopt deze regel? >
var $fonts_path = '/usr/local/WWW/A/5c1/g/geush/htdocs/fonts';
Dit is de map waar mijn fonts in staan. , misschien maak ik hier ook een fout.
Gewijzigd op 18/08/2011 15:09:06 door Wouter Snijders
Volgens mij hoef je daar geen volledig server pad op te geven, maar alleen (/)fonts?
Ik ben verder gaan zoeken en kwam ReCaptcha tegen , dat werkte in 1 x goed ^_^
Dus bij deze is mijn probleem ook weer opgelost , geen spam meer in onze mailboxen.
Gewijzigd op 19/08/2011 16:21:03 door PHP Scripter