[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Spamschutz yform-Formulare
Seite 1 von 1

Spamschutz yform-Formulare

Verfasst: 12. Jul 2017, 16:47
von pflumi
Hi,

unter https://github.com/yakamara/redaxo_yfor ... mschutz.md wird eine Möglichkeit gezeigt, wie man via Zeitstempel Bot-Nachrichten ausschließen kann:

Code: Alles auswählen

php|validate_timer|Spamschutz|<?php echo '<input name="validate_timer" type="hidden" value="'.microtime(true).'" />' ?>|
validate|customfunction|validate_timer|yform_validate_timer|5|Spambots haben keine Chance|
function yform_validate_timer($label,$microtime,$seconds)
    {
        if (($microtime + $seconds) > microtime(true)) {
            return true;
        } else {
            return false;
        }
    }
Gibt es neben der Pipe-Notation auch eine funktionierende PHP-Schreibweise, also nach dem Schema:

Code: Alles auswählen

$yform->setActionField('php, array(validate_timer, ...'));
$yform->setValidateField('costumfunction', array("validate_timer, ..."));
Ich würde damit gerne dieses Formular hier ergänzen:

Code: Alles auswählen

<?php
		$yform = new rex_yform();
		$yform->setObjectparams('...');

		$yform->setValueField('fieldset', array("nachricht", "Nachricht eintragen"));
		$yform->setValueField('html', array("details", "<b><i>* Details</i></b><hr>"));
		
		$yform->setValueField('text', array("name","#placeholder:Ihr Name","Name: *"));
		$yform->setValidateField('empty', array("name","Sie haben keinen Namen angegeben."));

		$yform->setValueField('textarea', array("message","#placeholder:Nachricht hinterlassen","Ihre Nachricht: *"));
		$yform->setValidateField('empty', array("message","Sie haben noch keine Nachricht geschrieben."));

		$yform->setValueField('captcha', array("Bitte Verifizierungscode eingeben!","Falsche Verifizierung."));

		$yform->setActionField('db', array('rex_messages'));
		
		$yform->setActionField('showtext', array("Ihre Nachricht wurde gespeichert.",'<div class="gespeichert">',"</div>","1"));
		echo $yform->getForm();
		
?>

Re: Spamschutz yform-Formulare

Verfasst: 13. Jul 2017, 11:44
von anita
hi,

ich hab's so gemacht:

Code: Alles auswählen

$yform->setValueField('php', array("validate_timer","spamschutz","<?php echo '<input name=\"validate_timer\" type=\"hidden\" value=\"'.microtime(true).'\" />' ?>"));
$yform->setValidateField('customfunction', array('validate_timer', 'yform_validate_timer', '5', 'keine chance'));

Re: Spamschutz yform-Formulare

Verfasst: 7. Aug 2017, 10:21
von alexplus
Hallo Anita, Hallo Pflumi,

Funktioniert alles wie gewünscht? Sind noch Fragen offen?

VG
Alex

Re: Spamschutz yform-Formulare

Verfasst: 8. Aug 2017, 10:08
von pflumi
Hi Alex,

schön dass Du nachfragst.

Ich habe Anitas PHP-Schreibweise übernommen, doch leider funktioniert es bei mir nicht.

Vllt. habe ich auch die yform_validate_timer Funktion falsch eingebunden?!

Die Frage ist sicherlich banal, aber wo konkret binde ich das Skript am besten ein?

Hilfreich für Anfänger wäre es vllt., wenn man in die Hilfe neben der pipe-Notation auch die PHP-Schreibweise aufnehmen könnte...

Re: Spamschutz yform-Formulare

Verfasst: 8. Aug 2017, 11:57
von alexplus

Code: Alles auswählen

$yform->setValidateField('costumfunction', array("validate_timer, ..."));
du hast aber nicht noch den Tippfehler drin aus deinem 1. Post mit "costumfunction" statt "customfunction"?

Re: Spamschutz yform-Formulare

Verfasst: 8. Aug 2017, 11:58
von alexplus
Und die Funktion selbst packst du am besten in

/redaxo/src/addons/project/boot.php

Re: Spamschutz yform-Formulare

Verfasst: 10. Aug 2017, 12:44
von pflumi
Hallo Alex,

vielen Dank für Deine Hilfe! :) Es funktioniert jetzt.

Kurzes feedback:

Peinlich zuzugeben, aber es war tatsächlich der Rechtschreibfehler... :oops:

Die Funktion habe ich jetzt allerdings im Modul direkt.
Wenn ich sie in die boot.php des Project-Addons gelegt habe, bekam ich die Meldung, dass die Funktion nicht gefunden wurde.
Gibt es irgendwelche (Sicherheits-)Nachteile, weshalb man die Funktion nicht direkt ins Modul packen sollte?

Re: Spamschutz yform-Formulare

Verfasst: 29. Aug 2017, 12:42
von pflumi
Hallo und mal wieder eine Frage in die Runde...

Ich nutze diese yform-Spamschutz-Funktion und das funktioniert auch gut.

Die Funktion Validate-Timer-Funktion

Code: Alles auswählen

function yform_validate_timer($label,$microtime,$seconds)
    {
        if (($microtime + $seconds) > microtime(true)) {
            return true;
        } else {
            return false;
        }
    }
habe ich in das Formular-Modul eingebunden.

Leider führt das bei der Indexierung von Search it dann zu einem Abbruch mit Fehlermeldung.

Ich würde die Funktion also gerne anders einbinden.

Kann mir jemand herlfen wie ich das konkret am besten mache?

Re: Spamschutz yform-Formulare

Verfasst: 31. Aug 2017, 13:50
von Ingo
Die Fehlermeldung ist streng geheim...

Re: Spamschutz yform-Formulare

Verfasst: 31. Aug 2017, 14:58
von pflumi
Grüß dich Ingo,

wieso sollte die Fehlermeldung streng geheim sein? Verstehe ich nicht...
Sie lautet: "Cannot redeclare yform_validate_timer() (previously declared in rex:///...)"
Bild
Aber darum gehts mir doch gar nicht. Wenn ich, wie gesagt, diese Funktion aus dem Modul herausnehme, funktioniert Search it einwandfrei.

Daher war doch meine Frage: Wie konkret kann ich dieses Script extern einbinden, damit es bei Aufruf im Modul zur Verfügung steht (...und Search it nicht beeinträchtigt) ?! :)

Re: Spamschutz yform-Formulare

Verfasst: 31. Aug 2017, 17:24
von Ingo
Laut Fehlermeldung wird die Funktion yform_validate_timer mehrfach deklariert. Schau dir mal das hier an: http://php.net/manual/de/function.function-exists.php

Code: Alles auswählen

if (!function_exists('yform_validate_timer') {
    function yform_validate_timer () {
        // yadayada
    }
}

Re: Spamschutz yform-Formulare

Verfasst: 1. Sep 2017, 09:51
von pflumi
Hi Ingo,

danke für Deine Hilfe! :D

Jetzt habe ich verstanden, wo der Fehler lag: Durch mehrfachen Einsatz des Moduls mit entsprechendem Formular wurde - weil die Funktion direkt im Modul ist - die Funktion mehrfach deklariert, wenn Search it gelaufen ist. Das hat zu der Fehlermeldung geführt.
Jetzt wird die Funktion nur noch deklariert, wenn sie noch nicht existiert.

Das hat das Problem gelöst.

Super, danke! :D

Was mich zu zwei weiteren Fragen führt: Wäre es dann nicht wirklich sinnvoller, die Funktion irgendwie aus dem Modul auszulagern? Und wenn ja, wie?

Re: Spamschutz yform-Formulare

Verfasst: 1. Sep 2017, 12:29
von Ingo
Entweder über das in Redaxo mitgelieferte Project Addon oder https://github.com/FriendsOfREDAXO/theme
Oder du strickst dir was eigenes...

Re: Spamschutz yform-Formulare

Verfasst: 1. Sep 2017, 14:12
von pflumi
Danke Ingo, genau das habe ich ja schon probiert und wollte ich wissen.
Ich habe eine yform_validate_timer.php in das lib-Verzeichnis im Project-AddOn gelegt.
Leider erhalte ich dann beim Ausfüllen des Formulars die Fehlermeldung:

Code: Alles auswählen

ERROR: customfunction "yform_validate_timer" not found
Irgendwas mache ich da falsch beim Einbinden. Hast Du einen Tipp?

Re: Spamschutz yform-Formulare

Verfasst: 1. Sep 2017, 16:49
von Ingo
Über das lib Verzeichnis werden nur Klassen automatisch geladen. Du könntest die Funktion zb in der boot.php oder als statische Methode einer Klasse definieren.

Re: Spamschutz yform-Formulare

Verfasst: 1. Sep 2017, 18:09
von pflumi
Nochmals Danke Ingo, ich hab das jetzt so gemacht und es funktioniert. :)

Re: Spamschutz yform-Formulare

Verfasst: 15. Feb 2018, 10:52
von ska
Bei mir funktioniert der Spamschutz über den Timer leider auch nicht wie in der Doku beschrieben… Funktion ist eingebunden und das yForm wie beschrieben angelegt, aber egal, welchen Wert ich bei den Sekunden eingebe, das Formular wird immer direkt abgeschickt:

Code: Alles auswählen

validate|customfunction|validate_timer|yform_validate_timer|60|Spambots haben keine Chance!

Auch wenn ich deutlich unter den hier angegebenen 60 Sekunden bleibe, wird das Formular dennoch abgeschickt – woran kann das liegen?

Re: Spamschutz yform-Formulare

Verfasst: 15. Feb 2018, 18:35
von alexplus
Hi @ska,

evtl. ist das project-Addon nicht installiert oder der System-Cache ist zu leeren.

Du kannst versuchen, nur die Validate-Funktion einfach mit http://php.net/manual/de/function.function-exists.php darauf zu überprüfen, ob sie überhaupt vorhanden / eingebunden ist.

Re: Spamschutz yform-Formulare

Verfasst: 16. Feb 2018, 11:34
von ska
Hab' jetzt nochmals alles kontrolliert: Funktion ist vorhanden und wird über boot.php geladen, Project-Addon re-installiert, Cache geleert – aber validiert wird leider trotzdem nichts, das Formular wird nach dem Klick auf "senden" direkt abgeschickt.

Folgenden Code habe ich nach Anleitung in das yForm übernommen und den Intervall zum Testen entsprechend auf 60 Sekunden gestellt:

Code: Alles auswählen

php|validate_timer|Spamschutz|<?php echo '<input name="validate_timer" type="hidden" value="'.microtime(true).'" />' ?>
validate|customfunction|validate_timer|yform_validate_timer|60|Spambots haben keine Chance
Das hidden field mit der microtime ist im Formular dann auch vorhanden.

Eintrag in boot.php:

Code: Alles auswählen

  if (!function_exists('yform_validate_timer')) {
     function yform_validate_timer($label,$microtime,$seconds)
     {
       if (($microtime + $seconds) > microtime(true)) {
	    return true;
	      } else {
	        return false;
	      }
     }
}

Habe ich irgendwas vergessen…?

Re: Spamschutz yform-Formulare

Verfasst: 17. Feb 2018, 21:51
von alexplus
Ich habe da eine Vermutung, aber es ist schwierig, das rauszufinden, weil du das YForm-Modul benutzt und nicht die PHP-Schreibweise.

Neulich wurde die Art, wie das PHP-Feld escaped wird, geändert. Kann sein, dass da eine Inkompatibilität zum Tutorial hergestellt wurde. Versuche es mal bitte so:

Code: Alles auswählen

php|validate_timer|Spamschutz|<?php echo "<input name=\"validate_timer\" type=\"hidden\" value=\"".microtime(true)."\" />" ?>
validate|customfunction|validate_timer|yform_validate_timer|60|Spambots haben keine Chance
Ansonsten ist es wirklich schwer, sich aus der Ferne das anzuschauen. Du darfst mich gerne mal im Redaxo-Slack-Channel oder im Forum per Direktnachricht anschreiben, vielleicht kann ich mal in die Redaxo-Installation reinschauen.

Re: Spamschutz yform-Formulare

Verfasst: 17. Feb 2018, 21:53
von alexplus
Du kannst in die Funktion auch mal die Werte dumpen, also

Code: Alles auswählen

  if (!function_exists('yform_validate_timer')) {
     function yform_validate_timer($label,$microtime,$seconds)
     {
     	dump($label.", ".$microtime.", ".$seconds);
       if (($microtime + $seconds) > microtime(true)) {
	    return true;
	      } else {
	        return false;
	      }
     }
}
und schauen, welche Werte da ankommen. Zum Eingrenzen des Fehlers.

Re: Spamschutz yform-Formulare

Verfasst: 21. Mär 2018, 14:47
von Thomas-S
Laut Doku, funktioniert es aktuell nicht unter Redaxo 5.5.1 und Yform 2.3. Die microtime wird nicht an die Funktion übergeben. Hab verschiedene Varianten versucht, auch mit Slashes vor den Anführungszeichen.
Die Funktion yform_validate_timer wird aufgerufen, aber nur die Sekunden und nicht die microtime aus dem Formular übergeben. Sehr frustrierend...

Re: Spamschutz yform-Formulare

Verfasst: 31. Mär 2018, 15:44
von Ingo
Du musst bei den objparams "real_field_names" auf "true" setzen.