ERLEDIGT
NEIN
NEIN
ANTWORTEN
16
16
ZUGRIFFE
2254
2254
EMPFEHLEN
-
Guten Abend!
Ich habe ein kleines Problem. Ein Freund von mir brauchte eine Captcha Klasse für ein Forum. Ich habs versucht jedoch ohne viel Erfolg. Muss zudem gestehen, dass ich mich vorher nie mit den Imagefunktionen beschäftigt habe. Wäre nett wenn ihr mal über den Code schauen könntet und mir Fehler aufweisen könntet. Für ein Paar Tips zur Verbesserung bin ich natürlich auch offen. Ich suche jetzt schon seit zwei stunden und habe nichts richtiges gefunden. Wäre euch echt dankbar! Die Klasse sieht so aus:
Der Aufruf dieser Klasse sieht so aus:PHP-Code:<?php
error_reporting(E_ALL);
/* The Captcha class */
class Captcha
{
/*Captcha Variables*/
protected $font_face;
protected $captcha_string;
protected $blanko_image;
protected $captcha_image;
protected $captcha_width = 150;
protected $captcha_height = 50;
protected $captcha_highlights = 50;
/**
* Creates a string with letters and numbers
*
* @name Captcha::create_string()
* @access public
* @return boolean
*/
public function create_string()
{
$letters = range('a','z');
$numbers = range(1,26);
$captcha = '';
for ($i = strlen($captcha); $i < 3; $i++)
{
$rnum = mt_rand(0,25);
$captcha[] = $numbers[$rnum];
unset($rnum);
$rlet = mt_rand(0,25);
$captcha[] = $letters[$rlet];
unset($rlet);
}
shuffle($captcha);
for ($i = 0; $i < count($captcha); $i++)
{
$this->captcha_string .= $captcha[$i];
}
$_SESSION['captcha'] = $this->captcha_string;
return true;
}
/**
* Creates a blanko-image for the captcha
*
* @name Captcha::create_blanko_image()
* @access public
* @return boolean
*/
public function create_blanko_image()
{
$font = mt_rand(1,5);
$this->font_face = $font;
$imgwidth = (strlen($this->captcha_string)*imagefontwidth($font)) + 10;
$imgheight = imagefontheight($font) + 10;
if ($imgwidth < $this->captcha_width) { $imgwidth = $this->captcha_width; }
if ($imgheight < $this->captcha_height) { $imgheight = $this->captcha_height; }
$blanko_image = imagecreate($imgwidth, $imgheight);
$this->blanko_image = $blanko_image;
return true;
}
/**
* Fills the blanko-image for the captcha
*
* @name Captcha::fill_blanko_image()
* @access public
* @return boolean
*/
public function fill_blanko_image()
{
for ($i = 0; $i < $this->captcha_highlights; $i++)
{
$colors[] = imagecolorallocate($this->blanko_image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
}
for ($i = 0; $i < $this->captcha_highlights; $i++)
{
imagerectangle($this->blanko_image, mt_rand(0,$this->captcha_width),mt_rand(0,$this->captcha_height),mt_rand(0,$this->captcha_width),mt_rand(0,$this->captcha_height), $colors[$i]);
imageline($this->blanko_image, mt_rand(0,$this->captcha_width),mt_rand(0,$this->captcha_height),mt_rand(0,$this->captcha_width),mt_rand(0,$this->captcha_height), $colors[$i]);
}
$captcha_image = imagestring($this->blanko_image,$this->font_face,10,10,$this->captcha_string,$colors[mt_rand(0,$this->captcha_highlights)]);
$this->captcha_image = $captcha_image;
return true;
}
/**
* Shows the finished captcha
*
* @name Captcha::show_captcha()
* @access public
* @return boolean
*/
public function show_captcha()
{
header("content-type: image/gif");
$this->create_string();
$this->create_blanko_image();
$this->fill_blanko_image();
imagegif($this->captcha_image);
imagedestroy($this->captcha_image);
return true;
}
}
?>
MfG, AndyPHP-Code:<?php
include ('Captcha.php');
$cap = new Captcha();
$cap->show_captcha();
?>
-
Hi,
öhm was tut denn nicht?
Wenn ich was verbessern würde, dann höchstens etwas ideologisches
Also ich würde eine rein statische Klasse schreiben.
Finde den Code "schöner" und kleine Vorteile sind:
- Es werden weniger Resourcen beansprucht, da keine Instanz erzeugt wird.
- Es muß beim "Aufruf" nicht instanziert werden.
Auch bin ich bei Namensgebung pingelig (Das hast Du nun davon, wenn Du nach "Tips" frägst
)
Bei mir würde der Aufruf demnach so aussehen:
*) Den Include kann man übrigens seit PHP5 automatisieren (grade bei größeren Projekten sehr zu empfehlen):PHP-Code:<?php
include ('Captcha.php'); // *
Captcha::run(); // **
?>
http://www.php.net/manual/de/function.spl-autoload.php
**) "einfacher und sparsamer", dadurch, dass noch weitere Methoden der Klasse aufgerufen werden, entsteht ein Ablauf, welchen ich persönlich mit "run" definiere. "show" wäre eine selbstständige Methode dieser Klasse. Ok, jetzt reicht es, sonst werde ich noch zu abstrakt
Aber nun zum Problem, einfach mal schildern, dann wissen wir "wo suchen".
Gruß tyg3rGeändert von Tyg3r (03.10.07 um 02:07 Uhr)
-
Guten Morgen!
Ich weiß leider selber nicht, was bzw. welcher Bereich nicht richtig funktioniert. Ich erhalte nur folgende Fehlermeldung:
Dürfte dich auch nicht richtig weiter bringen. Oder?Code :1
Die Grafik "http://www.puk.de/redway/captcha/captchatest.php" kann nicht angezeigt werden, weil sie Fehler enthält.
Was verstehst du unter rein statischer Klasse? Oder verstehst du darunter das alle Methoden statisch sind, nur Konstanten verwendet werden und sich eine Methode auf die Klasse als solches bezieht?
Oder sollen die Farben festgelegt sein. Also nicht per zufallsprinzip gewählt werden? Wäre nett wenn du ein Beispiel bringen könntest.
Den link sehe ich mir mal an und werde dann das Script demnach ändern.
Hätte dann aber noch eine Frage. Und zwar wie kann ich die Buchstaben und Ziffern, die ich in das Captcha eintrage rotieren? Und wie bekomme ich im Hintergrund diesen Rauscheffekt hin, den viele Captchas verwenden?
MfG, Andy
-
Verwende mal als Inhaltstyp „text/plain“ um mögliche Fehlermeldungen lesen zu können.
Markus Wulftange
-
03.10.07 11:01 #5
Für das Rauschen ist es am besten, ein paar Hintegründe in Photoshop, Gimp oder dem Grafikprogramm deiner Wahl zu erstellen und dann per imagecreatefromjpeg() oder ähnlicher Funktion zu laden, da sonst viel Rechenleistung verschwendet wird, wenn du sie von PHP on the fly generieren lässt.
Gruß mAu
──────────────────────────
Ich auf flickr
* Unformatierten Quellcode schaue ich mir _nicht_ an!
* Sollte ich euch bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen.
* Bitte die Netiquette beachten.
* Vergesst nicht, beantwortete Fragen als erledigt zu markieren!
-
03.10.07 11:56 #6
Zufällig letztens im RSS Feed gesehen:
Building an Image Generator Class with PHP5
Und als Nachfolger:
Adding Validation to an Image Generator Class with PHP5KIDS Kinderbetreuungsdienst
Xing
"When you play the game of thrones, you win or you die. There is no middle ground."
by Cersei Lannister in "A Game Of Thrones"
-
Morgen!
Also wenn ich, wie von Gumbo vorgeschlagen den Header ändere erhalte ich folgende Fehlermeldungen:
Die Klasse von Felix Jakobi hilft mir nur bedingt weiter, denn dann müsste ich ja noch eine weitere klasse Programmieren, die diese nutzt um dann ein Captcha zu erstellen. Jedoch ist dort die Idee von Font-color garnicht so schlecht.Code :1 2 3 4 5
Warning: Cannot modify header information - headers already sent by (output started at /home/redway/www/captcha/Captcha.php:2) in /home/redway/www/captcha/Captcha.php on line 129 Warning: imagegif(): supplied argument is not a valid Image resource in /home/redway/www/captcha/Captcha.php on line 135 Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/redway/www/captcha/Captcha.php on line 136
Nach dem Punkt "Buchstaben rotieren" habe ich nochmal selbst gesucht jedoch nichts gefunden. kann mir da jemand helfen?
Änder gerade nochmal die Klasse. Stell sie dann heute abend nochmal in der neuen Version rein.
MfG, Andy
-
03.10.07 14:04 #8
Die imagestring()-Funktion gibt entweder true oder false zurück. Deswegen musst du in der Captcha::showCaptcha()-Funktion folgendes ändern:
PHP-Code:imagegif($this->blanko_image);
imagedestroy($this->blanko_image);
Gruß mAu
──────────────────────────
Ich auf flickr
* Unformatierten Quellcode schaue ich mir _nicht_ an!
* Sollte ich euch bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen.
* Bitte die Netiquette beachten.
* Vergesst nicht, beantwortete Fragen als erledigt zu markieren!
-
Hi,
Das verstehe ich unter statisch, also Methoden und Variablen statisch.PHP-Code:<?php
error_reporting(E_ALL);
/* The Captcha class */
class Captcha
{
/* public vars */
public static $length = 6;
/* private vars */
private static $font;
private static $width = 150;
private static $height = 50;
private static $highlights = 50;
/**
* Run captcha application
*
* @name Captcha::run()
* @access public
* @return boolean
*/
public static function run(){
header("content-type: image/gif");
$str = self::create_string();
$img = self::create_blanko_image($str);
$img = self::fill_blanko_image($img, $str);
imagegif($img);
imagedestroy($img);
return true;
}
/**
* Creates a string with letters and numbers
*
* @name Captcha::create_string()
* @access private
* @return string
*/
private static function create_string(){
$chars = array_merge(
range('0', '9'),
range('a', 'z')
);
mt_srand((double)microtime()*1000000);
for ($i = 1; $i <= (count($chars)*2); $i++){
$_key = mt_rand(0,count($chars)-1);
$_tmp = $chars[$_key];
$chars[$_key] = $chars[0];
$chars[0] = $_tmp;
}
return substr(implode('',$chars),0,self::$length);
}
/**
* Creates a blanko-image for the captcha
*
* @name Captcha::create_blanko_image()
* @access private
* @param String $str
* @return img object
*/
private static function create_blanko_image($str){
self::$font = mt_rand(1,5);
$imgwidth = (strlen($str)*imagefontwidth(self::$font)) + 10;
$imgheight = imagefontheight(self::$font) + 10;
if ($imgwidth < self::$width)
$imgwidth = self::$width;
if ($imgheight < self::$height)
$imgheight = self::$height;
return imagecreate($imgwidth, $imgheight);
}
/**
* Fills the blanko-image for the captcha
*
* @name Captcha::fill_blanko_image()
* @access private static
* @param img object $img
* @param String $str
* @return img object
*/
private static function fill_blanko_image($img, $str){
for ($i = 0; $i < self::$highlights; $i++) {
$colors[] = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
}
for ($i = 0; $i < self::$highlights; $i++) {
imagerectangle($img, mt_rand(0,self::$width),mt_rand(0,self::$height),mt_rand(0,self::$width),mt_rand(0,self::$height), $colors[$i]);
imageline($img, mt_rand(0,self::$width),mt_rand(0,self::$height),mt_rand(0,self::$width),mt_rand(0,self::$height), $colors[$i]);
}
return imagestring($img,self::$font,10,10,$str,$colors[mt_rand(0,self::$highlights)]);
}
}
?>
Der Aufruf wäre dann wie folgt möglich:
Ist halt stark Geschmackssache =)PHP-Code:<?php
include ('Captcha.php');
Captcha::$length = 10;
Captcha::run();
?>
Mir gefällt es so besser. In den meisten Fällen benötigt man keine Objekte der Klassen.
Wegen dem Fehler, versuch doch mal das Blanco auszugeben:
Gruß tyg3rPHP-Code:<?php
$img = self::create_blanko_image($str);
imagegif($img);
?>
-
Hallo!
Danke nochmal für eure tollen Tipps und Anregungen. Ich werde das in meine Klasse einbauen und einiges nochmal ändern. Ich poste dann die fertige Klasse heute Abend nochmal hier im Forum, da ich jetzt erstma weg muss.
MfG, Andy
-
Guten Morgen!
Es ist vollbracht! Die Captcha-Klasse ist fertig geschrieben. Das Ergebnis kann hier betrachtet werden.
Ich möchte anmerken, dass für dieses Captcha keine Bilder verwendet werden. Alles wird automatisch generiert, auch der Farbverlauf im Hintergrund.
Ich habe nur ein Problem. Es kann irgendwie nach dem Aufruf der Klasse keine Ausgabe mehr gemacht werden. Wieso?
MfG, AndyPHP-Code:<?php
include ('Captcha.php');
Captcha::run();
echo 'Inhalt Captcha-SESSION: '.$_SESSION['captcha'];
?>Geändert von Avedo (04.10.07 um 16:46 Uhr)
-
07.10.07 00:52 #12
Nun schon 2.5 Tage her, aber ich möchte dir dennoch gerne antworten:
Lass dir mal den "Quelltext" der Ausgabe darstellen - Dort solltest du dann den String "Inhalt Captcha-SESSION: SID" zu sehen bekommen - Der Browser verarbeitet jedoch während des Rendering-Prozesses den gesendeten Inhaltstyp, der in deinem Fall Image/Gif ist, und demnach stellt der Browser auch einfach eine Grafik vom Typ Gif dar. Dass die Zeichen des Strings nicht verarbeitet werden, liegt daran, dass diese nur scheinbar nicht verarbeitet werden - Sie liegen außerhalb der Bildausmaße und werden somit nicht für die sichtbare Grafik verarbeitet. Das ist übrigens auch nützlich, wenn man Archive und Bilddaten zu einer Masse vermengen möchte um zB Daten zu versteckenPHP-Code:public static function run(){
header("content-type: image/gif");
// ...
}
-
Hallo!
Es ist schwer sich den Seitenquelltext ausgeben zu lassen wenn der Contenttype - image/gif ist. Kannste ja mal bei meinem Beispiellink versuchen.
Wie muss ich das ganze denn jetzt ändern, damit ich das ganze zum Beispiel in eine Seite mit einem Formular einbauen kann, ohne dass die Seite und das Formular versteckt werden? Kann ich da einen allgemeineren Contenttype wählen?
Wäre dir für deine Antwort sehr dankbar.
MfG, Andy
-
07.10.07 14:56 #14
Du musst eine Datei erstellen, die sich nur um die Ausgabe des Captchas kümmert. Diese kannst du dann mit einem normalen img-Tag ansprechen und das Captcha wird ausgegeben.
PHP-Code:// captcha.php
include ('Captcha.php');
Captcha::run();
Gruß mAu
──────────────────────────
Ich auf flickr
* Unformatierten Quellcode schaue ich mir _nicht_ an!
* Sollte ich euch bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen.
* Bitte die Netiquette beachten.
* Vergesst nicht, beantwortete Fragen als erledigt zu markieren!
-
07.10.07 15:12 #15
Unmöglich ist es aber nicht - zB mit dem Firefox Bon Echo, der mir das hier ausspuckt:
Code :1 2 3
GIF87aK��„��trt<:<¬ª¬ŒŽŒTVT|~|DFDœšœdbd,*,tvt<><¼Òì”’”\Z\$"$„†„LNL¤¢¤ljl424���������������������,����K���þ $Ždižhª®*à¾p,Ï®€5t®ÓWß‹ pH,‡6Æq9¼à�O_(bX¯X…D‚íz½Á—!-_ €ñXdh&møv«pÃßñ8âîfÂfn‚ƒ„…‚"‰Š‰s‹{‹a”—˜˜"œsžž’£ž¨®¯°"«µ ¡·¶’´¿¿¶¶¿´´Ãȷ˼¼³a6a¡&дÐ%6ÑÙ߬Ѭ ÆååÒ"ðññsï’ïö"ûðôùƒ¯ <î)D�Ð ˆ ’@<1¢I-BÀ·1BECF‹ˆÐþSj¬À²ÂÖ/²l�‚K›"´¬ÉòeO›" ¼I èΣ;EXºTi8’pêÒjB`ê´€,DXø%¢hѬLÓr…Ð Ìuê;%@Õ˶J%àK€Ba]ºD(X¬àÀ⋌8P ¤âËç<ª�ób„˜%0q!€éÓŒS?†pAAëHøp×eÖ¤c³¾€—åÖÿê0œ¸ƒ²X¹nÝcùrÒ¦AœzñÇ!L×^štëÛ‰›&qz»„ìÚ ”¶aº´{ñ"jˆw>öɇwO½Ø’ÅE_mèeG`\aÔ·§`và ƒ§•&Þ{<(~Fð Bvh!J`Ÿƒ Zhƒ‡Ð•GÁŠ,¶è¢‹ø9°bI/ÖÈ¢ 6Úh�re�)dfi$ÄE䑹$“PFYTüÁ•Xf©å–X&`–Jr)æ˜d^é†�& æšlªA›l"çœnÎù¦t²é‡X”T’—éøéå J¨œ†J( Ð衈.Z¨;²`饘fZB�;[b]Inhalt Captcha-SESSION: xSK30y[/b]
mAu hat es bereits gesagt - Einbinden kannst du das über einen weiteren Aufruf in einem HTML-Dokument. Wie aber kannst du nun das Captcha überprüfen? Meistens wählt man den Umweg über eine Datenbank, in der für x Sekunden eine Captcha Zeichenkette mit einem Identifikator (zB Session-ID) gespeichert wird. Diese SID wird nun verwendet um über den gesamten Prozess der Aufrufe die gleiche Captcha-Zeichenkette benutzen zu können. In sofern würde ich deine Captcha::run() erweitern um ein Captcha::run($string). $string erhälst du aus der Datenbank, aus der du mit der SID als Index eben diesen ausliest und verwertest. Nach der Eingabe überprüfst du dann, ob $_POST['captchainput'] auch mit dem Eintrag des Captchastring in der DB übereinstimmt.
Ähnliche Themen
-
Mit einer Klasse Objekte für eine andere Klasse erstellen.
Von New2Java im Forum Java GrundlagenAntworten: 14Letzter Beitrag: 21.11.10, 12:37 -
Member-Variable einer MFC-Klasse in einfache Klasse einfügen
Von cappa555 im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 12.12.08, 17:33 -
Problem mit Captcha Klasse
Von ne0hype im Forum PHPAntworten: 5Letzter Beitrag: 25.05.08, 16:27 -
[JSP] Captcha
Von SeeSharpNewBee im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 13.02.08, 14:26 -
Variablenwert von einer Klasse in eine andere Klasse geben
Von spiderman21 im Forum JavaAntworten: 2Letzter Beitrag: 02.01.07, 16:27





Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren