pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Spamschutz yform-Formulare

12. Jul 2017, 16:47

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();
		
?>

Benutzeravatar
anita
Beiträge: 702
Registriert: 25. Jan 2007, 10:25
Wohnort: Finsterwalde

Re: Spamschutz yform-Formulare

13. Jul 2017, 11:44

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'));
Gruß Anita

javanita engineering, immer eine zündende Idee
http://www.javanita.com

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

7. Aug 2017, 10:21

Hallo Anita, Hallo Pflumi,

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

VG
Alex

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

8. Aug 2017, 10:08

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...

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

8. Aug 2017, 11:57

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"?

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

8. Aug 2017, 11:58

Und die Funktion selbst packst du am besten in

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

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

10. Aug 2017, 12:44

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?

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

29. Aug 2017, 12:42

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?

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Spamschutz yform-Formulare

31. Aug 2017, 13:50

Die Fehlermeldung ist streng geheim...

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

31. Aug 2017, 14:58

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) ?! :)

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Spamschutz yform-Formulare

31. Aug 2017, 17:24

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

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

1. Sep 2017, 09:51

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?

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Spamschutz yform-Formulare

1. Sep 2017, 12:29

Entweder über das in Redaxo mitgelieferte Project Addon oder https://github.com/FriendsOfREDAXO/theme
Oder du strickst dir was eigenes...

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

1. Sep 2017, 14:12

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?

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Spamschutz yform-Formulare

1. Sep 2017, 16:49

Ü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.

pflumi
Beiträge: 66
Registriert: 13. Mai 2016, 11:13

Re: Spamschutz yform-Formulare

1. Sep 2017, 18:09

Nochmals Danke Ingo, ich hab das jetzt so gemacht und es funktioniert. :)

ska
Beiträge: 85
Registriert: 27. Okt 2007, 14:39
Wohnort: Landau/Pfalz

Re: Spamschutz yform-Formulare

15. Feb 2018, 10:52

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?

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

15. Feb 2018, 18:35

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.

ska
Beiträge: 85
Registriert: 27. Okt 2007, 14:39
Wohnort: Landau/Pfalz

Re: Spamschutz yform-Formulare

16. Feb 2018, 11:34

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…?

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

17. Feb 2018, 21:51

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.

Benutzeravatar
alexplus
Beiträge: 204
Registriert: 13. Feb 2007, 15:03
Wohnort: Heilbronn
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

17. Feb 2018, 21:53

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.

Thomas-S
Beiträge: 43
Registriert: 1. Jun 2007, 09:30
Wohnort: Forst
Kontaktdaten: Website

Re: Spamschutz yform-Formulare

21. Mär 2018, 14:47

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...

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Spamschutz yform-Formulare

31. Mär 2018, 15:44

Du musst bei den objparams "real_field_names" auf "true" setzen.

Zurück zu „Allgemeines [R5]“