CAPTCHA e PHP?

Scusate per le tecniche di CAPTCHA che versione di PHP deve essere utilizzata?

inviato 8 anni fa
EKELON77
X 0 X

dipende dallo script che vuoi utilizzare...

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Quello su cui hai scritto l'articolo...!!! O0

risposto 8 anni fa
EKELON77
X 0 X

Io l'ho provato con PHP 5 ma non dovresti avere problemi con PHP 4

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Purtroppo qualche problema: Quando attivo l'estensione CURL dal PHP.ini e rilancio il server mi segnala questi due errori: Popup dell'applicazione: php.exe - Impossibile individuare un componente : Impossibile avviare l'applicazione specificata. SSLEAY32.dll non è stato trovato. Una nuova installazione dell'applicazione potrebbe risolvere il problema. e Warning : Unknown(): Unable to load dynamic library '/pdrive/php-4.4.0/extensions\php_curl.dll' - Impossibile trovare il modulo specificato. , per le altre estenzioni funziona  O0, che cos'è che mi è sfuggito?

risposto 8 anni fa
EKELON77
X 0 X

L'estensione php_curl.dll viene usata dal primo script proposto che serve a mostrare come è possibile generare spam in automatico. Quindi quello script NON SERVE a creare l'immagine CAPTCHA e quindi puoi anche cancellarlo.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Quale dei tre file devo cancellare:

  • form
  • post
  • captcha

?

risposto 8 anni fa
EKELON77
X 0 X

il primo presentato nell'articolo (non credo sia uno di quelli che hai citato)

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Scusa gianni ma non mi visualizza l'immagine nn capisco dove è  che sbaglioi:

<?php
// 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
// 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:3307','root','') or die(mysql_error());
      mysql_select_db('CAPTCHA') 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_query("DELETE FROM CAPTCHA
               WHERE CAPTCHA_id = '$CAPTCHA_id' OR
               `timestamp` < (UNIX_TIMESTAMP() - $durata_CAPTCHA)");
}
?>
<?php
// 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],
            './VeraMono.ttf',
            $codice{$i});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('localhost:3307','root','');
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);
?>
risposto 8 anni fa
EKELON77
X 0 X

E' lo stesso script che ho riportato nell'articolo o hai effettuato delle modifiche?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

E' lo stesso, ma ho cambianto la porta di connessione al db; ma forse non ho messo il codice PHP nei giusti files oppure non li richiamo correttamente?  O0

risposto 8 anni fa
EKELON77
X 0 X

Scusa gianni ma non mi visualizza l'immagine nn capisco dove è  che sbaglioi:

<?php
// 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
// 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:3307','root','') or die(mysql_error());
      mysql_select_db('CAPTCHA') 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_query("DELETE FROM CAPTCHA
               WHERE CAPTCHA_id = '$CAPTCHA_id' OR
               `timestamp` < (UNIX_TIMESTAMP() - $durata_CAPTCHA)");
}
?>
<?php
// 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],
            './VeraMono.ttf',
            $codice{$i});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('localhost:3307','root','');
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);
?>

Ho risolto Non erano attive le estensioni GD2, ma adesso non riesco a mettere questo codice:

$color2[] = imagecolorallocate($img,180+rand(-10,10),210+rand(-10,10),240+rand(-10,10));
$color2[] = imagecolorallocate($img,210+rand(-10,10),240+rand(-10,10),180+rand(-10,10));
$color2[] = imagecolorallocate($img,240+rand(-10,10),180+rand(-10,10),210+rand(-10,10));

for ($j=0 ; $j&lt;100 ; $j++)
{
   // disegno il carattere
   imagettftext(
                   $img,
                   11,
                   rand(0,359), // rotazione casuale
                   rand(0,$size_x),
                   rand(0,$size_y),
                   $color2[$j % 3],
                   'Verdana.ttf',
                   $caratteri{rand(0,34)});
}

mi da il seguente errore: Parse error: parse error, unexpected ';', expecting ')' in E:\pdrive\www\captcha\captcha.php on line 68  O0

risposto 8 anni fa
EKELON77
X 0 X

vai alla riga 68 dello scipt e controlla di non aver dimenticato di chiudere una parentesi tonda

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ho preso il tuo codice e l'ho copiato e nn penso di aver dimenticato qualcosa nella CTRL+C, comunque verificherò :wallbash:

risposto 8 anni fa
EKELON77
X 0 X

vai alla riga 68 dello scipt e controlla di non aver dimenticato di chiudere una parentesi tonda

 :bye:

Correggo quello detto in precedenza, mettiamo che il codice sia OK, forse è stato inserito in una parte sbagliata del file captcha.php; perchè ho analizzato il pezzo di codice con Notepad++ e non mi rileva parentesi non chiuse?

risposto 8 anni fa
EKELON77
X 0 X

riporta per intero lo script che genera l'errore

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
<?php
// 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],
            'Verdana.ttf',
            $codice{$i});
}


$color2[] = imagecolorallocate($img,180+rand(-10,10),210+rand(-10,10),240+rand(-10,10));
$color2[] = imagecolorallocate($img,210+rand(-10,10),240+rand(-10,10),180+rand(-10,10));
$color2[] = imagecolorallocate($img,240+rand(-10,10),180+rand(-10,10),210+rand(-10,10));


for ($j=0 ; $j&lt;100 ; $j++)
{
   // disegno il carattere
   imagettftext(
                   $img,
                   11,
                   rand(0,359), // rotazione casuale
                   rand(0,$size_x),
                   rand(0,$size_y),
                   $color2[$j % 3],
                   './VeraMono.ttf',
                   $caratteri{rand(0,34)});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('localhost:3307','root','');
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);
?>

Questo è l'intero script del file captcha.php  :bye:

risposto 8 anni fa
EKELON77
X 0 X

l'ho provato per curiosita' non mi da errori ma non genera l'img

http://www.black.helloweb.eu/form.php

risposto 8 anni fa
blackeyes
modificato 8 anni fa
X 0 X

A me l'mmagine la genera, forse non attivato la libreria GD? O0

risposto 8 anni fa
EKELON77
X 0 X
A me l'mmagine la genera, forse non attivato la libreria GD? O0

Si sono attive, ho provato questo e funziona

<?
// istanzio una nuova immagine di dimensioni x=200 e y=300
$immagine = imageCreate(200, 300);
// assegno il primo colore, questo colore sarà anche lo sfondo dell'immagine
$bianco = imageColorAllocate($immagine, 255, 255, 255);
// assegno un secondo colore, da utilizzare per colorare il testo
$nero = imageColorAllocate($immagine, 0, 0, 0);
// visualizzo il testo 
imageString($immagine, 2, 100, 100, "Ciao a tutti", $nero);

// imposto correttamente gli header
header("Content-type: image/png");
// invio l'output come immagine PNG
imagePng($immagine);

// libero la memoria
imageDestroy($immagine);
?>
risposto 8 anni fa
blackeyes
X 0 X

ho anche verificato di aver messo il font corretto in root, è veramente strano

risposto 8 anni fa
blackeyes
X 0 X

ke errore ti da ? :)

risposto 8 anni fa
EKELON77
X 0 X

non mi da errori ma non genera l'img se vuoi provare è qui

http://www.black.helloweb.eu/form.php

risposto 8 anni fa
blackeyes
X 0 X

Se è un server Linux devi avere permessi 777 sulla cartella dove viene eseguito lo script, per creare l'immagine. :bye:

risposto 8 anni fa
EKELON77
X 0 X

ho provato a mettere tutto in una dir con 777 ma non cambia nulla :(

risposto 8 anni fa
blackeyes
X 0 X

Non so che dirti, mi sembra strano.

risposto 8 anni fa
EKELON77
X 0 X

anche a me ma tra le altre cose non ho nemmeno modificato lo script a parte i dati del db e il font che ho inserito nella cartella

risposto 8 anni fa
blackeyes
X 0 X
Non so che dirti, mi sembra strano.

bah adesso e' diventata una questione di principio  8)

ecco lo script

<?php 
// 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],
            '/1/comic.ttf',
            $codice{$i});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('++++++','++++','+++++');
mysql_select_db('black_db1');

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);
?>

allora ho visto che in alcuni script vi ee' la necessita di inserire nella dir dello script una jpg vuota che funziona da base per cosi dire, eccone un esempio che funziona regolarmente <?     $numero = 6;     // numero caratteri da usare per il codice

    $data = date("Y-m-d H:i:s");     $codice = substr(md5($data),10,$numero);     // ho generato un codice casuale legato all'orario     $_SESSION['codice'] = $codice;     // lo memorizzo per  poterlo poi controllare

    // controllo se la libreria è attiva     if (!function_exists('gd_info')) print "Occorre attivare la libreria grafica";     else {         header("Content-type: image/png");        $percorso = "codice.jpg";         $image = ImageCreatefromJPEG($percorso);         $green = imagecolorallocate($image,51,104,51);         ImageString($image, 5, 35, 12, $codice, $green);         Imagepng($image);         ImageDestroy($image);     }

?> ma non mi sembra questo il caso, perche nello script di gianni l'immagine viene creata da zero

risposto 8 anni fa
blackeyes
X 0 X

Non so come aiutarti a me funziona solo quando levo il blocco di codice per lo sfondo delle lettere.  :tichedoff:

Mi dispiace  :(

risposto 8 anni fa
EKELON77
X 0 X

grazie cmq

risposto 8 anni fa
blackeyes
X 0 X

Scusate adesso vedo le lettere ma mi da i seguenti errori:

1) Se il campo code è vuoto e premo il bottone mi esce il seguente errore: $CAPTCHA_code non valido

Warning: mysql_query(): Can't connect to MySQL server on 'localhost' (10061) in E:\pdrive\www\captcha\post.php on line 64

Warning: mysql_query(): A link to the server could not be established in E:\pdrive\www\captcha\post.php on line 64  che la line 64 corrisponde a    `timestamp` < (CURRENT_TIMESTAMP() - $durata_CAPTCHA)");

2) Se inserisco le lettere in modo corretto mi  esce $CAPTCHA_code errato

Come mai accade questo?

P.S.: La funzione timestamp è stata modificata per gli ambienti windows. :crazy:

risposto 8 anni fa
EKELON77
X 0 X

ma nello script hai fatto la mysql_connect?

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
      mysql_connect('localhost:3307','root','') or die(mysql_error());
      mysql_select_db('captcha') or die(mysql_error());

si la faccio alla riga  35 e 36. O0

Non capisco perchè però se inserisco il codice corretto non gli và bene.

risposto 8 anni fa
EKELON77
X 0 X

mi sembra strano...

ti ho chiesto se eseguivi la connessione perché gli errori che ricevi parlano chiaramente di un problema nella connessione a MySQL:

Can't connect to MySQL server on 'localhost'

Il problema è lì

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

 O0 Infatti la connessione viene eseguita dopo che appare la display,  deve avvenire prima alla testa dello script post.php; quello che ancora non riesco a risolvere è lo sfondo...!!! ;)

risposto 8 anni fa
EKELON77
X 0 X
O0 Infatti la connessione viene eseguita dopo che appare la display,  deve avvenire prima alla testa dello script post.php; quello che ancora non riesco a risolvere è lo sfondo...!!! ;)

Io ho risolto con un altro script se vuoi te lo mando

risposto 8 anni fa
blackeyes
X 0 X

Grazie,

me lo puoi mandare.

P.S.: Comunque mi pui spiegare cosa hai risolto e come?  O0 :bye:

risposto 8 anni fa
EKELON77
X 0 X

CON lo script trattato nell'articolo non riuscivo in alcun modo a generare l'immagine, e siccome non capivo perchè ho girato un po' in rete e  ne ho trovato un altro che non mi da problemi

te lo ho inviato via mail

risposto 8 anni fa
blackeyes
X 0 X

stesso problema di tutti.... potete postare o inviare lo script via email... grazie

risposto 8 anni fa
Falco72
X 0 X
<?php
// 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);
//Lettere di sfondo
$color2[] = imagecolorallocate($img,180+rand(-10,10),210+rand(-10,10),240+rand(-10,10));
$color2[] = imagecolorallocate($img,210+rand(-10,10),240+rand(-10,10),180+rand(-10,10));
$color2[] = imagecolorallocate($img,240+rand(-10,10),180+rand(-10,10),210+rand(-10,10));

// 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],
            'Verdana.ttf',
            $codice{$i});
}


for ($j=0 ; > 100 ; $j++)
{
   // disegno il carattere
   imagettftext(
                   $img,
                   11,
                   rand(0,359), // rotazione casuale
                   rand(0,$size_x),
                   rand(0,$size_y),
                   $color2[$j % 3],
                   'Verdana.ttf',
                   $caratteri{rand(0,34)});
}

// inserisco identificativo e codice nel DB
// ---------------------------------------------------------------
mysql_connect('localhost:3307','root','');
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);
?>
Questo è l'intero script del file captcha.php  :bye:

Vi ho postato il codice funzionante del immagine captcha, comunque adesso

vorrei implementare lo script con più lettere e fare un array di più font come posso procedere?

risposto 8 anni fa
EKELON77
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda