[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: captcha
JOIN
здравствуйте такая вот беда! создал защиту capcha в эксплорере работает в смысле картинка появляется а в других браузерах не появляется как это объяснить может что-то упустил ?
код
PHP
session_start();
                    
session_register('securityCode');
                  
                    echo 
"<br><form method='post'>
                    <TABLE WIDTH=60% BORDER=1 ALIGN=left>
                    <TR><TD><left>Введите имя: <font color=red>*</font></left></td>
                        <TD><left><INPUT TYPE='text' name='n1' class='ss' VALUE='"
.$_REQUEST["n1"]."'></left></TD></TR>  
                    <TR><TD><left>Введите пароль <font color=red>*</font></left></TD>
                        <TD><left><INPUT TYPE='password' name='n2' class='ss' VALUE='"
.$_REQUEST["n2"]."'></left></TD></TR>
                    <TR><TD colspan=2>"
;
                       
                  if(isset(
$HTTP_POST_VARS['securityCode']) && (isset($HTTP_SESSION_VARS['securityCode']) || isset($_SESSION['securityCode']))){
                    if(
strtolower($HTTP_POST_VARS['securityCode'])==$HTTP_SESSION_VARS['securityCode'] || strtolower($HTTP_POST_VARS['securityCode'])==$_SESSION['securityCode']){
                        if(
$_REQUEST["n1"]!="" && $_REQUEST["n2"]!="" && $HTTP_POST_VARS['securityCode']!=="" && $HTTP_SESSION_VARS['securityCode']!=="" && $_SESSION['securityCode']!=="")
                        {                 
                        
?><center><font color=green><br>Защитный код принят<br><a href='index2.php?menu=allcat&n1=<? echo $_REQUEST["n1"]?>&n2=<? echo $_REQUEST["n2"]?>'> Далее >> </a></font></center><br>
                        <?
                        
}  else 
                        echo 
"<br><center><font color=red><br><a href='index2.php'>Введите имя и пароль</font><br><br></a><br></center>";
                    }else{
                      echo 
"<br><center><font color=red>Неверный защитный код!</font><br><a href='index2.php'>Попробовать еще раз<br><br></a></center>";
                    }    
                   }               
                else{
                
?>
                 <center>
                 <br> Введите этот защитный код<font color=red>*</font> <br>  <br> 
                  <input type="text" name="securityCode" title="Введите код, который изображен на картинке">
                  <br><img src='code.php?<?=doubleval(microtime());?>' width=200 height=70 vspace=10><br>  
               </center>
               <?PHP
                  
}
              
                echo 
"</TD></TR>                                                  
                    <TR><TD colspan=2><center><input type='submit' class='bluebutton' value='  Регистрация  '></center></TD></TR>      
                    </TABLE>"
;
                    echo 
"</form>";

код code
PHP
<?PHP
 
/****************************************************************************************************
 *****************************************************************************************************
 **                                                                                                 **
 **                               Скрипт генерации случайных изображений                            **
 **                                           Версия: 1.1                                           **
 **                                                                                                 **
 **                                      Автор: Афанасьев Артём                                     ** 
 **                                    E-mail:triall2002@mail.ru                                    **
 **                                            ICQ:1522817                                          **
 **                                          Дата: 06.07.2006                                       **
 **                                                                                                 **
 *****************************************************************************************************
 ****************************************************************************************************/
 
 #####################################################################################################
 #  Настройки
 #####################################################################################################
 
 
$C_IMAGE_TYPE 'PNG';                             //Возможные форматы: GIF, JPEG, PNG
 
$C_WIDTH 120;                                    //Ширина изображения
 
$C_HEIGHT 60;                                    //Высота изображения
 
$C_NUM_GENSIGN 5;                                //Количество символов, которые нужно набрать
 
$path_fonts './fonts/';                          //Путь к шрифтам
 
 #####################################################################################################
 # Принемаем переменные
 #####################################################################################################
 
 
$EXT strtoupper($HTTP_GET_VARS['ext']);
 if(
$EXT=='GIF' || $EXT=='JPEG' || $EXT=='PNG'$C_IMAGE_TYPE $EXT;
 if(
is_numeric($HTTP_GET_VARS['width']) && $HTTP_GET_VARS['width']>100 && $HTTP_GET_VARS['width']<500$C_WIDTH $HTTP_GET_VARS['width'];
 if(
is_numeric($HTTP_GET_VARS['height']) && $HTTP_GET_VARS['height']>100 && $HTTP_GET_VARS['height']<500$C_HEIGHT $HTTP_GET_VARS['height'];
 if(
is_numeric($HTTP_GET_VARS['qty']) && $HTTP_GET_VARS['qty']>&& $HTTP_GET_VARS['qty']<10$C_NUM_GENSIGN $HTTP_GET_VARS['qty'];
 
 
#####################################################################################################
 #  Ядро
 #####################################################################################################
 
dl ('php_gd2.dll'); 
 
session_start();
 
session_register('securityCode');
 
 
$C_FONT_SIZE intval($C_HEIGHT/(($C_HEIGHT/$C_WIDTH)*5));
 
$C_NUM_SIGN intval(($C_WIDTH*$C_HEIGHT)/150);
 
 
$CODE = array();
 
$LETTERS = array('a','b','c','d','e','f','g','h','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','8','9');
 
$FIGURES = array('50','70','90','110','130','150','170','190','210');
 
 
//Создаем полотно
 
$src imagecreatetruecolor($C_WIDTH,$C_HEIGHT);
 
 
//Заливаем фон
 
$fon imagecolorallocate($src,255,255,255);
 
imagefill($src,0,0,$fon);
 
 
//Загрузка шрифтов
 
$FONTS = array();
 
$dir=opendir($path_fonts);
 while(
$fontName readdir($dir)){
   if(
$fontName != "." && $fontName != ".."){
     if(
strtolower(strrchr($fontName,'.'))=='.ttf'$FONTS[] = $path_fonts.$fontName;
   }
 }
 
closedir($dir);
 
 
//Если есть шрифты
 
if(sizeof($FONTS)>0){
   
//Заливаем полотно буковками
   
for($i=0;$i<$C_NUM_SIGN;$i++){
     
$h 1;
     
$color imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100); 
     
$font $FONTS[rand(0,sizeof($FONTS)-1)];
     
$letter $LETTERS[rand(0,sizeof($LETTERS)-1)];
     
$size rand($C_FONT_SIZE-2,$C_FONT_SIZE+2);
     
$angle rand(0,60);
     if(
$h == rand(1,2)) $angle rand(360,300);
     
//Пишем
     
imagettftext($src,$size,$angle,rand($C_WIDTH*0.1,$C_WIDTH-$C_WIDTH*0.1),rand($C_HEIGHT*0.2,$C_HEIGHT),$color,$font,$letter);
   }
 
   
//Заливаем основными буковками
   
for($i=0;$i<$C_NUM_GENSIGN;$i++){
     
//Ориентир
     
$h 1;
     
//Рисуем
     
$color imagecolorallocatealpha($src,$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],rand(10,30)); 
     
$font $FONTS[rand(0,sizeof($FONTS)-1)];
     
$letter $LETTERS[rand(0,sizeof($LETTERS)-1)];
     
$size rand($C_FONT_SIZE*2.1-1,$C_FONT_SIZE*2.1+1);
     
$x = (empty($x)) ? $C_WIDTH*0.08 $x + ($C_WIDTH*0.8)/$C_NUM_GENSIGN+rand(0,$C_WIDTH*0.01);
     
$y = ($h == rand(1,2)) ? (($C_HEIGHT*1.15*3)/4) + rand(0,$C_HEIGHT*0.02) : (($C_HEIGHT*1.15*3)/4) - rand(0,$C_HEIGHT*0.02);
     
$angle rand(5,20);
     
//Запоминаем
     
$CODE[] = $letter;
     if(
$h == rand(0,10)) $letter strtoupper($letter);
     if(
$h == rand(1,2)) $angle rand(355,340);
     
//Пишем
     
imagettftext($src,$size,$angle,$x,$y,$color,$font,$letter);
   }
   
 
//Если нет шрифтов
 
}else{
   
//Заливаем точками
   
for($x=0;$x<$C_WIDTH;$x++){
     for(
$i=0;$i<($C_HEIGHT*$C_WIDTH)/1000;$i++){
       
$color imagecolorallocatealpha($src,$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],rand(10,30)); 
       
imagesetpixel($src,rand(0,$C_WIDTH),rand(0,$C_HEIGHT),$color);
     }
   }
   unset(
$x,$y);
   
//Заливаем основными буковками
   
for($i=0;$i<$C_NUM_GENSIGN;$i++){
     
//Ориентир
     
$h 1;
     
//Рисуем
     
$color imagecolorallocatealpha($src,$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],rand(10,30)); 
     
$letter $LETTERS[rand(0,sizeof($LETTERS)-1)];
     
$x = (empty($x)) ? $C_WIDTH*0.08 $x + ($C_WIDTH*0.8)/$C_NUM_GENSIGN+rand(0,$C_WIDTH*0.01);
     
$y = ($h == rand(1,2)) ? (($C_HEIGHT*1)/4) + rand(0,$C_HEIGHT*0.1) : (($C_HEIGHT*1)/4) - rand(0,$C_HEIGHT*0.1);
     
//Запоминаем
     
$CODE[] = $letter;
     if(
$h == rand(0,10)) $letter strtoupper($letter);
     
//Пишем
     
imagestring($src,5,$x,$y,$letter,$color);
   }
 }
 
 
//Получаем код
 
$HTTP_SESSION_VARS['securityCode'] = implode('',$CODE);
 
$_SESSION['securityCode'] = implode('',$CODE);
 
 
//Печать
 
if($C_IMAGE_TYPE=='PNG'){
   
header ("Content-type: image/png"); 
   
imagepng($src);
 }elseif(
$C_IMAGE_TYPE=='JPEG'){
   
header ("Content-type: image/jpeg"); 
   
imagejpeg($src);
 }else{
   
header ("Content-type: image/gif"); 
   
imagegif($src);
 }
 
imagedestroy($src);




Спустя 2 часа, 27 минут, 3 секунды (22.07.2009 - 00:34) Nikitian написал(а):
Должно отображаться. Если пациент в интернете - покажите его, и после imagedestroy($src); не ставьте ничего, даже ?> - это тоже может быть причиной неотображения изображения. Ещё уберите header() и откройте "картинку" браузером напрямую, может там какие ошибки, предупреждения и/или нотисы показывает.

P.S. Замените анахронизм $HTTP_POST_VARS на $_POST. http_post_vars вроде как не поддерживается свежими версиями пыха.

Спустя 15 часов, 48 минут, 27 секунд (22.07.2009 - 16:23) ИНСИ написал(а):
вот, я сам пользуюсь этим, отображается везде и класная защита =))

Свернутый текст
PHP
<?php
// ---------- ---------- ---------- ---------- ----------
// Automatic test to tell computers and humans apart
// Copyright by Kruglov Sergei, 2006
// www.captcha.ru, www.kruglov.ru
// ---------- ---------- ---------- ---------- ----------

@error_reporting(E_ALL E_NOTICE);
@
ini_set('display_errors'true);
@
ini_set('html_errors'false);
@
ini_set('error_reporting'E_ALL E_NOTICE);

function 
clean_url ($url) {

  if (
$url == '') return;

  
$url str_replace("http://"""$url);
  if (
strtolower(substr($url04)) == 'www.')  $url substr($url4);
  
$url explode('/'$url);
  
$url reset($url);
  
$url explode(':'$url);
  
$url reset($url);

  return 
$url;
}


class 
genrandomimage {
    
    
// Переменные настройки скрипта ---------
    
    
var $alphabet "0123456789abcdefghijklmnopqrstuvwxyz"// НЕ ИЗМЕНЯЙТЕ, если вы не изменяли файл шрифтов!
    // последовательность букв должна СОВПАДАТЬ!
    
    // папка с шрифтами
    
var $fontsdir 'fonts';    
    
    
// размер изображения CAPTCHA (оптимальные параметры)
    
var $width 160;
    var 
$height 43;
    
    
// амплитуда вертикальной флуктуации символов, деленная на 2
    
var $fluctuation_amplitude 5;
    
    
// для увеличения безопасности можно убрать пробелы между символами
    
var $no_spaces true;
    
    
// качество JPEG-изображения CAPTCHA (чем больше, тем выше качество)
    
var $jpeg_quality 90// максимальное, можно поставить 70-80
    
    
var $keystring ''// ключевая генерируемая строка

    // символы, используемые для рисования сгенерированного изображения CAPTCHA    
    
var $allowed_symbols "023456789"// алфавит БЕЗ похожих символов (o=0, 1=l, i=j, t=f)
    
    // количество символов в строке
    
var $length_min 5// минимальное
    
var $length_max 6// максимальное
    
var $length 0// длина будет сгенерирована
    
    // ---------- ---------- ---------- ---------- ----------
    
    // Генерация строки ---------- ---------- -------
    
function genstring() {
        
// длина строки (количество символов) CAPTCHA
        // случайное число в пределах от $length_min до $length_max включительно
        
$length mt_rand$this->length_min$this->length_max );
        
$this->length $length;
        
        while (
true) { // бесконечный цикл, пока не сгенериуем хорошую строку =)
            
$this->keystring '';
            for (
$i 0$i $length $i++) {
                
// в цикле добавляем к строке по 1 случайному символу
                
$this->keystring .= $this->allowed_symbolsmt_rand0strlen$this->allowed_symbols ) -) };
            }
            if (!
preg_match'/cp|cb|ck|c6|c9|rn|rm|co|do/'$this->keystring )) break;
        }
    }
    
// ---------- ---------- ---------- ---------- ----------

    // Генерация изображения
    
function genimage() {

        
// цвета изображения CAPTCHA (RGB, 0-255)
        
$foreground_color = array( mt_rand0100 ), mt_rand0100 ), mt_rand0100 ) );
        
$background_color = array( mt_rand200255 ), mt_rand200255 ), mt_rand200255 ) ); // фон всегда светлее

        
$fonts = array();
        
$fontsdir_absolute dirname__FILE__ ).'/'.$this->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$this->alphabet );
        
        while (
true) {
            
$font_file $fonts[mt_rand0count$fonts ) - )]; // выбираем случайный файл шрифта
            
$font imagecreatefrompng$font_file );
            
$black imagecolorallocate$font00);
            
$fontfile_width imagesx$font );
            
$fontfile_height imagesy$font ) - 1;
            
$font_metrics = array();
            
$symbol 0;
            
$reading_symbol false;

            
// loading font
            
for ($i 0$i $fontfile_width && $symbol $alphabet_length$i++) {
                
$transparent = (imagecolorat$font$i) >> 24) == 127;

                if (!
$reading_symbol && !$transparent) {
                    
$font_metrics[$this->alphabet{$symbol}] = array( 'start' => $i );
                    
$reading_symbol true;
                    continue;
                }

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

            
$img imagecreatetruecolor$this->width$this->height );

            
$white imagecolorallocate$img255255255 );
            
$black imagecolorallocate$img00);

            
imagefilledrectangle$img00$this->width 1$this->height 1$white );

            
// draw text
            
$x 1;
            
$shift 0;
            
            for (
$i 0$i $this->length$i++) {
                
$m $font_metrics[$this->keystring{$i}];

                
$y mt_rand( -$this->fluctuation_amplitude$this->fluctuation_amplitude ) + ($this->height $fontfile_height) / 2;
                

                if (
$this->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$this->width ); $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 $this->width 10) break; // fit in canvas
        
}
        
$center $x/2;
        
        
$img2=imagecreatetruecolor($this->width$this->height);
        
$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$this->height$this->width$this->height+12$foreground);


        
// periods
        
$rand1 mt_rand7500001200000 ) / 10000000;
        
$rand2 mt_rand7500001200000 ) / 10000000;
        
$rand3 mt_rand7500001200000 ) / 10000000;
        
$rand4 mt_rand7500001200000 ) / 10000000;
        
// phases
        
$rand5 mt_rand03141592 ) / 500000;
        
$rand6 mt_rand03141592 ) / 500000;
        
$rand7 mt_rand03141592 ) / 500000;
        
$rand8 mt_rand03141592 ) / 500000;
        
// amplitudes
        
$rand9 mt_rand330420 ) / 110;
        
$rand10 mt_rand(330450 ) / 110;

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

                if (
$sx || $sy || $sx >= $this->width || $sy >= $this->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 ) & 0xFF;
                    
$color_xy imagecolorat$img$sx 1$sy ) & 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 $frsx;
                    
$frsy1 $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 $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 ) );
            }
        }

      
# Рамка
      
imageline$img200,  $this->width0$foreground );
      
imageline$img200,  0$this->height$foreground );

      
imageline$img20$this->height-1,  $this->width$this->height-1$foreground );
      
imageline$img2$this->width-10,  $this->width-1$this->height$foreground);

        
header"Expires: Tue, 11 Jun 1985 05:00:00 GMT" );
        
header"Last-Modified: " gmdate"D, d M Y H:i:s" ) . " GMT" );
        
header"Cache-Control: no-store, no-cache, must-revalidate" );
        
header"Cache-Control: post-check=0, pre-check=0"false );
        
header"Pragma: no-cache" );
        
header"Content-Type: image/jpeg" );
        
imagejpeg($img2null$this->jpeg_quality);
    }
    
// ---------- ---------- ---------- ---------- ----------
}

session_start();

$im = new genrandomimage();
$im->genstring();

$_SESSION['sec_code_session'] = $im->keystring;

$im->genimage();


чтобы вывести пишешь просто
PHP
<input name="sec_code" maxlength="45" type="text"><br />
<
img src="http://namesite.ru/antibot.php/>


а чтобы проверить в скрипте прописываешь:
PHP
if(isset($_POST['sec_code'])) $sec_code htmlspecialchars(stripslashes(trim($_POST['sec_code'])));

if(isset(
$_SESSION['sec_code_session'])) $sec_code_session htmlspecialchars(stripslashes(trim($_SESSION['sec_code_session'])));

/* Проверяем, действительно ли соответствует защитный код: */
if($sec_code_session == $sec_code)
{
    echo 
'Все введеноо верно =))';
}


а вот папка со шрифтами: Скачать

Спустя 7 часов, 9 минут, 47 секунд (22.07.2009 - 23:32) Nikitian написал(а):
Не забывайте после проверки условия если введено верно, то сбрасывать переменную сессии unset(), а если неверно, то перегенеривать код заново, иначе будут очень нехорошие последствия.

Спустя 2 месяца, 14 дней, 22 часа, 56 минут, 31 секунда (7.10.2009 - 22:29) SunSet написал(а):
Чтото просмотрел этот скрипт. Вставил в чистый файл, ошибок нету, рисунок с каптчей имеет и работает как надо. Только почему текстовое поле не работает и вообще ничего нельзя вывести (хтмл теги, текст, даже echo) в этот файл? blink.gif

Спустя 7 минут, 27 секунд (7.10.2009 - 22:36) sergeiss написал(а):
SunSet - это потому, что создается именно картинка, в которой никакие тэги просто не работают.
Сначала создается чистое "полотно", на котором идет рисование.
PHP
$src imagecreatetruecolor(...)

Когда всё готово, готовая картинка пересылается браузеру. Для этого используется одна из нижеперечисленных функций, в зависимости от выбранного типа картинки:
PHP
imagepng($src);
imagejpeg($src);
imagegif($src);

Спустя 6 минут, 30 секунд (7.10.2009 - 22:43) SunSet написал(а):
sergeiss
Так, а как эту самую картинку ставлять в страничку? И откуда берутся цифры для сравнения введенного числа и числа на картинке?

Спустя 3 минуты, 22 секунды (7.10.2009 - 22:46) twin написал(а):
Тегом. <img src="kcaptcha.php" />

Спустя 6 минут, 25 секунд (7.10.2009 - 22:53) SunSet написал(а):
twin
Спасиб, с этим разобрался. А сам код, который сверяется с введенным в текстовое поле, откуда он берется?
$_SESSION['sec_code_session'] и $sec_code - пустые, и в той вышеприведенной проверке при загрузке сразу выдает 'Все введеноо верно =)).

Спустя 1 минута, 41 секунда (7.10.2009 - 22:54) sergeiss написал(а):
Цитата (SunSet @ 7.10.2009 - 23:43)
Так, а как эту самую картинку ставлять в страничку? И откуда берутся цифры для сравнения введенного числа и числа на картинке?

Вставка в коде вверху:
HTML
<img src='code.php?<?=doubleval(microtime());?> width=200 height=70 vspace=10>

Микротайм нужен для того, чтобы адрес картинки был гарантированно уникальным - борьба с кэшированием в браузерах smile.gif
А сравнение... Например, сессия. При создании картинки записываешь в сессию, что должно быть в ответе. И при приходе ответа сравниваешь эти 2 числа.

PS. С ответом опоздал за 20 секунд smile.gif Но все равно его оставлю.

Спустя 4 минуты, 24 секунды (7.10.2009 - 22:59) SunSet написал(а):
sergeiss
А без сессий никак тут?

Спустя 17 минут, 46 секунд (7.10.2009 - 23:17) twin написал(а):
Кукисом можно. Но это сложнее.

Спустя 4 минуты, 35 секунд (7.10.2009 - 23:21) SunSet написал(а):
twin
Оке. Буду с сессиями думать wink.gif

Спустя 10 минут, 59 секунд (7.10.2009 - 23:32) glock18 написал(а):
Можно
а) GET'ом
б) POST'ом
в) SESSION'ом
г) COOKIE'сом

а, б и г - самые неподходящие в связи с тем, что ответ на капчу будет отправляться клиенту. толку от капчи будет 0 (ноль). Конечно, можно шифровать с ключем ее. Но это для любителей извратиться.

Вывод: в) - разумный выбор, если не сказать "единственный".

Спустя 3 минуты, 28 секунд (7.10.2009 - 23:36) SunSet написал(а):
glock18
Спасиб за обширную справку smile.gif

Спустя 25 минут, 37 секунд (8.10.2009 - 00:01) twin написал(а):
Цитата
Вывод: в) - разумный выбор, если не сказать "единственный".

Не соглашусь. Для сэбе может быть, а для паблика кукис предпочтительнее. Потому что сессии не везде работают. А лишний головняк для пользователя с настройками...
Раскодировать шифрованный кукис - слишком накладно для обхода капчи. А поставить его - даже на одну строчку меньше, чем сессию. smile.gif

Спустя 10 минут, 16 секунд (8.10.2009 - 00:11) SunSet написал(а):
Всеравно возникает вопрос. Посмотрел образец как в сессию пишется некая переменная, которая берется с текстового поля. Там вводишь чтото, идет отправка в другой файл, в другом файле открывается сессия и выводится уже та переменная. Очень похоже на ПОСТ.
А тут не понимаю как происходит. Вот лежит себе файл в директории antibot.php, как он чтото сам по себе добавит в $_SESSION ? Там то есть строки

PHP
session_start();

$im = new genrandomimage();
$im->genstring();

$_SESSION['sec_code_session'] = $im->keystring;

$im->genimage();

Но я ж его нигде не вызываю.

Спустя 1 минута, 19 секунд (8.10.2009 - 00:13) SunSet написал(а):
twin
Цитата
Для сэбе может быть, а для паблика кукис предпочтительнее

Так и куки не всегда ж разрешено принимать. Тогда вообще капец blink.gif

Спустя 8 минут, 21 секунда (8.10.2009 - 00:21) glock18 написал(а):
twin
смысл капчи защитить скрипт от ботов. покажи мне любой сайт, где код отправляется клиенту, я его взломаю, даже не задуряясь распознанием картинки. с сессиями мне придется ее распознавать.

Спустя 3 минуты, 23 секунды (8.10.2009 - 00:24) sergeiss написал(а):
Цитата (SunSet @ 8.10.2009 - 01:11)
Вот лежит себе файл в директории antibot.php, как он чтото сам по себе добавит в $_SESSION ?

Читай, как работают сессии: http://www.php.su/articles/?cat=examples&page=070

Спустя 1 минута, 16 секунд (8.10.2009 - 00:26) twin написал(а):
Куки реже не работают на сервере. А клиент сам виноват, что отключает. По крайней мере, куки без сессии будут работать, а сессия без кук нет. Ну можно в хидден сунуть, тоже вариант. Гетом некрасиво - адрес попортится.

Цитата
Но я ж его нигде не вызываю.

Ну как не вызываешь, а в теге у тебя не его разве адрес? Тебе в скрипте - приемнике осталось только сравнить данные из поля с данными в сессии. Если совпало - гут.
Цитата

смысл капчи защитить скрипт от ботов. покажи мне любой сайт, где код отправляется клиенту, я его взломаю, даже не задуряясь

Задуриться всетаки придется, нужно вычислить алгоритм шифрования для начала.

Спустя 8 минут, 46 секунд (8.10.2009 - 00:35) kirik написал(а):
twin
Если куки отключены, сессионная кука все равно будет приниматься.

Цитата (twin @ 7.10.2009 - 16:26)
Гетом некрасиво - адрес попортится.

Если уж вариант с сессией не подходит, то можно и гетом.. Только не в адесную строку браузера, а саму картинку запрашивать как
HTML
<img src="/captcha.php?code=тут_мегашифрованный_код" />



ЗЫ. Сессии они на то и нужны, чтобы привязать некую информацию к данному конкретному браузеру.

Спустя 6 минут, 14 секунд (8.10.2009 - 00:41) twin написал(а):
Цитата
Если куки отключены, сессионная кука все равно будет приниматься.

Это понятно. Но это частный случай. А вот когда на сервере сессии отключены, тогда вообще работать не будет. И тот, кто скрипт с паблика себе поставит, неразобравшись скажет - скрипт кака, неработает.
А гет - я ж написал, адрес портит. По этому наверно хидден рулит всетаки.

Спустя 9 минут, 31 секунда (8.10.2009 - 00:50) SunSet написал(а):
twin
Не знаю каким образом, но метод тыка сработал smile.gif
PHP
<?php 
session_start
();

?>

<?php 



if(isset($_POST['sec_code'])) $sec_code htmlspecialchars(stripslashes(trim($_POST['sec_code'])));

if(isset(
$_SESSION['sec_code_session'])) $sec_code_session htmlspecialchars(stripslashes(trim($_SESSION['sec_code_session'])));

/* Проверяем, действительно ли соответствует защитный код: */
if($sec_code_session == $sec_code)
{
    echo 
'Все введеноо верно =))';
}
echo 
$sec_code_session;
?>
<form action="?" method="post"><input name="sec_code" maxlength="45" type="text"><br /><input name="" type="submit"></form>
<img src="http://q/c/antibot.php?<?=doubleval(microtime());


Или я через пень-колоду все сделал?) Кстати, а почему если вывести строку echo $sec_code_session; - то она отображает следующий рисунок, если будет допущена ошибка при введении?


sergeiss
Статья более теоретический носит характер, чем практический. Пример бы там хоть привели. Но кое-как понял как устроено + тут глянул http://www.softtime.ru/scripts/worksession.php.

Спустя 1 минута, 23 секунды (8.10.2009 - 00:52) kirik написал(а):
Цитата (twin @ 7.10.2009 - 16:41)
А вот когда на сервере сессии отключены

И такое бывает??

Спустя 3 минуты, 30 секунд (8.10.2009 - 00:55) twin написал(а):
Совсем недавно столкнулся. Ну а когда сессионная кука не ставится - вообще полно случаев. Надо SID передавать... Заморочно... Но это все так, вялые рассуждения. Я вообще капчи нелюблю...

Спустя 6 минут, 26 секунд (8.10.2009 - 01:02) twin написал(а):
Цитата
Или я через пень-колоду все сделал?)

Разумеется. Потому что опять скопипастил из сомнительного источника и неудосужился разобраться. То, что это работает, совсем не значит - хорошо работает.
Это зачем?
PHP
?>

<

Это для чего веревка?
PHP
htmlspecialchars(stripslashes(trim(

Переменные неопределены. И равенство должно быть строгим.

Спустя 8 минут, 47 секунд (8.10.2009 - 01:10) SunSet написал(а):
Цитата (twin @ 7.10.2009 - 22:02)
Это зачем?

PHP
?>

<

Извини, но не вижу откуда это с моего скрипта вытянул? blink.gif Если имеешь ввиду - закрытие и тут же открытие - то там кусок текста пробного был, что не засорять здесь образец удалил. Ну и в один <?php ?> не стал вписывать.

Цитата
htmlspecialchars(stripslashes(trim(

Хоть я не автор сего труда smile.gif но так нельзя разве делать?
А про определение:
if (!isset($_POST['sec_code'])) $sec_code = 1;
Чтото вроде того?

Спустя 7 минут, 2 секунды (8.10.2009 - 01:17) twin написал(а):
Цитата
Хоть я не автор сего труда  но так нельзя разве делать?

Можно. А можно сделать так:
PHP
htmlspecialchars(stripslashes(trim(strip_tags(mysql_real_escape_string(rtrim(...
только какой в этом смысл?
А про определение, ну ладно - установлена переменная $sec_code , если есть $_POST['sec_code']. А если нету? С чем ты дальше $sec_code_session сравниваешь? С вакуумом? Нет переменной.

Спустя 6 минут, 31 секунда (8.10.2009 - 01:24) SunSet написал(а):
twin
Пусть с вакуумом, тогда $vacuum !== $sec_code_session и скрипт выдает ошибку что введенное число не соответствует нужному. Моя логика smile.gif

А про веревку - так вроде чисто технически, та проверка должна работать, понимаю, что некрасиво. И не приветствую вобщемто, просто интересно узнать почему такой вариант не может использоваться.
По-поповски писать?
smile.gif
PHP
$a htmlspecialchars($a);
$a stripslashes($a);
$a trim($a);

....


Спустя 7 минут, 49 секунд (8.10.2009 - 01:32) twin написал(а):
PHP
<?php 
    session_start
();
    
    if
(isset($_SESSION['sec_code_session']))
    {
        $sec_code = !empty($_POST['sec_code'])?$_POST['sec_code']:NULL;

/* Проверяем, действительно ли соответствует защитный код: */
        if($_SESSION['sec_code_session'] === $sec_code)
        {
            echo 'Все введеноо верно =))';
        }
        else
        
{
            echo 'Караул!!!! Спамеры!!!!';        
        
}
    }

Спустя 5 минут, 3 секунды (8.10.2009 - 01:37) SunSet написал(а):
if($_SESSION['sec_code_session'] === $sec_code) ? blink.gif

Но все же прошу ответить на последний вопрос.
Цитата
просто интересно узнать почему такой вариант не может использоваться.

Спустя 8 минут, 16 секунд (8.10.2009 - 01:45) twin написал(а):
Это строгое равенство. Без преобразования типов. В проверках подобного плана лучше юзать его.
Цитата
Но все же прошу ответить на последний вопрос.
просто интересно узнать почему такой вариант не может использоваться.

Я же написал - может. Только смысла в нем абсолютно никакого. С таким же успехом можно напихать туда полмануала функций. Они тут никакого полезного действия не выполняют. А зачем тогда?

Спустя 9 минут, 12 секунд (8.10.2009 - 01:54) SunSet написал(а):
twin
И еще одно - почему echo $sec_code_session; выводит следующую комбинацию цифр, которые будут в следующей возможной картирке? Хотя, вроде, должен выводить точно то же что и в даный момент на картинке.

Спустя 9 минут, 32 секунды (8.10.2009 - 02:04) twin написал(а):
Потому что ты при перезагрузке еще раз запускаешь скрипт. Только он должен и цифры на картинке поменять

Спустя 11 минут, 26 секунд (8.10.2009 - 02:15) SunSet написал(а):
twin
Вроде все уяснил. Спасиб за консультацию user posted image

Спустя 12 минут, 45 секунд (8.10.2009 - 02:28) Nikitian написал(а):
Кстати, рекомендую хранить не текущее число, а массив из последних 5-10 чисел. Т.к. иначе если пользователь открыл в нескольких вкладках разные формы с одной капчей, то сработает только одна из них в лучшем случае (последняя, если с неё начнёт вводить). Я часто бывает тоже открываю разные статьи в нескольких вкладках - так и этот форум читаю, - а потом отписываюсь и если бы стояла подобная капча, то отписываться в большинстве мест было бы проблематично.

Спустя 21 минута, 39 секунд (8.10.2009 - 02:50) SunSet написал(а):
Кстати, а почему нельзя юзать, например, всего 3 цифры для каптчи?
Даже если бот будет перебирать комбинацию цифр, то при 999 вариантах это всеравно займет значительное время. А для юзера проще.

Спустя 46 минут, 43 секунды (8.10.2009 - 03:36) kirik написал(а):
Цитата (SunSet @ 7.10.2009 - 18:50)
Кстати, а почему нельзя юзать, например, всего 3 цифры для каптчи?
Даже если бот будет перебирать комбинацию цифр, то при 999 вариантах это всеравно займет значительное время. А для юзера проще.

Бот не так работает, т.е. не перебирает возможные варианты, он "видит" твою картинку и распознаёт символы. Ну грубо говоря как человек вводит капчу, так и бот. Поэтому твои 3 числа он распознает моментом (хотя смотря как нарисуешь) smile.gif

Спустя 5 часов, 32 минуты, 44 секунды (8.10.2009 - 09:09) SunSet написал(а):
kirik
Будем пробовать. Хотя всеравно все новые мессаги будут видны тока для редактирования модератором, а не сразу поститься на сайт. Может "договорюсь" с ботом и на три цифры smile.gif

Спустя 11 часов, 59 минут, 21 секунда (8.10.2009 - 21:08) kalenval написал(а):
Ты на что хочешь каптчу?

Спустя 8 минут, 59 секунд (8.10.2009 - 21:17) SunSet написал(а):
kalenval
Добавления комента к чему-либо smile.gif

Спустя 7 часов, 47 минут, 34 секунды (9.10.2009 - 05:05) kirik написал(а):
Цитата (SunSet @ 8.10.2009 - 13:17)
Добавления комента к чему-либо

Сделать ты сейчас ее сделай, вот только включай не сразу, а когда реально спамить начнут.
Если у тебя движок самописный, то вероятности что тебя будут спамить в разы меньше чем если бы у тебя был вордпресс или другой ширпотреб.

Спустя 4 часа, 20 минут, 35 секунд (9.10.2009 - 09:26) SunSet написал(а):
kirik
Бот чувствует какой у меня сайт?))
Да и так старался.. а тут говорят отключить обратно laugh.gif

Спустя 1 час, 35 минут, 24 секунды (9.10.2009 - 11:01) twin написал(а):
Цитата
Бот чувствует какой у меня сайт?))

Он не чувствует, он знает. Под популярные движки боты давно написаны. И капчи парсят и активацию по почте обходят. А под самоделку зачастую его еще адоптировать надо. Если тебя спамить начали, радуйся - популярность растет)))

Спустя 40 минут, 54 секунды (9.10.2009 - 11:42) SunSet написал(а):
twin
kirik
Спасиб за совет. Но все же думаю чтото простенькое на 3-4 цифры оставлю, как бы для солидности smile.gif
А каптча на основе логики (выбор чего-либо, сложение чисел) лучше вышеприведенного примера или у каждой свои особенности?

Спустя 1 минута, 53 секунды (9.10.2009 - 11:44) twin написал(а):
"Солидность" капчи по статистике отпугивает до 70% юзерей. Так что боком такая солидность выйти может.

Спустя 3 минуты, 48 секунд (9.10.2009 - 11:48) SunSet написал(а):
twin
Поскольку, пока не планирую делать регистрацию, то добавления комента "простыми прохожими" и так вполне проста - сообщение, автор и контрольный код. А если без каптчи то потом наверняка прийдется много мусора выгребать с админки от всяких детей с их матюками и "Ыыыы" smile.gif

Спустя 7 часов, 38 минут, 45 секунд (9.10.2009 - 19:26) kirik написал(а):
SunSet
Вот почитай тут интересно smile.gif

Спустя 27 минут, 31 секунда (9.10.2009 - 19:54) twin написал(а):
Ай красавчик.))) Какой молодца парень.
Цитата
а простого бота обмануть легче, чем даже индуса-программиста.
Ура! Часть засранцев мы победили, займёмся остальными.

Я ему при встрече бы всю руку вытряс.
Конечно далеко не все, но очень круто. Еще раз молодец, моё восхищение smile.gif

Спустя 10 минут, 12 секунд (9.10.2009 - 20:04) kirik написал(а):
twin
Это блог vasa_c, если что знаешь кому трясти руку smile.gif

Спустя 15 минут, 28 секунд (9.10.2009 - 20:19) twin написал(а):
Блин, я знал, что он крут, но не думал что на столько.
Стыдно не читать подписи... sad.gif

Спустя 2 часа, 41 минута, 18 секунд (9.10.2009 - 23:01) Gram написал(а):
Мда интересно... А если перед отправкой формы пользователю, каждому имени поля ввода присваивать хэш и сохранять копию в сессию, а в обработчике обращаться по имени взятому из сессии?

Спустя 2 дня, 16 часов, 30 минут, 19 секунд (12.10.2009 - 15:31) SunSet написал(а):
kirik
Почитал ту статейку, только про саму каптчу там как кот наплакал. ВОсновном, про ботов, что считывают поля, заполняют и отсылают.
А каким органом они "читают" контрольный рисунок на каптче? smile.gif
Чтото слышал когдато про маски какието, накладывают их, попиксельно распознают и все такое.
Да и про то что менять имена полей, таких как mail, login, author на произвольные имена - только потом же автозаполнение не будет работать. А так приятно когда приходишь на левый сайт, а там уже предлогают зарегистрироваться как SunSet smile.gif

Спустя 1 час, 16 минут, 40 секунд (12.10.2009 - 16:48) twin написал(а):
Цитата
только потом же автозаполнение не будет работать

Факт. Это как раз и есть борьба с автозаполнением. А капчи бот распознает попиксельно анализируя картинку. В любом случае буква или цифра, дабы оставаться такой, должна отвечать каким то законам. Как бы ты её не искажал. От этого зависит только сложность программы, которая распознает образы. Сейчас даже лица распознают и отпечатки пальцев, что там про буквы говорить.

Спустя 6 минут, 58 секунд (12.10.2009 - 16:55) SunSet написал(а):
twin
Ну лица то не через веб-интерфейс распознают.
А как же задачи на логику, про сложение или что еще лучше - выбор картинок определенного рода - природа, алкоголь, техника?

Спустя 32 минуты, 18 секунд (12.10.2009 - 17:27) twin написал(а):
Цитата
Ну лица то не через веб-интерфейс распознают

А в чем принципиальная разница?
Цитата
А как же задачи на логику, про сложение или что еще лучше - выбор картинок определенного рода - природа, алкоголь, техника?

Ну вот я как то баловался. biggrin.gif Толлько все равно, капча - зло.

Спустя 2 часа, 2 минуты, 39 секунд (12.10.2009 - 19:30) SunSet написал(а):
Цитата (twin @ 12.10.2009 - 14:27)
Ну вот я как то баловался.  Толлько все равно, капча - зло.

Все бы хорошо, но чтото я сам не могу понять как твоя каптча работает.. ))) Вроде нахожу такую же картинку, идет проверка и всеравно "Неееее smile.gif"
Но это уже принципиально другой подход - только у тебя выбрать такой же рисунок нужно, а иногда указывается мол "выберите цветок", там 7 картинок природа, а на 8-м тот цветок. Научить робота такое распознавать, это вам не цифры по пикселям собирать smile.gif

Спустя 17 минут, 8 секунд (12.10.2009 - 19:47) twin написал(а):
У меня надо всех выбрать, кошек или птиц к примеру. Одну картинку неэффективно - слишком мало вариантов. Бот тупо угадать может.

Спустя 11 минут, 6 секунд (12.10.2009 - 19:58) SunSet написал(а):
Впринципе, все верно. Только рисунки никуда не годятся, слишком разные и трудно найти соответствующих им. То смотрю что на рисунке есть акулы, рыбы и дельфины, а оказывается что рыбы=дельфины, но акулы это совсем другое. Лучше чтото другое использовать. Фото техники какойто - телевизоры, холодильники, печки и стиралки smile.gif Или тому подобное.

Спустя 8 минут, 38 секунд (12.10.2009 - 20:07) twin написал(а):
Картинки просто мняются. Причем можно менять раз в месяц к примеру, тогда точно никто не пробъёт. Нерентабельно это... Одно плохо - очень уж громоздкая.

Спустя 3 минуты, 27 секунд (12.10.2009 - 20:10) SunSet написал(а):
Но в ней и плюсы - куда приятней тыкать мышкой, чем высматривать плоховидимые буквы и цифры и самому их вводить в поле. Да и блондинкам легче smile.gif
Ладненько, с каптчей более-менее разобрался. wink.gif

Спустя 3 часа, 25 минут, 51 секунда (12.10.2009 - 23:36) Gram написал(а):
Цитата (SunSet @ 12.10.2009 - 12:31)
kirik
Почитал ту статейку, только про саму каптчу там как кот наплакал. ВОсновном, про ботов, что считывают поля, заполняют и отсылают.
А каким органом они "читают" контрольный рисунок на каптче? smile.gif
Чтото слышал когдато про маски какието, накладывают их, попиксельно распознают и все такое.
Да и про то что менять имена полей, таких как mail, login, author на произвольные имена - только потом же автозаполнение не будет работать. А так приятно когда приходишь на левый сайт, а там уже предлогают зарегистрироваться как SunSet smile.gif

Да, ты прав, автозаполнение не будет работать.
Скажи, а нахрен автозаполнение если у тебя будет кука после реги? Ты ж автоматом пройдешь, и формы даже не увидишь.

Спустя 7 минут, 43 секунды (12.10.2009 - 23:44) SunSet написал(а):
Gram
Нет, я не о том чуть. Вот заходишь ты на сайт ццц.кулхацкер.с.ру, а там форма для регистрации. Собственно, имена у них дефолтные - login / mail. Ты туда клацаешь мышей, а там в списке уже есть имячко Gram smile.gif Поскольку, Gram уже однажды вводил на какомто сайте в поле login этот ник, потому он на другом сайте сам появится в автозаполнении rolleyes.gif

Спустя 9 минут, 59 секунд (12.10.2009 - 23:54) Gram написал(а):
т.е. если у меня <input type="name"> у вас будут проблемы?

Спустя 4 минуты, 43 секунды (12.10.2009 - 23:58) SunSet написал(а):
Gram
<input type="text" name="textfield" id="textfield">
вот так вообщето)) ну вот если будет name="fsfsgsegwgwsge", то понятное дело автозаполнения не будет. Тут не вопрос хуже/лучше, а вопрос в удобности. Всеравно что ты приходишь первый раз в новый магазин, а вам "Здраствуйте, Gram, вам как обычно, пакет молока и печенья?" biggrin.gif

Спустя 8 минут, 28 секунд (13.10.2009 - 00:07) Gram написал(а):
опечатался.
имел в виду <input type="text" name="name">

разве меня что то обязывает подстраиваться под пользователей, которые регятся на всем подряд? как хочу, так и называю поля. далеко не на всех сайтах name="login". Тем более, если большинство ботов завалятся на моей схеме. Чем не плюс кода?

Спустя 4 минуты, 54 секунды (13.10.2009 - 00:12) SunSet написал(а):
Gram
Ну можно сделать 10 каптчей на одной странице, попереименовывать все поля в 20-ти символьные имена и понаписывать умные проверки- тебе от этого плюс, а юзеру то? Наверно, все же приходится выбирать такую золотую середину между безопасностью и удобством. rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.