Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: Captcha grafico ASCII

  1. #1

    Captcha grafico ASCII

    Hola a todos

    oggi pome mi sono messo un pò a lavoro e mi sono scritto qualche riga di codice per "diesgnare" un captcha visuale basato su caratteri ascii

    qui riporto il post che ho fatto in una discussione dove si parlava di captcha
    http://forum.html.it/forum/showthrea...1#post11865421

    per chi non volesse perdere tempo accedendo usando un sistema di questo tipo viene fuori qualcosa come

    codice:
        §#         §0        ç#ç*§#    §**#§2    §@    #§2@§§ 
      §§ç@0*     #§@*##     *#   ##   **   *#  #1*§   §#   *@ 
     @*    #*   #§    ç§   §§    §#  çç    ç@  #§#§  **    2§ 
     #*    @#   0*    #*       **        ç2   ## §*      ç*   
    0*      ç§ ç§      ç@      §2        ##      §*      §@   
    ç@      *# #@      ##    *§        2ç        §@    #@     
     ç0    #@   çç    @*     ç*        #§        1*    22     
     #0    @0   0§    *ç   ç#        §#          *#  @ç       
      *@§##@     0@#*§@    @@    *@  ç#    §#    çç  @2    *§ 
        #*         #*      ç@@ç#2*   *ç#ç2@ç     ç@  *###2@2
    un altro esempio è
    codice:
    ----+W-----------,ù-------;S-------e§x]2T-------é°-------òZ----
    --@EB^\à-------ì/2ç-----[SRS------f5---bG-----ZH+*-----&yy2----
    -RV----*R------|(?m-----_R##-----w3----(b-----çeM%-----wV§N----
    -[ù----18-----ù/-+u----ft-r3---------Uq------5h-ùh----S5-h3----
    |m------bo-------:.-------f6---------T°---------Kr-------3?----
    òp------3Z-------"z-------é$-------+*-----------jJ-------Qr----
    -gù----/|--------CJ-------°v-------z.-----------R_-------F-----
    -("----bc--------?f-------L&-----0_-------------çD-------iò----
    --bèEQ%P---------O:-------wn-----HP----p,-------où-------8,----
    ----\J-----------p+-------Yc-----éE$$ek#--------E:-------0E----
    o

    codice:
    ____5z___________r-________9r___________O°________0q___________$[____
    __.SY81,_______'Y@G______H*B1=§_______)nY*______Y8dìf/_______x)l|____
    _gI____Gà______1-nH_____'e____:m______*Zw'_____7m____'a______/K'l____
    _:^____!:_____uk_Af_____£o____s1_____é:_($_____=#____/q_____7z_:E____
    èé______@1_______E=____k:______R§_______WT____G4______h9_______zO____
    è,______*Z_______1K____§à______B&_______§E____E7______fn_______nk____
    _$5____7L________'Q_____*.____Q+________&:_____SL____)[________$F____
    _oN____é-________Cç_____:Z____Pq________sx_____t°____=\________kP____
    __hghF]R_________ZP______)Y%oHc_________6T______##u%ù§_________t8____
    ____EL___________nj________=-___________bt________P[___________àp____
    attualmente compaiono solo lo 0, 1 e 2 perché ho disegnato solo questi 3 caratteri per le prove, ma come si può vedere effettivamente cosi risulta moltooooo complesso per un bot riuscire a decifrare il concenuto i font infatti sono estremamente alterati e, volendo, è possibile applicare delle distorsiozni

    il primo captcha visuale testuale che ho postato lasciatelo perdere, comunque, è solo per esempio

    il bot, per riuscire a decifrare il contenuto dovrebbe andare a leggersi il testo li presente, costruirsi una mappa ove il carattere utilizzato per la spaziatura è considerato un nulla e qualsiasi altro carattere un pieno e poi andargli a confrontare con un font, sempre costruito a mano partendo da quello

    l'alternativa è, dopo aver costruito la mappa, provare a fargli riconoscere il codice tramite un sistema ocr

    in entrambi i casi c'è più lavoro da fare (nel primo caso moltissimo più lavoro da fare) e comunque non si ha la certezza di riconoscere il testo ... ad esempio

    codice:
    ____8_____________I______________ç____________________$kBaTf__________________
    __n___v_________òPGòyf________H_28[@_______1rqZ______0è___Bì______rsTDPp______
    __g_____Y_______%____A_______|______é_______T________@___________N_____W______
    _b8____=o______E_____g°______H_____e§_____6j__;_________D*________N____da_____
    mé____________q________o____U]_______7________%_________]_______^________,____
    Q+______a______J______*_____j_______=ò________________:^________I_____________
    __f____gc______W§____[v______]______!________B\_______[°__________1___________
    __5____08_______c____]3______Ig_____à________ò]_____7=___________$$____èh_____
    ___%°3__________i_V_ap________5,yHvg__________v______3_____P______46r2q_______
    _____l____________wM_____________!____________|______/°_èN___________?________
    facendo generare al sistema un captcha del genere diventa ancora più complesso per un bot andare a riconoscere correttamente i valori presenti perché dovrebbe andare a considerare una percentuale di differenza

    comunque ... cosa ne pensate di un sistema del genere? non avrebbe bisogno delle GD e volendo per i caratteri, se si implementano, si possono usare FONT sempre diversi complicando considerevolmente la vita

    anche la spaziatura tra i caratteri, volendo, si può fare casuale
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    218
    Orpo, io manco riesco a leggerci..

  3. #3
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,648
    bella la idea, ma l'impatto grafico su di un sito?

  4. #4
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    si l' idea è carina.. magari portandolo in immagine piu piccola diventa + leggibile, e il problema per il bot rimane.. no?

    oppure imposto un font basso(es 6px) in un div dove genero il contenuto, avendo l' effetto di un immagine, rendendolo piu leggibile e mantenendo la struttura testuale
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  5. #5
    Originariamente inviato da dottwatson
    si l' idea è carina.. magari portandolo in immagine piu piccola diventa + leggibile, e il problema per il bot rimane.. no?

    oppure imposto un font basso(es 6px) in un div dove genero il contenuto, avendo l' effetto di un immagine, rendendolo piu leggibile e mantenendo la struttura testuale
    l'idea era esattamente quella di giocare con il font ... qui c'è qualche shot più leggibile mantenendo la stessa tipologia però

    http://www.phpsoft.it/mystuff/shots/...-captcha-1.png
    http://www.phpsoft.it/mystuff/shots/...-captcha-2.png
    http://www.phpsoft.it/mystuff/shots/...-captcha-3.png

    Il primo è con 2px di dimensione, il secondo con 3px ed il terzo con 4px. Tutti usano il font Lucida Console. Si vede comunque abbastanza con anche con Bitstream Vera Sans Mono. Eventualmente si può ripiegare sul Courier New, presente con certezza anche su linux e mac os x.

    Qui c'è un bell'elenco di font monospace
    http://www.lowing.org/fonts/
    http://it.wikipedia.org/wiki/Monospace

    ---

    con la dimensione più piccola ovviamente il problema per il bot rimane!

    e' importante lasciare i caratteri usati per la spaziatura (volendo si può usare lo spazio normale) anche per disegnare i caratteri in questo modo il bot è costretto a fare un confronto per il carattere che ha maggiore similitudine cosa che potrebbe comportare similitudini anche con altri caratteri impedendo quindi il riconoscimento assoluto

    @ranma
    l'impatto grafico è un problema relativo infatti si tratta di un captcha, ergo sta in poche pagine, e comunque lo puoi colorare, puoi mettere una bordatura e via dicendo
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,648
    Originariamente inviato da daniele_dll


    @ranma
    l'impatto grafico è un problema relativo infatti si tratta di un captcha, ergo sta in poche pagine, e comunque lo puoi colorare, puoi mettere una bordatura e via dicendo
    in effetti così piccolo non ci si accorge nemmeno che è generata con caratteri ASCII

  7. #7
    per generare questi 3 set di captcha ho utilizzato dei caratteri abbastanza pienotti
    #@$§&#@$§&_

    sono ripetuti perché siccome vengono scelti casualmente aumento le probabiltà che venga preso un carattere corretto più che una spaziatura in modo da aumentare la leggibilità ma rompere un poco di più i maroni al bot

    ------

    torno comunque a ripetere che il sistema per scavalcare questo captcha c'è e non è troppo complesso ... la cosa che però sicuramente fa scoraggiare è il tempo necessario per scriversi tutti i font a manina

    usando più font (attualmente il mio codice non lo fà, ma poi magari mi ci metto) con svariati caratteri (ergo lettere sia maiuscole sia minuscole e numeri oltre magari a punti interrogativi, punti escalmativi e simili) renderebbe complessa assai la cosa (anche per via della necessità di usare un confronto basato sulla percentuale di parti simili piuttosto che un confronto netto)
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    se vuoi una mano dillo.. mi piace il discorso

    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

  9. #9
    la roba che ho postato li già me la genera il codice per il captcha testuale :asd:

    codice:
    <?php
    
    class TextualCaptcha
    {
        private $__font;
    
        function __construct($Font)
        {
            // Try to open the font
            $fp = @fopen($Font, 'rt');
            
            // Check if the font was openend or not
            if ($fp === false)
            {
                die('Unable to load font ' . $Font);
            }
            
            // Build font informations
            $this->__font = new stdClass();
            $this->__font->Height = trim(@stream_get_line($fp, 128, "\n"));
            $this->__font->Characters = array();
            
            // Check there was an error while reading width or height
            if ($this->__font->Height == false)
            {
                die('Error while reading font informations');
            }
            
            // Try to read font characters
            $characterIsCompleted = true;
            while(feof($fp) === false)
            {
                // Read font character
                $character = trim(@stream_get_line($fp, 128, "\n"));
                
                // Check if character is valid
                if ($character === false || strlen($character) != 1)
                {
                    die('Unusable character or invalid length (max length 1)');
                }
                
                // Initialize character lines slot
                $this->__font->Characters[$character] = array();
    
                // Switch of character check
                $characterIsCompleted = false;
                
                // Start to read character lines
                $characterLines = array();
                
                // Loop for characters
                for($line = 0; $line < $this->__font->Height; $line++)
                {
                    $this->__font->Characters[$character][] =
                        ($readCheck = trim(@stream_get_line($fp, 128, "\n")));
                        
                    if ($readCheck === false)
                    {
                        die('An error occurred while reading character ' .
                            $character);
                    }
                }
    
                // Switch on character check
                $characterIsCompleted = true;
            }
            
            // Chiude il file
            fclose($fp);
    
            // Check if charcter was readed all or not
            if ($characterIsCompleted == false)
            {
                die('An error occurred while reading character ' . $character);
            }
        }
        
        function GenerateCode($Length = 8)
        {
            $characters = array_keys($this->__font->Characters);
            $code = '';
    
            for($codeIndex = 0; $codeIndex < $Length; $codeIndex++)
            {
                mt_srand();
                $code .= $characters[mt_rand(0, count($characters) - 1)];
            }
            
            return $code;
        }
    
        function GenerateCaptcha($Code, $CharacterToReplace = '*#@ç§', $CharacterSeparator = ' ', $SpaceCharacter = ' ', $ShowValuePossibility = 10)
        {
            $captchaText = '';
            $codeLength = strlen($Code);
            $characterToReplaceLength = strlen($CharacterToReplace);
            
            // Initialize the show code value possibility per character code
            $characterCodeShowValuePossibility = array();
            for($codeIndex = 0; $codeIndex < $codeLength; $codeIndex++)
            {
                $characterCodeShowValuePossibility[$codeIndex] = $ShowValuePossibility;
            }
    
            // Loop font lines
            for($codeLine = 0; $codeLine < $this->__font->Height; $codeLine++)
            {
                // Loop code characters
                for($codeIndex = 0; $codeIndex < $codeLength; $codeIndex++)
                {
                    // Get character line
                    $characterLine = $this->__font->Characters[$Code{$codeIndex}][$codeLine];
    
                    // Get character width
                    $characterLineWidth = strlen($characterLine);
    
                    // Loop character width
                    for($characterLineIndex = 0; $characterLineIndex < $characterLineWidth;
                        $characterLineIndex++)
                    {
                        // Check if must place a space or a character
                        if ($characterLine{$characterLineIndex} == '0')
                        {
                            // Put a space
                            $captchaText .= $SpaceCharacter;
                        }
                        else
                        {
                            // Check if must show the value of the current code or not
                            mt_srand();
                            if (mt_rand(0, 100) < $characterCodeShowValuePossibility[$codeIndex])
                            {
                                // Put the current character value
                                $captchaText .= $Code{$codeIndex};
                                
                                // Reset possibility
                                $characterCodeShowValuePossibility[$codeIndex] = $ShowValuePossibility;
                            }
                            else
                            {
                                // Increment possibility
                                $characterCodeShowValuePossibility[$codeIndex]++;
                                
                                // Put a casual character from CharacterToReplace
                                $captchaText .= $CharacterToReplace{mt_rand(0, $characterToReplaceLength - 1)};
                            }
                        }
                    }
                    
                    if ($codeIndex != $codeLength - 1)
                    {
                        // Put character separator
                        $captchaText .= $CharacterSeparator;
                    }
                }
                
                // Put a new line
                $captchaText .= "\r\n";
            }
    
            return $captchaText;
        }
    }
    
    //$characterSet = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!"£$%&/()=\'ì?^è+ùé*§[]òàç°@#,.-;:________________________________________________________\\|';
    $characterSet = '#@$§&#@$§&_';
    $textualCaptcha = new TextualCaptcha('Fonts/StandardOnlyNumbers');
    $code = $textualCaptcha->GenerateCode(6);
    echo '<div style="font-family: Lucida Console; font-size: 4px; font-weight: bold;">' . str_replace("\r\n", "
    \r\n", $textualCaptcha->GenerateCaptcha($code, $characterSet, '____', '_', -9999)) . '</div>';
    
    ?>

    mentre il font (che va salvato dentro Fonts/StandardOnlyNumbers)

    codice:
    10
    0
    0000110000
    0011111100
    0110000110
    0110000110
    1100000011
    1100000011
    0110000110
    0110000110
    0011111100
    0000110000
    1
    00011
    01111
    01111
    11011
    00011
    00011
    00011
    00011
    00011
    00011
    2
    000111111
    001100011
    011000011
    000001100
    000001100
    000110000
    000110000
    011000000
    011000011
    011111110
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    mentre il font (che va salvato dentro Fonts/StandardOnlyNumbers)

    ...

    di questo mi sfugge la logica... :master:

    oddio, non ho letto a pieno la classe (sono al lavoro e aspetto che il resp si liberi...) ma due paroline per descrivere il font no mi dispiacerebbero
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.