Captcha-Erzeugung friert ein nach x Anfragen
Webwolf
- php
0 1UnitedPower0 Webwolf
0 Auge0 hotti
Hallo.
Ich bin schon lange auf der Suche nach einer Lösung. Websuchen ergaben leider keine entsprechende Hilfe. Deshalb auch mein Beitrag. :)
Es geht hierbei NICHT um die eigentliche Implementierung eines Captchas sondern vielmehr um die Anzeige bzw. des Neuladens des Bildes im Browser.
Beobachtung (Problemstellung):
Nach einem Neustart des Webservers (Apache 2.4.4) funktioniert die Anzeige und das Neuladen des Bildes wie gewünscht normal. Doch nachdem einige (~20) Captchas generiert worden sind (also nach x Anfragen von versch. Captchas) wiederholen sich die zuletzt generierten ~2-4 Captchas in zufälliger Reihenfolge und es kommen keine neuen mehr. Manchmal wird and Ende sogar nur noch ein Bild angezeigt (Cachelöschen oder Neustarten des Browsers helfen hier nicht).
Wartet man allerdings einige Zeit ab oder startet man den Webserver neu, kommen wieder neu generierte Bilder (Webserver hat Speicher/Cache geleert??). Das o.g. Szenario tritt wiederholt ein. Der in der Session gespeicherte String(=$captcha) wird immer korrekt im Bild angezeigt.
Ob der Fehler beim Webserver oder beim Browser zu suchen ist, kann ich leider nicht sagen. Da sich allerdings Session und Bild immer einig sind und ein Webserver-Neustart hilft, vermute ich, dass der Fehler bei mir (also beim Server/Apache/PHP?) zu suchen ist. Den JS Code habe ich dennoch angefügt.
Ich würde zunächst gerne wissen, was hier genau dieses Verhalten verursacht und ob man das überhaupt in den Griff bekommt. Wie man letztendlich dieses "Problem" beseitigen kann, versuche ich, nachdem ich die Ursache begriffen habe.
Ich hoffe, dass mir jemand bei dieser Sache helfen kann und die von mir angegebenen Codeauszüge für eine Analyse reichen. Danke! :)
;php.ini
max_execution_time=30
max_input_time=60
memory_limit=128M
// captcha.php (8.09 KB)
$fonts = array(
'font1.ttf', // Filesize: 48.9 KB
'font2.ttf', // Filesize: 45.0 KB
'font3.otf', // Filesize: 303 KB
'font4.ttf', // Filesize: 122 KB
'font5.ttf', // Filesize: 101 KB
'font6.ttf' // Filesize: 54.8 KB
// ------------------
// 674.7 KB
);
// .....
$img = imagecreatetruecolor($img_width, $img_height);
// .....
for($i=0;$i<$captcha_lenght;$i++) {
// .....
$font = $font_path.$fonts[rand(0, count($fonts) - 1)];
// .....
}
// .....
$_SESSION['captcha'] = $captcha;
header("Expires: Tue, 01 Jan 2013 00: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("Cache-directive: no-cache");
header("Pragma: no-cache");
header('Content-type: image/png',true);
imagepng($img);
imagedestroy($img); // free from memory
// script.js
this.get_new_captcha = function (callback) {
var $captcha = $('img#captcha');
var $container = $captcha.parent();
// Show loading
$captcha.hide();
$container.html('loading...');
var img = new Image();
// Get Stock image src
img.stock_src = $captcha.attr('src').split('?')[0]; // captcha.php
// Get new src
img.src = img.stock_src + '?rand=' +(new Date()).getTime();
// replace captcha
img.onload = function() {
$captcha.remove();
img.id = 'captcha';
$container.html(img);
}
}
Meine Herren!
Die Symptome deuten auf ein fehlerhaft konfiguriertes Caching des Webservers hin. Ist vielleicht CacheStoreNoStore gesetzt?
Meine Herren!
Die Symptome deuten auf ein fehlerhaft konfiguriertes Caching des Webservers hin. Ist vielleicht CacheStoreNoStore gesetzt?
Danke für den schnellen und informativen Beitrag.
Ich bin mit der Konfiguration von Apache leider nicht sehr gut vertraut, zumindest was das Cachen angeht (wie man wohl bereits vermutet). CacheStoreNoStore ist nirgendwo gesetzt bzw. zu finden. Es handelt sich hierbei um Werkseinstellungen einer XAMPP Installation. Das entsprechende Modul ist in meiner httpd.conf auskommentiert:
#LoadModule cache_module modules/mod_cache.so
Sollte man das Modul verwenden? Wird mir die Nutzung weiter helfen?
Mir ist darüber hinaus aufgefallen, dass bereits geladene Captchas auch nach Neustart des Servers wieder gezeigt werden und das immer in der gleichen Reihenfolge. Ein Server-Neustart bringt mich lediglich an den Anfang dieser Geschichte. Am Ende bleibt die Ausgabe bei ein und demselben Bild stecken.
Versucht habe ich bisher u.a. auch:
#httpd.conf
EnableSendfile off
#php.ini
eaccelerator.enable 0
eaccelerator.optimizer 0
xcache.cacher Off
xcache.size 0
xcache.stat Off
Meine Herren!
Danke für den schnellen und informativen Beitrag.
Ich bin mit der Konfiguration von Apache leider nicht sehr gut vertraut, zumindest was das Cachen angeht (wie man wohl bereits vermutet).
Wer ist das schon? Die Apache-Konfiguration ist eine lästige, schwierige Geschichte.
CacheStoreNoStore ist nirgendwo gesetzt bzw. zu finden […] Das entsprechende Modul ist in meiner httpd.conf auskommentiert:
Dann können wir das wohl als Fehlerursache ausschließen. Auges Vorschläge klingen in meinen Ohren auch viel versprechend, da würde ich an deiner Stelle mit der Fehlersuche fortfahren.
#LoadModule cache_module modules/mod_cache.so
Sollte man das Modul verwenden? Wird mir die Nutzung weiter helfen?
Jein. Caching ist eine Optimierung, die der Effizient des Servers dienen soll. Wenn man kein Problem mit der Auslastung bzw. der Performanz hat, dann muss man da auch nicht schrauben. Im schlimmsten Fall macht man sich das Leben nur schwerer. Mit Caching im Allgemeinen sollte man sich dennoch mal befasst haben.
Hallo
Ich hoffe, dass mir jemand bei dieser Sache helfen kann und die von mir angegebenen Codeauszüge für eine Analyse reichen. Danke! :)
Die reichen, so vermute ich zumindest, nicht.
$fonts = array(
'font1.ttf', // Filesize: 48.9 KB
'font2.ttf', // Filesize: 45.0 KB
'font3.otf', // Filesize: 303 KB
'font4.ttf', // Filesize: 122 KB
'font5.ttf', // Filesize: 101 KB
'font6.ttf' // Filesize: 54.8 KB
);
// .....
$img = imagecreatetruecolor($img_width, $img_height);
// .....
for($i=0;$i<$captcha_lenght;$i++) {
// .....
$font = $font_path.$fonts[rand(0, count($fonts) - 1)];
// .....
}
// .....
imagepng($img);
imagedestroy($img); // free from memory
Es ist ja nett, zu wissen, wie du die Schriftart zuweist, aber wie der Text für das Captcha ausgewählt und dorthinein eingefügt wird, verbirgt sich hinter den `// .....`{:.language-php}. Deine Beschreibung lässt mich vermuten, dass der Zufall, der normalerweise für eine – wie sollte es anders sein – zufällige Zeichenzusammenstellung sorgen soll, nicht funktioniert. Ob ich richtig vermute, würde sich wohl irgendwo in den nicht gezeigten Codeteilen zeigen.
Tschö, Auge
--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
[Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
hi,
Ich bin schon lange auf der Suche nach einer Lösung. Websuchen ergaben leider keine entsprechende Hilfe. Deshalb auch mein Beitrag. :)
Es geht hierbei NICHT um die eigentliche Implementierung eines Captchas sondern vielmehr um die Anzeige bzw. des Neuladens des Bildes im Browser.
Ganz oifach ;)
Nein, ich sag das nicht: Warum das Rad neu erfinden. Nein, das sage ich nicht. Wer sowas sagt, ist dumm. Aber reCaptcha ist eine Idee, wenn Du das Rad nicht neu erfinden willst. Nein, Du willst das Rad nicht neu erfinden, Du willst einen sicheren Spamschutz? Hehe, sicher ist gar nichts ;)
MfG