irc
eByteNet » Forum » Programmieren » PHP & MySQL » Mein Captcha - Bewertungen+Verbesserungen
Seiten: 1 2 3 >

11.04.2009 um 19:23:26
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Captcha - Bewertungen+Verbesserungen
Hallo :)

Also, ich habe mich mal wieder hingestzt und ein Captcha programmiert
Iht könnt es HIER testen.

So jetzt seid ihr gefragt:
1. Was taugt das Ding
2. Ist es gut so lösen?
3. Ist es zu einfach?
4. Was würdet ihr anders/besser machen?

Falls sich jemand für den Code interessiert:
PHP-Code:
<?php
session_start
();

$_SESSION['captcha'] = '';

//Bildhintergrund festlegen
$img imageCreateFromPNG('images/bg' rand(1,3) . '.png');

//Schriftart+Größe
$font 'images/font/edo.ttf';
$font_size '32';

//Funktion zum Raten der Farbe
function randcolor() {
    global 
$img;
    
$colors = array(
    
imageColorAllocate($img000),
    
imageColorAllocate($img12700),
    
imageColorAllocate($img330127),
    
imageColorAllocate($img012770)
    );
    
$color $colors[rand(03)];
    return 
$color;
}

//Funktion zum "zufälliges Zeichen" ausgeben
function randtoken() {
    
$tokens = array('A''B''C''D''E''F''G''H''I''J''K''L''M''N',
    
'P''R''S''T''U''V''W''X''Y''Z''2''3''4''5''8');
    
$token $tokens[rand(028)];
    
$_SESSION['captcha'] = $_SESSION['captcha'] . $token;
    return 
$token;
}

//Zeichen aufs Bild malen
ImageTTFText($img$font_sizerand(-3030), rand(512), rand(3575), randcolor(), $fontrandtoken());
ImageTTFText($img$font_sizerand(-3030), rand(5764), rand(3575), randcolor(), $fontrandtoken());
ImageTTFText($img$font_sizerand(-3030), rand(109116), rand(3575), randcolor(), $fontrandtoken());
ImageTTFText($img$font_sizerand(-3030), rand(161168), rand(3575), randcolor(), $fontrandtoken());


//Dateityp festlegen
header("Content-type: image/PNG");

//Ausgeben
imagePNG($img);

//Speicher freigeben
imageDestroy($img);

?>

Zuletzt bearbeitet von zwanzer am 11.04.2009 um 19:24:37 Uhr
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
11.04.2009 um 19:32:14
Dacollo


Avatar von Dacollo

Registriert: 18.01.2008
eBN-Alter: 2J 1M 24T

Beiträge: 485
Verwarnungen: 0

eBytes: 7715.58

Titel: Re: Captcha - Bewertungen+Verbesserungen
find ich gut, dürfte, vor allem durch das rückwärts lesen so ziemlich jeden bot fernhalten ...


mfg Dacollo
Zuletzt bearbeitet von Dacollo am 11.04.2009 um 19:33:29 Uhr
_______________________________



10 Gründe, warum Entwickler so faul sind:
1.)
OFF Melden
12.04.2009 um 01:04:29
theeagle


Avatar von theeagle

Registriert: 11.05.2006
eBN-Alter: 3J 10M 7T

Beiträge: 755
Verwarnungen: 0

eBytes: 55696.78

Titel: Re: Captcha - Bewertungen+Verbesserungen
leider kann man den leicht umgehen, indem man einfach keine Bilder zulässt, und somit niemals ein Captcha generiert wird!

Bot: http://theeagle.ebytehost.com/captcha_bot.php

Grüße TheEagle
_______________________________

Um Rekursion wirklich zu verstehen, muss man zuerst Rekursion verstehen.
OFF Melden
12.04.2009 um 10:06:01
Debbe


Avatar von Debbe

Registriert: 17.10.2006
eBN-Alter: 3J 4M 27T

Beiträge: 348
Verwarnungen: 0

eBytes: 2464.3

Titel: Re: Captcha - Bewertungen+Verbesserungen
theeagle, du spiel verderber :D sag uns lieber wie mans richtig machen würde (mit JS nehme ich mal an?)

Interessiert mich nämlich brennend, wie das schwer umgänglich gelöst werden kann...
_______________________________

Ist der Thread so langweilig, dass du meine Signatur lesen musst?
OFF Melden
12.04.2009 um 10:12:15
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Re: Captcha - Bewertungen+Verbesserungen
Hust^^

Jetzt geht es ;)
Einfach in der Datei in der der code generiert wird ne andere Session-variable setzten, und wenn die beim auswerten leer is weiß man das es ein bot is ;)
Hier darf man dem Bot zuschauen ;)
HIER kann man es immernoch testen.

SOOO, neu

captcha.php
PHP-Code:
<?php
// (c) 2009 Stefan Zwanzer. Wer das Script einsetzen will, bitte Email an ste.zwanzer@gmx.de
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  <link href="styles.css" rel="stylesheet" type="text/css" />
  <title>Captcha-Test</title>
</head>
<body>
    <div id="content">
        <h1>Captcha-Test:</h1>
        <?php
        session_start
();
        
        
$step $_POST['step'];
        
        if(!isset(
$step)) {
            
$step 1;
        }
        
        if(
$step == 1) {
            include(
'captcha_token.php');
            echo 
'
            <p>Bitte gib die unten stehenden Ziffern ein.</p>
            <p><b>Achtung: Lies von Rechts nach Links!</b></p>
            <img style="border: 1px solid #000000;" src="captcha_img.php" alt="captcha" />
            <form method="post" action="' 
$_SERVER['PHP_SELF'] . '">
            <input type="text" name="captcha_text" maxlength="4" size="4" />
            <input type="hidden" name="step" value="2" /><br />
            <input type="submit" value="&Uuml;berpr&uuml;fen" />
            </form>
            '
;
        }
        
        if(
$step == 2) {
            
$captcha_right strrev($_SESSION['captcha']);
            
$captcha_input $_POST['captcha_text'];
            
            if(
$_SESSION['captcha_nobot'] == true) {
                if(
$captcha_right == $captcha_input) {
                    echo 
'<p>Richtig gelöst ;)</p>';
                } else {
                    echo 
'<p>Leider falsch!<br />
                    <form>
                        <input type="hidden" name="step" value="1" />
                    <input type="submit" value="Zur&uuml;ck" />
                    </form></p>'
;
                }
            } else {
                echo 
'<p>Haha, Scheiss Bot</p>';
            }
        }
        
?>
    </div>
</body>
</html>


captcha_token.php
PHP-Code:
<?php
// (c) 2009 Stefan Zwanzer. Wer das Script einsetzen will, bitte Email an ste.zwanzer@gmx.de
session_start();

//Session leeren, da in der Schleife das Zeichen nur drangehängt wird
$_SESSION['captcha'] = '';

//Zeichen, die im Token vorkommen dürfen
$tokens = array('A''B''C''D''E''F''G''H''I''J''K''L''M''N''P',
'R''S''T''U''V''W''X''Y''Z''2''3''4''5''8');

//Token generieren und in SESSION schreiben
for($i 0;  $i 4$i++) {
    
$token $tokens[rand(028)];
    
$_SESSION['captcha'] = $_SESSION['captcha'] . $token;
}

//Das ist kein Bot
$_SESSION['captcha_nobot'] = true;
?>


captcha_img.php
PHP-Code:
<?php
// (c) 2009 Stefan Zwanzer. Wer das Script einsetzen will, bitte Email an ste.zwanzer@gmx.de
session_start();

//Token einzeln in Array packen
$token str_split($_SESSION['captcha'], 1);

$img imageCreateFromPNG('images/bg' rand(1,3) . '.png');
$font 'images/font/edo.ttf';
$font_size '32';

//Funktion zum Raten der Farbe
function randcolor() {
    global 
$img;
    
$colors = array(
    
imageColorAllocate($img000),
    
imageColorAllocate($img12700),
    
imageColorAllocate($img330127),
    
imageColorAllocate($img012770)
    );
    
$color $colors[rand(03)];
    return 
$color;
}

//Einzelne Zeichne ausgeben
ImageTTFText($img$font_sizerand(-3030), rand(512), rand(3575), randcolor(), $font$token[0]);
ImageTTFText($img$font_sizerand(-3030), rand(5764), rand(3575), randcolor(), $font$token[1]);
ImageTTFText($img$font_sizerand(-3030), rand(109116), rand(3575), randcolor(), $font$token[2]);
ImageTTFText($img$font_sizerand(-3030), rand(161168), rand(3575), randcolor(), $font$token[3]);

//Dateityp festlegen
header("Content-type: image/PNG");

//Ausgeben
imagePNG($img);

//Speicher freigeben
imageDestroy($img);

?>

Zuletzt bearbeitet von zwanzer am 12.04.2009 um 10:35:10 Uhr
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
Interessantes
12.04.2009 um 10:32:59
quark007
ModeratorenTeamLeiter

Avatar von quark007

Registriert: 23.05.2006
eBN-Alter: 3J 9M 24T

Beiträge: 1824
Verwarnungen: 0

eBytes: 38713.3

Titel: Re: Captcha - Bewertungen+Verbesserungen
Ich muss dir leider mitteilen, dass ich KEINE Schrift sehe... http://zwanzer.ebytehost.com/c[...]captcha_img.php die Bilder sind zwar farbig, aber ich sehe keine Schrift und keine Zahlen.. also iwas kann nicht stimmen.....
_______________________________

OFF Melden
12.04.2009 um 10:33:53
Egon


Avatar von Egon

Registriert: 14.01.2008
eBN-Alter: 2J 1M 28T

Beiträge: 649
Verwarnungen: 0

eBytes: 2551.18

Titel: Re: Captcha - Bewertungen+Verbesserungen
Du musst auch hier schauen http://zwanzer.ebytehost.com/c[...]cha/captcha.php ;)

EDIR Doch jetz gehts auch bei mir wieder xDD http://zwanzer.ebytehost.com/c[...]captcha_img.php
Zuletzt bearbeitet von Egon am 12.04.2009 um 10:34:19 Uhr
_______________________________

Ab jetz der Initiative gegen Alkoholfreies eBN beigetreten =)

"THE BEER-WARE LICENSE" (Revision 42):
<thomannfreak@gulli.com> wrote this post. As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you think
this stuff is worth it, you can buy me a beer in return
OFF Melden
12.04.2009 um 10:40:14
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Re: Re: Captcha - Bewertungen+Verbesserungen
Zitat von quark007:

Ich muss dir leider mitteilen, dass ich KEINE Schrift sehe... http://zwanzer.ebytehost.com/c[...]captcha_img.php die Bilder sind zwar farbig, aber ich sehe keine Schrift und keine Zahlen.. also iwas kann nicht stimmen.....


War ich grad am rumprobieren ;)
Hab zwar XAMPP aber... hatte da grad nen Schreibfehler der mich verrückt gemacht hat, musste das einfach mal auf nem anderen System ausprobieren ;) (traue windoof net :))
Zuletzt bearbeitet von zwanzer am 12.04.2009 um 10:40:51 Uhr
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
12.04.2009 um 10:43:35
starthtml


Avatar von starthtml

Registriert: 05.07.2006
eBN-Alter: 3J 8M 11T

Beiträge: 1369
Verwarnungen: 0

eBytes: 22746.11

Titel: Re: Re: Captcha - Bewertungen+Verbesserungen
Zitat von Debbe:

theeagle, du spiel verderber :D sag uns lieber wie mans richtig machen würde (mit JS nehme ich mal an?)


beim Formular generieren:
Bild generieren, Code in Session speichern, Bild in bestimmten Ordner abspeichern, Bild ausgeben... ;)
OFF Melden
12.04.2009 um 11:00:32
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Re: Captcha - Bewertungen+Verbesserungen
Und wenn das Formular nie angezeigt wird?

(das war ja auch der Fehler bei mir)


@theeagle
Kann ich mal den code von deinem script sehen?
Zuletzt bearbeitet von zwanzer am 12.04.2009 um 12:10:23 Uhr
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
Interessantes
12.04.2009 um 12:32:09
starthtml


Avatar von starthtml

Registriert: 05.07.2006
eBN-Alter: 3J 8M 11T

Beiträge: 1369
Verwarnungen: 0

eBytes: 22746.11

Titel: Re: Re: Captcha - Bewertungen+Verbesserungen
Zitat von zwanzer:

Und wenn das Formular nie angezeigt wird?
(das war ja auch der Fehler bei mir)


Meinst du meinen Post? Wenn ja, dann hier meine Antwort :D

Du musst ein Captcha Bild generieren, während das Formular generiert wird. Das machst du nicht über den img-Tag, sondern schon vorher, im PHP-Code. OOP ist da dann übrigens sehr sinnvoll, da du das ganze sehr gut wiederverwenden kannst. Dann übergibt dir die Captcha-Klasse den Link zur Bilddatei, die du dann anzeigst ;)
Wenn das Bild nicht angezeigt wird, ist trotzdem ein Captcha erstellt worden ;)

EDIT: ich hatte da mal etwas gebaut... :

PHP-Code:
<?php
/**
* Captcha Class

* This file contains the captcha class which is used to handle captcha requests

* @author Simon S. <info@starthtml.de>
* @version 1.0
*/
class StarthtmlContact_Captcha
{
    public 
$letters    = array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z',
                            
'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z',
                            
'1','2','3','4','5','6','7','8','9');
                            
    public 
$dir;
    public 
$validTime    600;    //10 minutes
    /**
    * Constructor
    *
    * @param string $form Link to form template file
    */
    
public function __construct()
    {
        
$this->dir    './StarthtmlContact/pictures/captcha/';
        
//garbage collector
        
$this->collectGarbage();

    }
    
    public function 
collectGarbage()
    {
        
$dir    opendir($this->dir);
        while(
$file readdir($dir))
        {
            if(
$file == '.' || $file == '..')
            {
                continue;
            }
            
$explodeUnderScore    explode('_',$file);
            
$explodeExtension    explode('.',$explodeUnderScore[1]);
            
$time    = (int) $explodeExtension[0];
            if((
$time 600) < time())
            {
                
unlink($this->dir '/' $file);
            }
        }
    }
    
    
/**
    * This function creates a new captcha, i.e. it calls several functions (create string, save image,...)
    */
    
public function createCaptcha()
    {
        
$str    $this->createString(5);
        
$_SESSION['StarthtmlContactCaptcha']    = $str;
        return 
$this->_saveImage($str);
    }
    
    
/**
    * This function checks whether a string is the same as the captcha saved in the session
    *
    * @param string $str String to be compared
    * @return boolean true if it is the same, otherwise false
    */
    
public function checkCaptcha($str)
    {
        
$session    $_SESSION['StarthtmlContactCaptcha'];
        unset(
$_SESSION['StarthtmlContactCaptcha']);
        if(
$str == $session)
        {
            return 
true;
        }
        return 
false;
    }
    
    
/**
    * This function checks whether a string is the same as the captcha saved in the session
    *
    * @param string $str String to be compared
    * @return boolean true if it is the same, otherwise false
    */
    
public function createString($letters)
    {
        
$numberElements    count($this->letters) - 1;
        for(
$i 0$i <= $letters$i++)
        {
            
$str    .= $this->letters[rand(0,$numberElements)];
        }
        return 
$str;
    }
    
    private function 
_saveImage($str)
    {
        
$img imagecreate(8025);
        
imagecolorallocate($img173216230);
        
        
imagearc($imgrand(2060), rand(0,25), 8020rand(1,360), rand(1,360), imagecolorallocate($img150255150));
        
imagearc($imgrand(2060), rand(0,25), 8020rand(1,360), rand(1,360), imagecolorallocate($img255150150));
        
imagearc($imgrand(2060), rand(0,25), 8020rand(1,360), rand(1,360), imagecolorallocate($img150150255));
        
imagearc($imgrand(2060), rand(0,25), 8020rand(1,360), rand(1,360), imagecolorallocate($img255255150));
        
        
imageline($imgrand(080), rand(025), rand(080), rand(025), imagecolorallocate($img255255255));
        
imageline($imgrand(080), rand(025), rand(080), rand(025), imagecolorallocate($img255255255));
        
        
imageline($imgrand(080), rand(025), rand(080), rand(025), imagecolorallocate($img153153153));
        
imageline($imgrand(080), rand(025), rand(080), rand(025), imagecolorallocate($img153153153));
        
$str    str_split($str);
        
$posX    5;
        foreach(
$str as $char)
        {
            
imagechar($img10$posXrand(110), $charimagecolorallocate($img000));
            
$posX    += 13;
        }
        
$path    './StarthtmlContact/pictures/captcha/' md5(microtime()) . '_' time() . '.png';
        
imagepng($img,$path);
        
imagedestroy($img);
        return 
$path;
    }
}

Zuletzt bearbeitet von starthtml am 12.04.2009 um 12:34:52 Uhr
OFF Melden
12.04.2009 um 12:55:26
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Re: Captcha - Bewertungen+Verbesserungen
OK, danke ;)

ich hab mich aba noch nie mit oop beschäftigt :) muss mich da mal einarbeiten...

EDIT: Kennt jemand net GUTE Seite wo man oop mit php lernen kann?
hab bis jetzt nur murks gefunden..
wann sollte man eigentlich anfangen mit oop? erst wenn man "normales" php sau gut kann oder gleich von (fortgeschrittenem) anfang an?

Zuletzt bearbeitet von zwanzer am 12.04.2009 um 13:17:30 Uhr
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
12.04.2009 um 14:02:29
quark007
ModeratorenTeamLeiter

Avatar von quark007

Registriert: 23.05.2006
eBN-Alter: 3J 9M 24T

Beiträge: 1824
Verwarnungen: 0

eBytes: 38713.3

Titel: Re: Captcha - Bewertungen+Verbesserungen
OOP ist ja eigentlich nichts anderes als PHP... OOP ist nur eine gewisse andere Denkweise hinter PHP. Du überlegst dir im Vorhinein welche Funktionen dein Skript können sollte (Captcha-Bild erzeugen, Input validieren, vllt noch ne SpamSperre). Dann stellst du für jede dieser Aktionen eine Funktion auf. Diese kann man später auch noch zusammenfassen in eine Klasse (macht das einbinden in andere Skripte einfacher).

z.B.
function create_captcha($ip,$pfad,$komplexizititaet)
{
\\Random einen Code erstellen, der angezeigt werden soll
\\captcha erstellen mit den funktion create_image($code);
\\rückgeben des Pfades zur Bilddatei und speichern des codes in der Session
}
function create_image($code)
{
\\hier die ganzen Imagefunktionen
}

usw... du strukturierst den Kram einfach nur anders.

Ich habs über den eBN Code gelernt *oops* und dann halt bei schwereren Sachen gegoogled... nen Tut dazu kenn ich leider net... aber ich lern immer nach
Try and Error ;)
_______________________________

OFF Melden
12.04.2009 um 15:27:40
zwanzer


Avatar von zwanzer

Registriert: 03.05.2008
eBN-Alter: 1J 10M 13T

Beiträge: 231
Verwarnungen: 0

eBytes: 1286.42

Titel: Re: Captcha - Bewertungen+Verbesserungen
ok ;)

Naja ich glaub bei meinen (kleineren) Projekten mach ich weiter wie bis her :)

Also danke an alle ;)

Und... theeagle
Dein Code interessiert mich immer noch ;)
_______________________________

--|________|--
This is Nudelholz.
Copy Nudelholz in your signature to help him make better Kuchen and other Teigprodukte.
OFF Melden
12.04.2009 um 16:15:03
grubi
Administrator

Avatar von grubi

Registriert: 21.05.2006
eBN-Alter: 3J 9M 26T

Beiträge: 982
Verwarnungen: 0

eBytes: 65941.59

Titel: Re: Captcha - Bewertungen+Verbesserungen
Das Script von TheEagle arbeitet sicherlich mit der Funktion fsockopen() und immitiert so einen Browser. Sprich er schickt die Anfrage an den Webserver und erhält eine Antwort.

Mit OOP zu arbeiten lohnt sich aber auf jedenfall. Egal, wie klein das Projekt ist. Ich hab es nach einieger Zeit gemerkt, dass man so Scripte aus einem anderen Projekt einfach übernehmen kann, ohne viel Aufwandt.
_______________________________

Zitat von Martin Fowler:
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

==>
PHP-Code:
 (2*B) || !(2*B) == "that's the question!" 
OFF Melden
Interessantes

eByteNet » Forum » Programmieren » PHP & MySQL » Mein Captcha - Bewertungen+Verbesserungen
Seiten: 1 2 3 >

Du hast in diesem Forum keine Schreibrechte!