Includere captcha in pagina php
Bungiorno,
sono un nuovo membro, e questa è la mia prima discussione nel forum.
Finora me la sono sempre cavata da solo, ma ora ho un problema che mi si presenta come irrisolvibile.
Ho creato una pagina di registrazione a cui vorrei includere un codice captcha.
Dopo aver trovato online ciò che mi serviva ho fatto il file .php addetto alla creazione dell'immagine.
Nella pagina di prova che ho fatto funziona tutto, ma una volta richiamato il captcha nella vera pagina di registrazione, viene sempre il messaggio "Codice errato!".
In seguito vi posto i codici sorgente delle varie parti.
File captcha.php
Codice PHP:
<?php
session_start();
/* dimensioni */
$x = 200; //larghezza
$y = 80; //altezza
$image = imagecreatetruecolor($x, $y); //creo l'immagine
$color = array();
$color[] = imagecolorallocate($image, 255, 0, 0);
$color[] = imagecolorallocate($image, 0, 255, 0);
$color[] = imagecolorallocate($image, 0, 0, 255);
$color[] = imagecolorallocate($image, 255, 255, 0);
$color[] = imagecolorallocate($image, 255, 0, 255);
$color[] = imagecolorallocate($image, 255, 255, 255);
$color[] = imagecolorallocate($image, 0, 255, 255);
$font = array();
$font[] = "captcha/font/arial.ttf";
$font[] = "captcha/font/abbeyroad_regular.ttf";
$font[] = "captcha/font/roman_sd_regular.ttf";
$font[] = "captcha/font/elephants_in_cherry_trees_normal.ttf";
$black = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $black);
add_noise($image, 170, 1, $x, $y); //aggiungo il disturbo
$_SESSION['CAPTCHA'] = strtolower(getString()); //genero la nuova stringa
for($i = 0;$i < strlen($_SESSION['CAPTCHA']); $i++) {
/* per ogni lettera applico impostazioni diverse (dimensione, angolo, colore, font) */
imagettftext(
$image, //immagine
20 + rand(0, 6), //dimensione carattere
rand(-35, 35), //angolo di rotazione
($i+1)*26, //offset sulla x
45+ rand(0, 4), //offset sulla y
$color[rand(0, count($color)-1)], //colore
$font[rand(0, count($font)-1)], //carattere
$_SESSION['CAPTCHA'][$i] //lettera da stampare
);
}
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
function getString() {
$str = base64_encode(time());
$str = str_replace("=", "", $str); //elimino gli =
$str = str_shuffle($str);
return substr($str, 0, 6);
}
function add_noise($image, $difficoult, $figure, $x, $y) {
if($figure == 1)
$difficoult *= 15; //i punti devono essere più delle linee per generare un disturbo significativo
for($i = 0; $i < $difficoult; $i++) {
$color = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
$p = rand(0, 10);
$x1 = rand($p, rand($x - $p, $x-1));
$x2 = rand($p, rand($x - $p, $x-1));
$y1 = rand($p, rand($y - $p, $y-1));
$y2 = rand($p, rand($y - $p, $y-1));
switch($figure) {
case 1:
imageline($image, $x1, $y1, $x1, $y1, $color);
break;
default:
imageline($image, $x1, $y1, $x2, $y2, $color);
break;
}
}
}
?>
Pagina di prova in cui tutto sembra funzionare:
Codice PHP:
<? session_start(); ?>
<form action="example.php" method="post">
<img src="/captcha.php" /><br/><br/>
Inserisci il codice che vedi: <input type="text" name="cpt" /> <input type="submit" value="Check" />
</form>
<?php
if(isset($_POST['submit']) && (trim($_POST['submit']) == "Partecipa"))
{
if(isset($_POST['cpt']) && !empty($_POST['cpt'])){
{if($_SESSION['CAPTCHA'] != strtolower($_POST['cpt']))
echo "<strong>Codice errato!</strong>";
else{
echo "Ok";
}
}
}else{
echo "Inserisci il codice captcha";
}
}
?>
Pagina d'iscrizione in cui vorrei inserire il captcha:
Codice PHP:
<?php
// controllo sul parametro d'invio
if(isset($_POST['submit']) && (trim($_POST['submit']) == "Partecipa"))
{
// controllo sul formato dell'email
if((!isset($_POST['email'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['email'])))
{
echo "Attenzione, formato email non valido.";
}else{
// se i parametri sono corretti popoliamo il database
$email = $_POST['email'];
$username = $_POST['username'];
$code = rand(100000, 999999);
// ma prima controlliamo che l' username e l'email non siano già presenti includiamo il file di configurazione
@include "config.php";
$ctrl_username = @mysql_query("SELECT id FROM iscrizioni WHERE username='$username'") or die (mysql_error());
if(@mysql_num_rows($ctrl_username)>0)
{
echo "L'username risulta già registrato.";
}else{
$ctrl_email = @mysql_query("SELECT id FROM iscrizioni WHERE email='$email'") or die (mysql_error());
if(@mysql_num_rows($ctrl_email)>2)
{
echo "Errore: il numero massimo di utenti iscritti con lo stesso indirizzo e-mail è 2.Limite superato.";
}else{
// query d'inserimento
if(@mysql_query("INSERT INTO iscrizioni (email, codiceconferma, username) VALUES('$email','$code','$username')") or die (mysql_error()))
{
// messaggio di conferma
echo "Conferma l'iscrizione tramite la mail che ti abbiamo inviato.<br>Se non trovi l'e-mail controlla anche nella cartella di posta indesiderata: alcuni provider considerano inavvertitamente le nostre lettere come non attendibili.";
// email per la conferma
// intestazioni
$headers = "From: $admin_email\nreply-To: noreply\r\n";
$subject = "Conferma la tua iscrizione.";
$header .= "X-Mailer: Il nostro Php\n";
// costruiamo le intestazioni specifiche per il formato HTML
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html; charset=\"utf-8\"\n";
$headers .= "Content-Transfer-Encoding: 7bit\n\n";
//costruiamo il messaggio in formato HTML
//corpo del messaggio
$messaggio = "Ti ringraziamo per la tua iscrizione.<br>
La tua email è: ".$email." <br>
Il tuo username è: ".$username." <br>
Il tuo codice di conferma è: ".$code." <br>
Per confemare vai alla pagina <p><a href =http://partypoints.altervista.org/conferma.php>http://partypoints.altervista.org/conferma.php</a></p> e inserisci i dati per l'autenticazione.<br>
*************** <br>
QUESTA È SOLO UNA NOTIFICA AUTOMATICA: EVENTUALI RISPOSTE NON VERRANNO LETTE.
SE VUOI CONTATTARCI PUOI FARLO ALL'INDIRIZZO nintendo3dsteam@yahoo.it O TRAMITE IL NOSTRO FORUM.<br>
*************** <br>";
// invio dell'email
@mail($email, stripslashes($subject),stripslashes($messaggio),$headers);
}
}
}
}
}else{
// form per l'iscrizione
?>
<h1>Modulo di partecipazione alla gara mensile:</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<SPAN STYLE="color: red"><b>E-mail:</b></SPAN><br>
<input name="email" type="text" size="30"><br>
<SPAN STYLE="color: red"><b>Username Forumcommunity : </b></SPAN>(se non disponi di un ForumcommunityUsername clicca <a href="http://mynintendo3ds.forumcommunity.net/?act=Reg">qui</a>)<br>
<input name="username" type="text" size="30"><br>
<input name="submit" type="submit" value="Partecipa"><br>
Cliccando sul pulsante "Partecipa" dichiari di aver letto e accettato il <a href="http://partypoints.altervista.org/regolamento.html">Regolamento ufficiale del servizio.</a>
</form><br>
<DIV ALIGN="center"><img src="http://partypoints.altervista.org/immagini/iscrizione.png"><br></DIV>
<DIV ALIGN="center"><a href="http://partypoints.altervista.org/index.html">Vai alla home</a></DIV>
<?
}
?>
Vi sarei veramente grato se potreste postarmi il codice della pagina d'iscrizione completo con già inclusa la funzione richiamante il captcha.
Inoltre vorrei che mi faceste un altro piccolissimo favorino: sarebbe possibile includere un link o un pulsante per ricaricare il captcha nel caso in cui esso sia illeggibile?
Spero di non arrecarvi troppo disturbo e lascio il destino del mio sito web nelle vostre mani.
Grazie
_______________________
PartyPoints