Problema con captcha

Riciao a tutti!  O0

Dopo aver seguito il piccolo corso sul captcha di Gianni Tomasicchio  ho 'creato' il codice captcha per il mio sito e...NON VA'....il problema è sulla generazione dell immagine, lo script in se stesso và...io digitando lettere a caso mi viene fuori la scritta codive non valido e, se manualmente immetto dei dati nella tabella una volta dato l invio al form i record mi vengono cancellati, a dire la verità per ora ho quasi fatto uno spudorato copia incolla(ed ho già fatto una caz.... :crazy:), ho solo cambiato le istruzioni per il collegamento al database, e ho cambiato il tipo di file font perchè il font che c'è segnato sul corso io non cè l' ho(l ho anche messo nella cartella degli script), il problema è che non riesco a capire dove ho sbagliato, o cosa devo fare che non ho fatto.

posto tutti i 3 codici

FORM.php

<?php 
$connessione=mysql_connect("localhost", "root","elettronica");
$selezione_db=mysql_select_db("prove", $connessione);
// creo un identificativo da associare al codice di sicurezza 
$CAPTCHA_id = md5(microtime().mt_rand().'super1segreto2segretissimo3'); 
// creo un codice di controllo per la verifica dell'identificativo 
$sale = "frase super segreta da cambiare a discrezione."; 
$chk = md5($sale.$CAPTCHA_id); 
?> 
<form id="form1" name="form1" method="post" action="post.php"> 
Inserisci i caratteri 
<img src="/CAPTCHA.php?id=<?php echo "$CAPTCHA_id&chk=$chk"?>" width="110" height="70" /> 
qui: 
<input type="text" name="CAPTCHA_code" /> 
<input name="CAPTCHA_id" type="hidden" id="CAPTCHA_id" value="<?php echo $CAPTCHA_id?>" /> 
<input type="submit" name="Submit" value="Invia" /> 
</form>

CAPTCHA.php

<?php 
$connessione=mysql_connect("localhost", "root","elettronica");
$selezione_db=mysql_select_db("prove", $connessione);
// controllo se è stato fornito l'identificativo del codice CAPTCHA 
if(!isset($_GET['id'])) exit(); 
// controllo la validità dell'identificativo 
$CAPTCHA_id = $_GET['id']; 
if(!preg_match("/^[a-f0-9]{32}$/",$CAPTCHA_id)) exit(); 
// ricreo il codice di controllo e lo confronto con quello passato via GET 
$sale = "frase super segreta da cambiare a discrezione."; 
$chk = md5($sale . $CAPTCHA_id); 
if($chk != $_GET['chk']) exit(); 
// creo l'immagine 
// --------------------------------------------------------------- 
// le dimensioni dell'immagine 
$size_x = 110; 
$size_y = 70; 
$img = imagecreatetruecolor($size_x,$size_y); 
// alloco un colore per lo sfondo 
$backgroung = imagecolorallocate($img,255, 255, 255); 
// alloco 3 colori per le 3 lettere da decifrare 
// utilizzo il canale alpha per impostare la trasparenza 
$color[] = imagecolorallocatealpha($img,110,110,110,60); 
$color[] = imagecolorallocatealpha($img,3,187,63,60); 
$color[] = imagecolorallocatealpha($img,255,0,0,70); 
// mischio l'ordine dei colori 
shuffle($color); 
// coloro lo sfondo creando un rettangolo 
imagefilledrectangle($img,0,0,$size_x-1,$size_y-1,$backgroung); 
// i caratteri da utilizzare per il codice di sicurezza 
$caratteri = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; 
// inizializzo la variabile che conterrà il codice 
$codice = ''; 
// per ciascuno dei 3 caratteri 
for ($i=0 ; $i < 3 ; $i++) 
{ 
// estraggo un carattere a caso 
$codice .= $caratteri{rand(0,34)}; 
// disegno il carattere 
imagettftext( 
$img, 
50, 
-5+rand(0,10), // rotazione casuale 
($i+0.3)*24, 
60, 
$color[$i], 
'./Segoescb.ttf', 
$codice{$i}); 
} 
// inserisco identificativo e codice nel DB 
// --------------------------------------------------------------- 
mysql_connect('localhost','root','secret'); 
mysql_select_db('CAPTCHA'); 
mysql_query("REPLACE INTO CAPTCHA (CAPTCHA_id,code,`timestamp`) 
values ('$CAPTCHA_id','$codice',UNIX_TIMESTAMP())"); 
// con prob. impostata da $probabilità cancello i record più vecchi 
$probabilità = 5; // 5% 
if(mt_rand(1,100) <= $probabilità) 
{ 
$durata_CAPTCHA = 60*60; 
mysql_query("DELETE FROM CAPTCHA WHERE `timestamp`<(UNIX_TIMESTAMP()-$durata_CAPTCHA)"); 
} 
// invio l'immagine al browser 
// --------------------------------------------------------------- 
header("Content-type: image/png"); 
imagepng($img); 
?>

POST.php

<?php 
// dopo quanto tempo i dati nella tabella del DB "scadono"? 
$durata_CAPTCHA = 60*60; // secondi 
// ci sono tutti i dati? 
if(!isset($_POST['CAPTCHA_code']) OR !isset($_POST['CAPTCHA_id'])) exit; 
$CAPTCHA_code = $_POST['CAPTCHA_code']; 
$CAPTCHA_id = $_POST['CAPTCHA_id']; 
// controlla la validità del $CAPTCHA_id 
if(!preg_match("/^[a-f0-9]{32}$/",$CAPTCHA_id)) 
{ 
// se il $CAPTCHA_id non è valido termino la procedura 
echo '$CAPTCHA_id non valido'; 
} 
else
{ 
// controlla la validità del $CAPTCHA_code 
if (!preg_match("/^[a-zA-Z0-9]{3}$/", $CAPTCHA_code)) 
{ 
// se il $CAPTCHA_code non è valido non faccio la ricerca nel DB 
echo '$CAPTCHA_code non valido'; 
} 
else
{ 
// $CAPTCHA_id e $CAPTCHA_code sono ben formattai, posso fare la verifica 
// rendo tutte le lettere del $CAPTCHA_code maiuscole e 
// sostituisco gli zeri con le O 
$CAPTCHA_code = strtoupper($CAPTCHA_code); 
$CAPTCHA_code = str_replace('0','O',$CAPTCHA_code); 
mysql_connect('localhost','root','elettronica') or die(mysql_error()); 
mysql_select_db('prove') or die(mysql_error()); 
// nella verifica non considero dati più vecchi di $durata_CAPTCHA secondi 
$res = mysql_query("SELECT code FROM CAPTCHA 
WHERE 
CAPTCHA_id = '$CAPTCHA_id' AND 
code = '$CAPTCHA_code' AND 
`timestamp` > (UNIX_TIMESTAMP() - $durata_CAPTCHA)") 
or die (mysql_error()); 
if(mysql_num_rows($res) != 1) 
{ 
// verifica fallita 
echo '$CAPTCHA_code errato'; 
} 
else
{ 
// OK!!! 
echo '$CAPTCHA_code corretto!'; 
} 
} 
// cancello i vecchi codici e quello corrente 
mysql_connect('localhost','root','elettronica') or die(mysql_error()); 
mysql_select_db('prove') or die(mysql_error()); 
mysql_query("DELETE FROM CAPTCHA 
WHERE CAPTCHA_id = '$CAPTCHA_id' OR 
`timestamp` < (UNIX_TIMESTAMP() - $durata_CAPTCHA)"); 
} 
?>

Grazie!!

 :bye:

inviato 7 anni fa
gianluca80
modificato 7 anni fa
X 0 X

Ho dato una letta veloce e devo ancora capire il codice...

Comunque in FORM.php perchè crei una connessione al database che poi non usi?

Poi in CAPTCHA.php prima di fare tutto è il caso che fai un controllo per vedere se c'è qualcosa nell'array $_POST.

Inoltre cerchi di prelevare i dati dall'array $_GET quando in FORM.php li invii tramite metodo post...

Correggi prima queste cose.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ciao Mario, ieri sera mi sono dovuto fermare fuori a lavoro per trasferta ho controllato ora...

allora...effettivamente la connessione al DB in form.php non serve a nulla però i dati che prelevo dal form.php, cioè questi

<input type="text" name="CAPTCHA_code" /> 
<input name="CAPTCHA_id" type="hidden" id="CAPTCHA_id" value="<?php echo $CAPTCHA_id?>" /> 
<input type="submit" name="Submit" value="Invia" />

mi sembra di prelevarli in modo giusto in post.php

if(!isset($_POST['CAPTCHA_code']) OR !isset($_POST['CAPTCHA_id'])) exit; 
$CAPTCHA_code = $_POST['CAPTCHA_code']; 
$CAPTCHA_id = $_POST['CAPTCHA_id']; 
// controlla la validità del $CAPTCHA_id

e..scusa ma non capisco che tipo di controllo devo fare in  captcha .php

Grazie Mario  O0 O0

risposto 7 anni fa
gianluca80
X 0 X

allora...effettivamente la connessione al DB in form.php non serve a nulla però i dati che prelevo dal form.php, cioè questi

<input type="text" name="CAPTCHA_code" /> 
<input name="CAPTCHA_id" type="hidden" id="CAPTCHA_id" value="<?php echo $CAPTCHA_id?>" /> 
<input type="submit" name="Submit" value="Invia" />

mi sembra di prelevarli in modo giusto in post.php

if(!isset($_POST['CAPTCHA_code']) OR !isset($_POST['CAPTCHA_id'])) exit; 
$CAPTCHA_code = $_POST['CAPTCHA_code']; 
$CAPTCHA_id = $_POST['CAPTCHA_id']; 
// controlla la validità del $CAPTCHA_id

Si li prelevi i dati inviati dal form tramite l'array post giustamente.

In effetti (come avevo detto) ho dato una lettura troppo veloce al tuo codice, avrei dovuto stare più attento...Il codice di per se è corretto...

e..scusa ma non capisco che tipo di controllo devo fare in  captcha .php

Nessun controllo, già lo fai per $_GET, mi ero confuso tra post.php e captcha.php.

Hai detto che il problema è sulla generazione dell'immagine? O l'immagine viene creata e anche se scrivi il codice corretto questa lo da sbagliato?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Il problema è che l immagine non viene creata, il resto funziona, o perlomeno sembra funzionare, se immetto il codice sbagliato mi viene fuori la scritta captcha non valido, e se immetto manualmente i dati nellla tabella i dati mi vengono cancellati automaticamente

risposto 7 anni fa
gianluca80
X 0 X
Il problema è che l immagine non viene creata, il resto funziona, o perlomeno sembra funzionare, se immetto il codice sbagliato mi viene fuori la scritta captcha non valido, e se immetto manualmente i dati nellla tabella i dati mi vengono cancellati automaticamente

Ok, però non si sa se funziona immettendo il codice corretto...

Comunque se tu richiami direttamente solo l'immagine: http://quello_che_è/CAPTCHA.php?id=un_id

Il browser visualizza correttamente una immagine?

Tu rispetto all'originale hai modificato questa riga per caso?

<img src="/CAPTCHA.php?id=<?php echo "$CAPTCHA_id&chk=$chk"?>" width="110" height="70" />
risposto 7 anni fa
Mario Santagiuliana
X 0 X

No io quella riga non l ho modificata ed non mi visualizza l immagine

risposto 7 anni fa
gianluca80
X 0 X

Ricontrolla il codice di capcha.php, apri due connessione ad un database:

<?php 
$connessione=mysql_connect("localhost", "root","elettronica");
$selezione_db=mysql_select_db("prove", $connessione);
[.......]
// inserisco identificativo e codice nel DB 
// --------------------------------------------------------------- 
mysql_connect('localhost','root','secret'); 
mysql_select_db('CAPTCHA'); 
mysql_query("REPLACE INTO CAPTCHA (CAPTCHA_id,code,`timestamp`) 
[...........]
risposto 7 anni fa
Mario Santagiuliana
X 0 X

ho provato a toglierlo ma non cambia nulla... non so piu cosa fare...

risposto 7 anni fa
gianluca80
X 0 X
ho provato a toglierlo ma non cambia nulla... non so piu cosa fare...

A togliere cosa?

Se fai una modifica del codice sii preciso a indicare cosa hai modificato e magari fornisci direttamente il codice.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

scusami! ho tolto via una connessione al database in captcha.php, ti posto il codice

captcha.php

<?php 
$connessione=mysql_connect("localhost", "root","elettronica");
$selezione_db=mysql_select_db("prove", $connessione);
// controllo se è stato fornito l'identificativo del codice CAPTCHA 
if(!isset($_GET['id'])) exit(); 
// controllo la validità dell'identificativo 
$CAPTCHA_id = $_GET['id']; 
if(!preg_match("/^[a-f0-9]{32}$/",$CAPTCHA_id)) exit(); 
// ricreo il codice di controllo e lo confronto con quello passato via GET 
$sale = "frase super segreta da cambiare a discrezione."; 
$chk = md5($sale . $CAPTCHA_id); 
if($chk != $_GET['chk']) exit(); 
// creo l'immagine 
// --------------------------------------------------------------- 
// le dimensioni dell'immagine 
$size_x = 110; 
$size_y = 70; 
$img = imagecreatetruecolor($size_x,$size_y); 
// alloco un colore per lo sfondo 
$backgroung = imagecolorallocate($img,255, 255, 255); 
// alloco 3 colori per le 3 lettere da decifrare 
// utilizzo il canale alpha per impostare la trasparenza 
$color[] = imagecolorallocatealpha($img,110,110,110,60); 
$color[] = imagecolorallocatealpha($img,3,187,63,60); 
$color[] = imagecolorallocatealpha($img,255,0,0,70); 
// mischio l'ordine dei colori 
shuffle($color); 
// coloro lo sfondo creando un rettangolo 
imagefilledrectangle($img,0,0,$size_x-1,$size_y-1,$backgroung); 
// i caratteri da utilizzare per il codice di sicurezza 
$caratteri = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; 
// inizializzo la variabile che conterrà il codice 
$codice = ''; 
// per ciascuno dei 3 caratteri 
for ($i=0 ; $i < 3 ; $i++) 
{ 
// estraggo un carattere a caso 
$codice .= $caratteri{rand(0,34)}; 
// disegno il carattere 
imagettftext( 
$img, 
50, 
-5+rand(0,10), // rotazione casuale 
($i+0.3)*24, 
60, 
$color[$i], 
'./Segoescb.ttf', // QUESTO E' IL TIPO DI CARATTERE
$codice{$i}); 
} 
// inserisco identificativo e codice nel DB 
// --------------------------------------------------------------- 
mysql_query("REPLACE INTO CAPTCHA (CAPTCHA_id,code,`timestamp`) 
values ('$CAPTCHA_id','$codice',UNIX_TIMESTAMP())"); 
// con prob. impostata da $probabilità cancello i record più vecchi 
$probabilità = 5; // 5% 
if(mt_rand(1,100) <= $probabilità) 
{ 
$durata_CAPTCHA = 60*60; 
mysql_query("DELETE FROM CAPTCHA WHERE `timestamp`<(UNIX_TIMESTAMP()-$durata_CAPTCHA)"); 
} 
// invio l'immagine al browser 
// --------------------------------------------------------------- 
header("Content-type: image/png"); 
imagepng($img); 
?>

su quel mini corso c'era scritto di mettere il carattere prescelto nella stessa cartella di captcha.php, il carattere è Segoescb.ttf io ora ce l ho nella stessa cartella e poi nella cartella fonts di windows, il nome del file è lo stesso ma il tipo di carattere di quel file  è Segoe Script Bold (True Type), è giusto che sia cosi?

risposto 7 anni fa
gianluca80
modificato 7 anni fa
X 0 X

Come vedi qui:

imagettftext(

$img,

50,

-5+rand(0,10), // rotazione casuale

($i+0.3)*24,

60,

$color[$i],

'./Segoescb.ttf', // QUESTO E' IL TIPO DI CARATTERE

$codice{$i});

}

Crei l'immagine e richiami il "tipo di carattere" che da come viene richiamato deve trovarsi nella stessa posizione in cui si trova capcha.php. Stai lavorando su windows?

Se si prova a modificare così:

imagettftext( 
$img, 
50, 
-5+rand(0,10), // rotazione casuale 
($i+0.3)*24, 
60, 
$color[$i], 
'Segoescb.ttf', // QUESTO E' IL TIPO DI CARATTERE <----qui ho modificato
$codice{$i}); 
} [/quote]
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ciao marios! ho trovato il tragico errore.....era semplicemente nel percorso del file immagine, in form.php prima l immagine veniva richiamata cosi:

<img src="/captcha.php?id=<?php echo "$CAPTCHA_id&chk=$chk"?>" width="110" height="70" />

ed ovviamente l immagine aveva il percorso localhost/captcha.php

io invece ho un cartella in localhost chiamata prove dove ho tutte le 'sperimentazioni', e quindi l immagine doveva essere richiamata cosi:

<img src="/prove/captcha.php?id=<?php echo "$CAPTCHA_id&chk=$chk"?>" width="110" height="70" />

Grazie Marios

e pero possa essere d aiuto un po a tutti....

 :D :bye: :bye:

risposto 7 anni fa
gianluca80
X 0 X

Bene che hai risolto...io ti avevo chiesto se richiamando la pagina lo script funzionava:

Comunque se tu richiami direttamente solo l'immagine: http://quello_che_è/CAPTCHA.php?id=un_id

Il browser visualizza correttamente una immagine?

Mi sembrava che avessi fatto capire che non funzionava:

No io quella riga non l ho modificata ed non mi visualizza l immagine

Il tuo browser ti doveva indicare una pagina inesistente se davi un indirizzo sbagliato...sbaglio? Se no colgo l'occasione per dire che è sempre bene indicare tutti i messaggi di errore che nascono.

Ciao

risposto 7 anni fa
Mario Santagiuliana
modificato 7 anni fa
X 0 X

era solo l immagine che errava di percorso, le pagine in sè stesse c'erano.....bianche ovviamente...hehehe tranne la pagina form.php che compariva la scritta 'Inserisci i caratteri' poi c' era il quadratino bianco dove doveva esserci l immagine ed il form d inserimento, si si è vero tu mi hai chiesto di richiamare solo l immagine infatti non funzionava perche era sbasgliato il suo percorso

risposto 7 anni fa
gianluca80
X 0 X
è vero tu mi hai chiesto di richiamare solo l immagine infatti non funzionava perche era sbasgliato il suo percorso

E non avevi un errore del tipo 404?

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

no

risposto 7 anni fa
gianluca80
X 0 X

 :o :o

Nessun errore?

Il tuo server web lo hai configurato correttamente?

P.S. stiamo andando ot e forse non è bene continuare. Se hai un server in produzione e hai questo problema forse è il caso aprire una discussione apposite  ;) ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda