Distruggere una Sessione ?!?!?

Ciao

non so se il titolo in questione sia adeguato al problema che vi voglio sottoporre perchè ancora non ho capito quale sia l'inghippo.

In pratica ho una pagina (form) per l'inserimento di un Captcha, che riceve l'immagine tramite un'altra pagina (Code.php) che utilizza libreira GD. il numero generato viene passato tramite questo codice:

session_start();
$_SESSION['securityCode'] = $code;

Il controllo di esatto inserimento viene poi "processato" da un'altra pagina (result.php).

OK. Adesso al primo avvio della pagina Captcha che io inserisca un codice giusto o errato tutto funziona perfettamente, In pratica se il codice è corretto proseguo con la mia eseguzione, se invece è errato faccio un redirect nuovamente alla pagina Captcha.......e qui arriva il problema, perchè a questo punto qualsiasi cosa io inserisca come codice, sia giusta che sbagliata me la considera sempre come ERRATA.

Ho voluto precisare questa cosa, perchè credo sia dovuto ad una continua memorizzazione della variabile $_SESSION, ma con il debugger non sono in grado di tracciarla perchè dopo la prima eseguzione il debug viene terminato.

Eppure ho distrutto con vari metodi la session (con Unset o con Destroy e, ultimo tra questi nella pagina Result.php (se codice errato) con questo codice:

if (($string == $userstring) && (strlen($string) > 4)) {
    header("Location: $success");
    exit();
} else {
    $string="";
    $userstring="";
    $_SESSION=array();
    header("Location: $failure");
    exit();
}

Mi rendo conto che non posso postarvi tutto l'intero codice, ma se vi viene in mente un possibile suggerimento da poter tentare in base a quanto detto, vi ringrazio.

Un saluto

Paolo

EDIT: (per Mario)

Questo è il form:

<form action="result.php" METHOD="POST">
      <p><img src="securityCode.php" border="1">  </p>
      <p>Per favore inserisci il codice mostrato qui sopra e premi <strong>Submit.</strong></p>
      <br>
        <input MAXLENGTH=8 SIZE=8 name="userstring" type="text" value="">
        <br><br>
        <input type="submit" value="Submit">
      </p>
    </form>

ti metto anche il Resul.php a cui faccio invio

include "settings.php";
session_start();
$string = strtoupper($_SESSION['securityCode']);
$userstring = strtoupper($_POST['userstring']);

Ti ricordo che il codice generato viene passato con:

session_start();
$_SESSION['securityCode'] = $code;

Grazie

if (($string == $userstring) && (strlen($string) > 4)) {
    header("Location: $success");
    exit();
} else {
    $string="";     //prova
    $userstring="";        //prova
    //$_SESSION=array();  usato per prova
    unset($_SESSION['securityCode']);
    header("Location: $failure");
    exit();
}
?>

Generatore Code

<?php

$width  = 120;
$height =  40;
$length =   5;

$baseList = '0123456789abcdfghjkmnpqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$code    = "";
$counter = 0;

$image = @imagecreate($width, $height) or die('Cannot initialize GD!');

for( $i=0; $i<10; $i++ ) {
   imageline($image,
         mt_rand(0,$width), mt_rand(0,$height),
         mt_rand(0,$width), mt_rand(0,$height),
         imagecolorallocate($image, mt_rand(150,255), mt_rand(150,255), mt_rand(150,255)));
}

for( $i=0, $x=0; $i<$length; $i++ ) {
   $actChar = substr($baseList, rand(0, strlen($baseList)-1), 1);
   $x += 10 + mt_rand(0,10);
   imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar,
      imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155)));
   $code .= strtolower($actChar);
}

session_start();
$_SESSION['securityCode'] = $code;
   
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);



?>
inviato 4 anni fa
antares
modificato 4 anni fa
Mario Santagiuliana
Hai provato fa fare il dump della variabile $_SESSION per verificare se il problema è li? Come fai l'unset?Mario Santagiuliana 4 anni fa
Senti Mario è parecchio tempo che non programmo, quindi se mi vuoi spiegare meglio cosa fare te ne sarei grato.Per l'Unset ho fatto cosi:unset($_SESSION['securityCode']); inoltre ho fatto una echo della $_SESSION['securityCode']. Al primo giro mi viene stampato il valore generato, al secondo giro non stampa più nulla. Ho fatto pure una If per stampare qualcosa che mi avvisasse se la variabile ad esempio:$pippo=$_SESSION['securityCode'] contenesse "", ma ignora pure questo.....non ne vengo a capo :)Grazie Mario. Paoloantares 4 anni fa
Puoi modificare la tua richiesta inserendo il codice che esegue il controllo del form captcha compilato dall'utente?Mario Santagiuliana 4 anni fa
Grazie Mario, ho modificato il post inserendo una parte di codice.antares 4 anni fa
La domanda è ancora povera di informazioni. La variabile $code quando e come viene valorizzata? Prova a fare un banale echo sulle variabili $string e $userstring, vedi come variano di volta in volta...Mario Santagiuliana 4 anni fa
Mario io ho messo delle Echo, ma come avevo detto quando vengo re-indirizzato alla pagina del captcha stranamente al secondo giro non riesco più a leggerne il contenuto.(ma non è che il problema sta nel reindirizzamento?) Comunque senti, alla fine ho inserito anche la generazione del codice nel mio Post. Prima che qualcuno sollevi critiche ci tengo a precisare che è un codice esistente che sto cercando di adattare alle mie esigenze. Se riesci a capire cosa accade bene, altrimenti Mario lascia perdere, sei stato gentilissimo ma approfittare di te mi sembra troppo : Di nuovo Grazie Mario. Paoloantares 4 anni fa
X 0 X

Ora che ci sono tutti i file credo di aver capito dove sta il problema. Tu fai l'unset della sessione nel file di controllo, non lo fai di volta in volta quando generi il tuo captcha (da qui la mia richiesta di vedere quel file). In questa parte di codice:

if (($string == $userstring) && (strlen($string) > 4)) {
    header("Location: $success");
    exit();
} else {

dove avviene il redirect in caso di successo non hai inserito l'unset alla sessione. Prova con uno di questi due sistemi:

1) nel file securityCode.php prova ad impostare all'inizio del file la variabile di sessione a "niente":

$_SESSION['securityCode'] = '';

Poi inserisci il resto del tuo codice. Ricorda di inserire il session_start all'inizio di tutto.

2) fai l'unset anche prima di un redirect in caso il codice inserito sia corretto.

risposto 4 anni fa
Mario Santagiuliana
Mi dispiace Mario, ma non funziona ugualmente, anzi a mettere per esempio la session_start() sulla pagina del Code ne impedisce la generazione.Poi ho scoperto anche che mentre al primo giro se si sbaglia l'inserimento captcha si viene mandati alla pagina failure.php, nel secondo giro invece punta alla pagina failure.html ma dove cavolo è questo file? E' stato rinominato in php e ho provveduto a fare sparire qualsiasi file Failure.html dall'HD. I riferimenti sul codice sono tutti giusti, vabbeh Mario, come non detto, sempre grazie, mi metterò con pazienza. se ti viene in mente qualcosa...:)antares 4 anni fa
Il redirect in caso di fallimento lo fai così: header("Location: $failure"); devi controllare la variabile $failure.Mario Santagiuliana 4 anni fa
Mario credo di aver risolto :)Avendo la connessione sempre attiva al primo giro l'editor funzionave in "locale", al secondo giro (non mi chiedere il motivo perchè non l'ho scoperto) si connetteva al server dove ovviamente c'erano i file che avevo caricato per prova e che ovviamente non venivano mai modificati, ecco perchè al secondo giro non mi stampava le ECHO sulle variabili....Assurdo:) Comunque togliendo la connessione sembra funzionare tutto, adesso lo proverò online :) Mario grazie davvero di tutto...caffè pagato :) Paoloantares 4 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda