Webwolf: Captcha-Erzeugung friert ein nach x Anfragen

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);  
	}  
}  

  1. Meine Herren!

    Die Symptome deuten auf ein fehlerhaft konfiguriertes Caching des Webservers hin. Ist vielleicht CacheStoreNoStore gesetzt?

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. 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
      
      1. 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.

        --
        “All right, then, I'll go to hell.” – Huck Finn
  2. 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/)
    
  3. 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