Wie wird das Captcha überprüft?

Hi

wie wird das CAPTCHA eigentlich überprüft? Im blog - Beispiel sehe ich lediglich dass, das Captcha aufgerufen wird, aber nirgendwo eine Überprüfung stattfindet.

Mein Problem ist das mein CAPTCHA immer fehlschlägt.

Model




public $checkCode;


rules....

array('checkCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'message' => 'Das eingegeben CAPTCHA stimmt nicht überein.'),



Im View rufe ich das CAPTCHA auf


<?php 

if(extension_loaded('gd')): ?>

Geben Sie die angzeigten Buchstaben / Zahlen aus dem Bild ein. <br/>

<?php $this->widget('CCaptcha'); ?>

<?php echo CHtml::activeTextField($model, 'checkCode'); ?>

<?php endif;?>

Im Controller überprüfe ich nirgendwo auf Korrektheit, aber ich wüsste grad auch nicht wie ich das überprüfen sollte.

Die Validierung findet im Model statt, sieh dir das Contact-formular bei einer Standardinstallation an

die captcha-action muss zusätzlich in den access-rules definiert sein, damit auch Zugriff möglich ist

Ich habe den Code aus der Standardinstallation genommen und einfach eingefügt.

Die accessRules() sind auch schon angepasst.


	public function accessRules()

	{

		return array(

			array('allow',

				'actions'	=>	array('list','show', 'thankyou', 'captcha'),

Ich bekomme halt ständig die Fehlermeldung das

Das eingegeben CAPTCHA stimmt nicht überein


array('checkCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'message' => 'Das eingegeben CAPTCHA stimmt nicht überein.'),

mit welcher version arbeitest du?

Der letzten

1.0.10

Geht dir vielleicht zwischen durch die Session verloren? Dann kann man das Captcha auch nicht mehr validieren.

safeAttributes?

Nein geht sie nicht

Nein benutze ich nicht

Mein Model system_suggestions.php


public $verifyCode;


public function rules()

{

	array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd'), 'message' => 'Das eingegeben CAPTCHA stimmt nicht überein.'),

}

Mein Controller system_suggestionsController.php




public function accessRules()

{

	return array(

		array('allow',  // allow all users to perform 'list' and 'show' actions

			'actions'=>array('list','show', 'captcha'),

			'users'=>array('*'),

		),

	)

}


public function actions()

{

	return array(

		'captcha'=>array(

			'class'=>'CCaptchaAction',

			'backColor'=>0xEBF4FB,

		),

	);

}

Meine View


<?php if(extension_loaded('gd')): ?>

Geben Sie die angzeigten Buchstaben / Zahlen aus dem Bild ein. <br/>

<?php $this->widget('CCaptcha'); ?>

<input type="text" name="suggestions[verifyCode]">

<?php endif; ?>

<?php echo CHtml::error($model, 'verifyCode'); ?>



Mein Rückgabewert von $_POST


<?php print_r($_POST); ?>

Array

(

    [suggestions] => Array

        (

            [comment] => geht so

            [verifyCode] => bouusa

        )


    [yt1] => Vorschlagen

)



Meine Antwort

Das eingegeben CAPTCHA stimmt nicht überein.

Ich verstehe nicht wo der Fehler liegt!!!

Das ist zum Mäuse melken

Solltest du aber, sofern du ein AR als Model verwendest. ;) verifyCode ist ja kein DB-Attribut und daher per default nicht safe.

ok das sind Sicherheitseinstellungen die ich noch definieren muss, dennoch hilft mir das bei meinem Problem grad nicht weiter.

Obwohl der Wert vom Captcha in der Variable richtig übermittelt wird, kriege ich ständig einen Fehler, als ob der Validator das eingegebene Captcha nicht erhält

Eine weitere eigenartige Eigenschaft.

Das Captcha für das einfache Kontaktformular, läuft auf dem Productionsystem ohne Probleme, auf meinem Testsystem (Windows 7, XAMPP) kriege ich ständig die Meldung, dass das eingegebene Captcha nicht stimmt.

Ähm, genau deshalb brauchst du ja safeAttributes(). Sonst wird dieses Attribut nicht gesetzt wenn du z.B. das machst:


$model->attributes=$_POST['PersonRecord'];

Ein Blick in den Yii-Quellcode schadet aber natürlich trotzdem nicht. Die Klassen für CAPTCHA findest du unter /framework/web/widgets/captcha.

safeAttributes habe ich im Model wie folgt definiert.




public function safeAttributes()

{

	return array('type', 'comment', 'verifyCode');

}






public function attributeLabels()

{

	return array(

		'type'		=>	'Type',

		'comment'	=>	'Comment',

		'verifyCode'	=>	'Captcha',

	);

}



print_r($attribute); liefert das richtige zu überprüfende Feld


verifyCode 

In der Datei yii/framework/CCaptchaValidator.php überprüfe ich ob mein Code übergeben wird und siehe da, ja er wird übergeben




	echo "<pre>";

	print_r($object->verifyCode);

	echo "</pre>";



print_r($value); gibt mir mein eingegebens Captcha zurück

Dennoch land ich immer wieder hier drinnen!!




if(!$captcha->validate($value,$this->caseSensitive))

{

	$message=$this->message!==null?$this->message:Yii::t('yii','The verification code is incorrect.');

	$this->addError($object,$attribute,$message);

}

print_r($captcha); bringt mir auch nichts.

Dort steht nicht das Captcha das von yii generiert worden ist


CCaptchaAction Object

(

    [testLimit] => 3

    [width] => 120

    [height] => 50

    [padding] => 2

    [backColor] => 15463675

    [foreColor] => 2113696

    [transparent] => 

    [minLength] => 6

    [maxLength] => 7

    [fontFile] => 

    [_id:CAction:private] => captcha

    [_controller:CAction:private] => System_suggestionsController Object

        (

            [defaultAction] => list

            [_model:System_suggestionsController:private] => 

            [layout] => 

            [_id:CController:private] => system_suggestions

            [_action:CController:private] => CInlineAction Object

                (

                    [_id:CAction:private] => create

                    [_controller:CAction:private] => System_suggestionsController Object

 *RECURSION*

                    [_e:CComponent:private] => 

                    [_m:CComponent:private] => 

                )


            [_pageTitle:CController:private] => 

            [_cachingStack:CController:private] => 

            [_clips:CController:private] => 

            [_dynamicOutput:CController:private] => 

            [_pageStates:CController:private] => 

            [_module:CController:private] => 

            [_widgetStack:CBaseController:private] => Array

                (

                )


            [_e:CComponent:private] => 

            [_m:CComponent:private] => 

        )


    [_e:CComponent:private] => 

    [_m:CComponent:private] => 

)



Ok, dann prüf doch auch mal, was dort $this->getVerifyCode() liefert. Und schau dir auch die Funktion mal an, dort wird der Key aus der Sessio ausgelesen bzw. generiert. So findest du Step by Step raus, wo’s hapert…

Achso, und prüf nochmal in deinem Controller direkt nachdem du die $_POST-Variablen zugewiesen, hast, ob dein Code wirklich im Model landet. Kann nicht ganz erkennen, wo deine Tests oben eingebaut hast.


echo $model->verifyCode; exit;

1.) System_suggestionsController.php




if(isset($_POST['suggestions']))

{

	echo "<pre>";

	print_r($_POST['suggestions']);

	echo "</pre>";


	$model->attributes = $_POST['suggestions'];

	echo $model->verifyCode;

	if($model->save())

		$this->redirect(array('show','id'=>$model->id));

}



Die Codes sind auf $_POST[‘suggestions’] identisch mit $model->verifyCode!

2.) yii/framework/validators/CCaptchaValidator.php


protected function validateAttribute($object,$attribute)

{

	$value=$object->$attribute;


	echo $attribute;

[..]



Der Name des Feldes ist richtig!

==> verifyCode

3.) yii/framework/validators/CCaptchaValidator.php


protected function validateAttribute($object,$attribute)

{

	$value=$object->$attribute;


	echo "<pre>";

	print_r($object->verifyCode);

	echo "</pre>";



Liefert mir, mein eingegebens Captcha

4.) $this->getVerifyCode(). Irgendwie kann ich das Ding nirgendswo aufrufen, rufe ich das CCaptcaAction::getVerifyCode auf, kriege ich einen Fehler und $this->getVerifyCode() geht auch nicht

$captcha enthält ein CCaptchaAction-Objekt. Den Code kriegst du also mit $captcha->getVerifyCode(). Wiegesagt, am besten schaust du dir auch mal web/widgets/captcha/CCaptchaAction.php an. Tippe trotzdem auch auch ein Session-Problem.

mmmh

so wie es aussieht, ist es wirklich ein Session Problem.

Angezeigt wird: mosopeg

$captcha->getVerifyCode(); liefert: xibhlht

Eingegeben wurde: $object->$attribute: mosopeg

Wonach soll ich denn im Forum suchen bzgl. Session Probleme?

so, ich habe das Problem nun soweit eingegrenzt, dass auf meinem System, garkeine Sessions funktionieren.

Wenn ich den Beispiel Blog auf dem framework nehme, und dort versuch mich mit dem Beispielaccount anzumelden, so passiert garnichts, die eingegebenen Captchas funktionieren auch nicht.

Ich habe die Browser FF, IE und Opera schon gewechselt, aber bei allen tritt der Fehler auf!

Wer kennt das Phänomen?