Tutorials
[ Zurück ]


Spamschutz mittels Captcha


Moin moin,

Ich melde mich wieder der Versprochenen neuen Klasse. Ich habe dafür meine Captcha Klasse ausgesucht. Da es sich hier um Tuts handelt werde ich auch etwas erklären =) Aber nicht die Klasse. Die werde ich euch so posten und ehr erklären, wie man sie verwendet!

Was ist ein Captcha???:

Ein Captcha ist ein Bild in dem Zeichen sind. Dieses kennt ihr z.B. von ICQ, wenn man sich ein neues Konto einrichtet! Man muss aus einem Bild Zeichen abtippen, eine Rechenaufgabe lösen oder Ähnliches!

Und wofür braucht man so einen Mist???:

Das ist kein Mist! Denn wenn es das nicht gäbe, könnte man ja einen Bot schreiben, der sich immer wieder bei z.B. ICQ anmeldet! Mit einem Captcha ist das jedoch nicht möglich, da Bots normalerweiße nicht aus Bildern lesen können! Captchas werden auch oft bei Gästebücher verwenet!


Also hier die Klasse:

Code:
<?php

       /**

     * Captcha Class for Xboard 2.1.3

     *

     * @author Maximilian Schmidt

     * @version 1.32

     * @package Secure Package

     * @copyright xTreme Board Software and Maximilian Schmidt

     *

     */

    class Xcaptcha

    {

        private $icons;

        private $iconsSum;

        private $iconWidth;

        private $captchaHeight;

        private $sessionName;

        private $font;

        private $imageType;

       

        public function __construct($icons = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"), $imageType = "png", $iconsSum = 10, $font = "arial.ttf", $captchaHeight = 50, $iconWidth = 20, $sessionName = "code")

        {

            switch(strtolower($imageType))

            {

                case "png":  $imageType = "png";  break;

                case "gif":  $imageType = "gif";  break;

                case "jpeg": $imageType = "jpeg"; break;

                case "jpg":  $imageType = "jpeg"; break;

                default:     $imageType = "png";  break;

            }

           

            $this -> icons         = $icons;

            $this -> iconsSum      = $iconsSum;

            $this -> iconWidth     = $iconWidth;

            $this -> captchaHeight = $captchaHeight;

            $this -> sessionName   = $sessionName;

            $this -> font          = $font;

            $this -> imageType     = $imageType;

        }

       

        public function sendHeader()

        {

            header("Cache-Control: no-cache, must-revalidate");

            header("Content-type: image/" . $this -> imageType);

        }

       

        public function captcha($return = false)

        {

            srand((double)microtime()*10000000);

           

           

            $x = $this -> iconWidth * $this -> iconsSum + 4;

            $y = $this -> captchaHeight;

           

            $img = imagecreate($x,$y);

           

            $color_body = imagecolorallocate($img,255,255,255);

            $color_b    = imagecolorallocate($img,0,150,200);

            $color_l    = imagecolorallocate($img,200,200,200);

           

            $securecode = '';

           

            for($i=rand()%12; $i<$y; $i+=rand()%12)

            {

                ImageLine($img, 0, $i, $x, $i, $color_l);

            }

           

            for($i=rand()%12; $i<$x; $i+=rand()%12)

            {

                ImageLine($img, $i, 0, $i, $y, $color_l);

            }

           

            for($i=rand()%10;$i<$x;$i+=rand()%9)

            {

                ImageLine($img, 0, rand(0, $x), 0, rand(0, $y), $color_l);

            }

           

            for($i=rand()%10;$i<$x;$i+=rand()%9)

            {

                ImageLine($img, rand(0, $x), 0, rand(0, $y), 0, $color_l);

            }

           

            ImageLine($img, 0, 0, $x, 0, $color_b);

            ImageLine($img, 0, $y-1, $x, $y-1, $color_b);

            ImageLine($img, 0, 0, 0, $y-1, $color_b);

            ImageLine($img, $x-1, 0, $x-1, $y-1, $color_b);

           

            for($i = 0; $i < count($this -> icons); $i++)

            {

                $mzahl = $this -> icons[rand(0,count($this -> icons))];

                $securecode .= $mzahl;

               

                ImageTTFText ($img, rand(10,14), rand(-20,20), $i * $this -> iconWidth + 3, rand(25,40), imagecolorallocate($img,rand(77,255),rand(20,170),rand(50,200)), $this -> font, $mzahl);

            }

           

            $_SESSION[$this -> sessionName] = $securecode;

           

            if(!$return)

            {

                switch(strtolower($imageType))

                {

                    case "png":  imagepng($img);  break;

                    case "gif":  imagegif($img);  break;

                    case "jpeg": imagejpeg($img); break;

                    case "jpg":  imagejpeg($img); break;

                    default:     imagepng($img);  break;

                }

            }

            else

            {

                return $img;

            }

        }

    }

?>



Diese könnt ihr in ein neues Skript einfügen oder sie in eure Includes tun.

So, ich erkläre euch jetzt wie ihr sie anwendet:

1.) Neue Instanz erzeugen

Code:


<?php

$captcha = new Xcaptcha();

?>





2.) Zeichen festlegen, also die, die dann angezeigt werden(Tipp: Verwendet keine O's, da sie mit 0 verwechselt weren können!!!)

Code:


<?php

$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



$captcha = new Xcaptcha();

?>





In dem folgenden Captcha werden also nun Zeichen von 0 bis 9 angezeigt!

3.) Tue eine Schriftart Datei in den Ordner, in dem du die Captcha Datei abspeicherts(du findest Schriftarten in der Systemsteurung -> Schriftarten)

4.) Einstellungen festlegen(Bitte Kommentare beachten):

Code:


<?php

$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha();

?>




5.) Einstellungen an Klasse übergeben

Code:


<?php

$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha($zeichen, $type, $anzahlZeichen, $font, $hoehe, $breiteZeichen, $sessionName);

?>




6.) Header ausgeben(Ist sehr wichtig, damit der Browser weiß, dass es sich um eine Grafik handelt) ACHTUNG: Vor dem Ausgeben des Headers Darf keine!!! Ausgabe durch PHP erfolgen(echo, print), und es darf Nichts vo dem <?php stehem(auch kein Leerzeichen oder so!!!)

Code:


<?php

$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha($zeichen, $type, $anzahlZeichen, $font, $hoehe, $breiteZeichen, $sessionName);



$captcha -> sendHeader();

?>





7.) Ausgeben des Captchas

Code:


<?php

$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha($zeichen, $type, $anzahlZeichen, $font, $hoehe, $breiteZeichen, $sessionName);



$captcha -> sendHeader();

$captcha -> captcha();

?>




8.) Habe ich vergessen: session_start durchführen, damit der Code weiterverarbeitet werden kann!

Code:


<?php

session_start();



$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha($zeichen, $type, $anzahlZeichen, $font, $hoehe, $breiteZeichen, $sessionName);



$captcha -> sendHeader();

$captcha -> captcha();

?>




9.) So, diese Datei sollte so aussehen. Speichert sie bitte als captcha.php!(Natürlich könnt ihr sie auch anders nennen, nur müsst ihr den Dateinamen in den folgenden Beispielen anpassen):

Code:


<?php

/**

     * Captcha Class for Xboard 2.1.3

     *

     * @author Maximilian Schmidt

     * @version 1.32

     * @package Secure Package

     * @copyright xTreme Board Software and Maximilian Schmidt

     *

     */

    class Xcaptcha

    {

        private $icons;

        private $iconsSum;

        private $iconWidth;

        private $captchaHeight;

        private $sessionName;

        private $font;

        private $imageType;

       

        public function __construct($icons = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"), $imageType = "png", $iconsSum = 10, $font = "arial.ttf", $captchaHeight = 50, $iconWidth = 20, $sessionName = "code")

        {

            switch(strtolower($imageType))

            {

                case "png":  $imageType = "png";  break;

                case "gif":  $imageType = "gif";  break;

                case "jpeg": $imageType = "jpeg"; break;

                case "jpg":  $imageType = "jpeg"; break;

                default:     $imageType = "png";  break;

            }

           

            $this -> icons         = $icons;

            $this -> iconsSum      = $iconsSum;

            $this -> iconWidth     = $iconWidth;

            $this -> captchaHeight = $captchaHeight;

            $this -> sessionName   = $sessionName;

            $this -> font          = $font;

            $this -> imageType     = $imageType;

        }

       

        public function sendHeader()

        {

            header("Cache-Control: no-cache, must-revalidate");

            header("Content-type: image/" . $this -> imageType);

        }

       

        public function captcha($return = false)

        {

            srand((double)microtime()*10000000);

           

           

            $x = $this -> iconWidth * $this -> iconsSum + 4;

            $y = $this -> captchaHeight;

           

            $img = imagecreate($x,$y);

           

            $color_body = imagecolorallocate($img,255,255,255);

            $color_b    = imagecolorallocate($img,0,150,200);

            $color_l    = imagecolorallocate($img,200,200,200);

           

            $securecode = '';

           

            for($i=rand()%12; $i<$y; $i+=rand()%12)

            {

                ImageLine($img, 0, $i, $x, $i, $color_l);

            }

           

            for($i=rand()%12; $i<$x; $i+=rand()%12)

            {

                ImageLine($img, $i, 0, $i, $y, $color_l);

            }

           

            for($i=rand()%10;$i<$x;$i+=rand()%9)

            {

                ImageLine($img, 0, rand(0, $x), 0, rand(0, $y), $color_l);

            }

           

            for($i=rand()%10;$i<$x;$i+=rand()%9)

            {

                ImageLine($img, rand(0, $x), 0, rand(0, $y), 0, $color_l);

            }

           

            ImageLine($img, 0, 0, $x, 0, $color_b);

            ImageLine($img, 0, $y-1, $x, $y-1, $color_b);

            ImageLine($img, 0, 0, 0, $y-1, $color_b);

            ImageLine($img, $x-1, 0, $x-1, $y-1, $color_b);

           

            for($i = 0; $i < count($this -> icons); $i++)

            {

                $mzahl = $this -> icons[rand(0,count($this -> icons))];

                $securecode .= $mzahl;

               

                ImageTTFText ($img, rand(10,14), rand(-20,20), $i * $this -> iconWidth + 3, rand(25,40), imagecolorallocate($img,rand(77,255),rand(20,170),rand(50,200)), $this -> font, $mzahl);

            }

           

            $_SESSION[$this -> sessionName] = $securecode;

           

            if(!$return)

            {

                switch(strtolower($imageType))

                {

                    case "png":  imagepng($img);  break;

                    case "gif":  imagegif($img);  break;

                    case "jpeg": imagejpeg($img); break;

                    case "jpg":  imagejpeg($img); break;

                    default:     imagepng($img);  break;

                }

            }

            else

            {

                return $img;

            }

        }

    }



session_start();



$zeichen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");



// Hoehe des Captchas in Pixel

$hoehe = 50;



// Anzahl der Zeichen(empfohlen: zwischen 4 und 10)

$anzahlZeichen = 10;



// Breite eines Zeichens(empfohlen: 20)

$breiteZeichen = 20;



// SESSION Name: Der Code wird später in die Variable SESSION[] gespeichert, dazu später mehr...

$sessionName = "code";



// Dateipfad zur Font Datei(Bitte anpassen!!!!)

$font = "arial.ttf";



// Typ der Grafik(PNG, GIF, JPEG)

$type = "png";



$captcha = new Xcaptcha($zeichen, $type, $anzahlZeichen, $font, $hoehe, $breiteZeichen, $sessionName);



$captcha -> sendHeader();

$captcha -> captcha();

?>




So, jetzt braucht ihr ein Formular, dass ihr vor Spam schützen wollt, nehmen wir als Beispiel einen Newslettereintrag.
10.) Schreibt einfach dieses Musterformular ab, und speichert es als newsletter.html ab:

Code:


<html>

<head>

<title>Newsletter</title>

</head>

<body>

<form action="save.php" method="post">

Name: <input type="text" name="name" /><br />

E-Mail: <input type="text" name="mail" /><br />

Bitte tippen sie den folgenden Text ab: <img src="captcha.php" alt="Bitte aktivieren sie Bilder!" /><br />

<input type="text" name="captcha" /><br />

<br />

<input type="submit" value="Eintragen!" />

</form>

</body>

</html>



Ich erkläre kurz, was das Formular oben macht. Es wird nach Name und E-Mail gefragr, darunter wird das Captcha aufgerufen, welches man abtippen muss.

11.) Nun kommt die Datei save.php, in der in diesem Beispiel, der Name, die E-Mail und der abgetippte Code gesand wird:

Code:


<?php

session_start();



// Pruefen ob alles ausgefuellt wurde

if($_POST['name'] && $_POST['mail'] && $_POST['captcha'])

{

    $sessionName = "code"; // <-- Hier der sessionName eingeben, den ihr oben benutzt habt! Wenn ihr ihn oben gelassen habt, lasst es auch hier stehen



    if($_SESSION[$sessionName] == $_POST['captcha'])

    {

        // Daten können weitervearbeitet werden, Code richtig abgetippt

        echo "Vielen Dank!";

    }

    else

    {

        echo "Code falsch abgetippt!!!";

    }

}

?>




12.) So, ihr solltet jetzt die Dateien newsletter.html, captcha.php und save.php in eurem Ordner haben! Dann könnt ihr es Testen


So, das war mein 2. Tut in Sachen PHP, ich hoffe, ihr habt alles verstanden und ich habe euch weitergeholfen!

Würde mich über einen Kommentar freuen! Bei Fragen, macht einfach nen Kommi =)

Und ich hoffe ich habe Nichts vergessen :D


Erstellt:11.03.09 21:58
Autor: WWW-Tools

Letzte Änderung:
Geändert von:

Bewertungen:3
Bewertung: 3.3

Freigeschaltet: Ja
Views 3811

Klicke einfach auf einen Stern!
Wollen Sie wirklich das Tutorial löschen?
Wollen Sie wirklich dieses Tutorial zulassen?
Betreff: Report tutorial [id = 63] !
Absender:
Kommentar:
Wollen Sie wirklich dieses Tutorial zulassen?
Absender:
Kommentar:
Folgende User sind hier gerade aktiv:
-

ANZEIGE