Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/05/2009, 09:40
Avatar de José Molina
José Molina
 
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 23 años, 2 meses
Puntos: 1
Respuesta: Variables de Sesion en Capcha

Saludos

Tienes razón, como el tema de los capcha es bastante común hoy día y todos trabajan prácticamente igual, asumi que no era necesario, mil disculpas.

Tratare de dejar un poco más de detalle esta vez:

Tengo un archivo llamado kcapcha.php el cual contiene:

Código PHP:
class KCAPTCHA{
function 
KCAPTCHA(){
   require(
dirname(__FILE__).'/kcaptcha_config.php');
   
$fonts=array();
   
$fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir;
   if (
$handle opendir($fontsdir_absolute)) {
       while (
false !== ($file readdir($handle))) {
           if (
preg_match('/\.png$/i'$file)) {
                          
$fonts[]=$fontsdir_absolute.'/'.$file;
           }
       }
       
closedir($handle);
   }

   
$alphabet_length=strlen($alphabet);

   while(
true){
       while(
true){
            
$this->keystring='';
            for(
$i=0;$i<$length;$i++){ 
              
$this->keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
            }
            if(!
preg_match('/cp|cb|ck|c6|c9/',$this->keystring)) break;
       }

       
$font_file=$fonts[mt_rand(0,count($fonts)-1)];
       
$font=imagecreatefrompng($font_file);
       
imagealphablending($fontfalse);
       
imagesavealpha($fonttrue);
       
$black=imagecolorallocate($font,0,0,0);
       
$fontfile_width=imagesx($font);
       
$fontfile_height=imagesy($font)-1;
       
$font_metrics=array();
       
$symbol=0;
       
$reading_symbol=false;

       for(
$i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
          
$transparent = (imagecolorat($font$i0) >> 24) == 127;
          if(!
$reading_symbol && !$transparent){             zfont_metrics[$alphabet{$symbol}]=array('start'=>$i);
             
$reading_symbol=true;
             continue;
          }

           if(
$reading_symbol && $transparent){
              
$font_metrics[$alphabet{$symbol}]['end']=$i;
              
$reading_symbol=false;
              
$symbol++;
              continue;
           }
}

       
$img=imagecreatetruecolor($width,$height);
       
$white=imagecolorallocate($img,255,255,255);
       
$black=imagecolorallocate($img,0,0,0);

       
imagefilledrectangle ($img,0,0,$width-1,$height-1,$white);

       
$x=1;
       for(
$i=0;$i<$length;$i++){
           
$m=$font_metrics[$this->keystring{$i}];

           
$y=mt_rand(-$fluctuation_amplitude$fluctuation_amplitude)+($height-$fontfile_height)/2+2;
           if(
$no_spaces){
                
$shift=0;
                if(
$i>0){
                     
$shift=1000;
                         for(
$sy=1;$sy<$fontfile_height-15;$sy+=2){
                                for(
$sx=$m['start']-1;$sx<$m['end'];$sx++){
                                      
$rgb=imagecolorat($font$sx$sy);
                                      
$opacity=$rgb>>24;
                                      if(
$opacity<127){
                                         
$left=$sx-$m['start']+$x;
                                         
$py=$sy+$y;
                                         for(
$px=min($left,$width-1);$px>$left-15 && $px>=0;$px--){
                                            
$color=imagecolorat($img$px$py) & 0xff;
                                            if(
$color+$opacity<190){
                                               if(
$shift>$left-$px){                                     
                                                   
$shift=$left-$px;
                                               }
                                               break;
                                               }
                                               }
                                                break;                                                }
                                             }
                                        }
                                    }
                                             }else{
                                               
$shift=1;
                                               }
                             
imagecopy($img,$font,$x-$shift,$y,$m['start'],1,$m['end']-$m['start'],$fontfile_height);
                              
$x+=$m['end']-$m['start']-$shift;
                               }
                               if(
$x<$width-10) break; // fit in canvas
               
}
               
$center=$x/2;

              
$img2=imagecreatetruecolor($width$height+($show_credits?'12':0));
               
$foreground=imagecolorallocate($img2$foreground_color[0], $foreground_color[1], $foreground_color[2]);
               
$background=imagecolorallocate($img2$background_color[0], $background_color[1], $background_color[2]);
               
imagefilledrectangle($img20$height$width-1$height+12$foreground);
               
$credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits;
               
imagestring($img22$width/2-ImageFontWidth(2)*strlen($credits)/2$height-2$credits$background);

               
$rand1=mt_rand(700000,1000000)/10000000;
               
$rand2=mt_rand(700000,1000000)/10000000;
               
$rand3=mt_rand(700000,1000000)/10000000;
               
$rand4=mt_rand(700000,1000000)/10000000;
               
// phases
               
$rand5=mt_rand(0,3141592)/1000000;
               
$rand6=mt_rand(0,3141592)/1000000;
               
$rand7=mt_rand(0,3141592)/1000000;
               
$rand8=mt_rand(0,3141592)/1000000;
               
// amplitudes
               
$rand9=mt_rand(300,420)/110;
               
$rand10=mt_rand(300,450)/110;

               for(
$x=0;$x<$width;$x++){
                   for(
$y=0;$y<$height;$y++){
                        
$sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
                         
$sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;

                           if(
$sx<|| $sy<|| $sx>=$width-|| $sy>=$height-1){
                              
$color=255;
                              
$color_x=255;
                              
$color_y=255;
                              
$color_xy=255;
                           }else{
                              
$color=imagecolorat($img$sx$sy) & 0xFF;
                              
$color_x=imagecolorat($img$sx+1$sy) & 0xFF;
                              
$color_y=imagecolorat($img$sx$sy+1) & 0xFF;
                              
$color_xy=imagecolorat($img$sx+1$sy+1) & 0xFF;
                           }

                           if(
$color==&& $color_x==&& $color_y==&& $color_xy==0){
                              
$newred=$foreground_color[0];
                              
$newgreen=$foreground_color[1];
                              
$newblue=$foreground_color[2];
                           }else if(
$color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
                              
$newred=$background_color[0];
                              
$newgreen=$background_color[1];
                              
$newblue=$background_color[2];
                           }else{
                              
$frsx=$sx-floor($sx);
                              
$frsy=$sy-floor($sy);
                              
$frsx1=1-$frsx;
                              
$frsy1=1-$frsy;
                              
$newcolor=(
                                  
$color*$frsx1*$frsy1+
                                  
$color_x*$frsx*$frsy1+
                                  
$color_y*$frsx1*$frsy+
                                  
$color_xy*$frsx*$frsy);

                                  if(
$newcolor>255$newcolor=255;
                                  
$newcolor=$newcolor/255;
                                  
$newcolor0=1-$newcolor;
                                                                             
$newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];                                             $newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
                                                                       
$newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
                                               }

                                               
imagesetpixel($img2$x$yimagecolorallocate($img2,$newred,$newgreen,$newblue));
                               }
               }
$_SESSION['captcha_keystring'] = $this->keystring;
                                               
   if(
function_exists("imagejpeg")){
       
header("Content-Type: image/jpeg");
       
imagejpeg($img2null$jpeg_quality);
   }else if(
function_exists("imagegif")){
       
header("Content-Type: image/gif");
       
imagegif($img2);
   }else if(
function_exists("imagepng")){
       
header("Content-Type: image/x-png");
       
imagepng($img2);
   }                               
}

    function 
getKeyString(){
       return 
$this->keystring;
    }

Archivo index.php:
include('kcaptcha.php');

$captcha = new KCAPTCHA();
echo $_SESSION['captcha_keystring'];

archivo prueba.php:
<img src=”index.php”>


La imagen se ve por pantalla, pero la validación de la sesion no funciona. Si en esa misma página de prueba coloco un echo de la sesion que se crea dentro del archivo kcapcha.php no aparece nada por pantalla de la sesion, aún cuando la imagen si aparece y cambia con cada recarga de la página.

Dicha sesion es la que se esta creando en el archivo capcha.php. El mismo archivo que es colocado como fuente de la etiqueta < img > del archivo prueba.

Hace falta configurar algo extra en el servidor para que estas variables de sesion funcionen correctamente cuando se manejan los archivos de esta forma??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.