Contao-Camp 2024
Ergebnis 1 bis 16 von 16

Thema: Contao 4.6.x - Probleme mit Captcha / Sicherheitsfrage

  1. #1
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard Contao 4.6.x - Probleme mit Captcha / Sicherheitsfrage

    Ein schönen guten Morgen in die Runde!

    Da mein Problem neben meinem Gästebuchformular auch das Kommentarformular betrifft, stelle ich es mal hier ein. Wenn es hier nicht hinpaßt, bitte verschieben.

    Am 8.10. habe ich bemerkt, dass auf https://www.luetten-dieks.eu sowohl in meinem Gästebuch-Eingabeformular als auch in der Kommentarfunktion in Stinas Blog beim Ausfüllen der Sicherheitsabfrage immer eine Fehlermeldung ausgelöst wird, obwohl die Sicherheitsfrage korrekt beantwortet wird. Da der letzte Gästebucheintrag vor dem 8.10. (am 11.08.) vor dem Release von Contao 4.6 noch unter Contao 4.5 erfolgte, nehme ich an, dass das ein Änderung im Update von C4.5 auf 4.6 für das Problem verantwortlich ist.

    Nachfolgend mal der Auszug: <form> ... </form meines templates "mod_guestbookform.html5, welches den Fehler verursacht:
    HTML-Code:
    ....
    <form action="<?php echo $this->action; ?>" id="tl_guestbook" method="post">
    		<div class="formbody">
    	<input type="hidden" name="FORM_SUBMIT" value="tl_guestbook">
    	<input type="hidden" name="REQUEST_TOKEN" value="<?php echo $this->replaceInsertTags('{{request_token}}'); ?>" />
    
    	<?php echo $this->messages; ?> 
    	<fieldset><legend><?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldsetname']; ?></legend>
    	<?php foreach ($this->fields as $objWidget): ?>
    		<?php if ($objWidget instanceof FormCaptcha) echo "</fieldset>\n\n<fieldset><legend>". $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldsetcaptcha']."</legend>"; ?>
    		<div class="gb-widget"><?php echo $objWidget->generateLabel(); ?> <?php echo $objWidget->generateWithError(); ?> <?php if ($objWidget instanceof FormCaptcha) echo $objWidget->generateQuestion(); ?></div>
    		<?php if ($objWidget instanceof FormCaptcha) echo "</fieldset>"; ?>
    	<?php endforeach; ?>
    	
    	<?php if (!$this->gb_disableNotice): ?>
    		<fieldset><legend><?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_dsgvo']; ?></legend>
    		<p style="text-align:justify">
    			<?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_forminfo']; ?>
    			<?php if ($this->moderate) : ?>
    				<?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldmoderate']; ?><br />
    			<?php endif; ?>
    			<div style="text-align:center">
    				<a href="{{article_url::datenschutzerklaerung}} ">Weitere Informationen zum Datenschutz</a>
    			</div>
    		</p>
    		<?php echo "</fieldset>"; ?>
    	<?php endif; ?>
    
    	<div class="submit_container">
    	   <button type="submit" value="" class="submit -quaternary"><?php echo $this->submit; ?></button>
            </div>
       </div>
    </form>
    ...
    Damit Besucher überhaupt etwas in mein Gästebuch eintragen können, habe ich meine template in Anlehnung an das Contao 4.6 Kommentarformular (das keine Captcha-Abfrage mehr enthält) angepasst:

    HTML-Code:
    ...
    <form action="<?php echo $this->action; ?>" id="tl_guestbook" method="post">
    	<div class="formbody">
              <input type="hidden" name="FORM_SUBMIT" value="tl_guestbook">
              <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
              <?php echo $this->messages; ?>
              <fieldset>
                  <legend><?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldsetname']; ?></legend>
                  <?php foreach ($this->fields as $field): ?>
                    <?= $field->parse() ?>
                  <?php endforeach; ?>
              </fieldset>
              <fieldset>
                <legend><?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_dsgvo']; ?></legend>
                  <p style="text-align:justify">
                    <?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_forminfo']; ?>
                    <?php if ($this->moderate) : ?>
                        <?php echo $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldmoderate']; ?><br />
                    <?php endif; ?>
                    <div style="text-align:center">
                        <a href="{{article_url::datenschutzerklaerung}} ">Weitere Informationen zum Datenschutz</a>
                    </div>
                  </p>
              </fieldset>
          
              <div class="submit_container">
                <button type="submit" value="" class="submit -quaternary"><?php echo $this->submit; ?>
                </button>
              </div>
                
            </div>
    </form>
    ...
    Da das Kommentarformular ebenfalls keine Captcha-Abfrage mehr enthält, hatte ich die stille Hoffnung, dass in beiden Fällen auf eine mir nicht erklärbare wundersame Weise der Spam-Honeypot greift, der ja seit C4.4 alle Formulare schützen soll ...

    Leider scheint das zumindest für das Gästebuch nicht der Fall zu sein, heute morgen hatte ich ich 4 Einträge zu einem allseits bekannten Potenzmittel ...

    Da ich mittlerweile das alte Jedostyle Gästebuch in abgespeckter Form (ohne Avatar Dependency) in ein Contao 4 Bundle mehr schlecht als recht umgebaut habe (funzt aber und läßt sich via composer oder CM installieren), wäre es schön, wenn für das Spam-Problem mit Eurer Hilfe eine Lösung gefunden würde. Möchte das GB danach auch für andere Interessenten zur Verfügung stellen. Obwohl die Zeit der Gästebücher ja langsam vorbeigeht ...

  2. #2
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Tja, ich denke, meine Frage war einmal wieder von absolutem Nichtwissen gesegnet , woher soll Contao-Antispam auch "wissen", dass das Gästebuch geschützt werden soll ...

    Habe das Template "mod_guestbookform.html5" nun wie folgt modifiziert (hier nur die foreach-Schleife):
    HTML-Code:
    ...
    <?php foreach ($this->fields as $field): ?>
                <?= $field->parse() ?>
                <?php if ($field instanceof FormCaptcha) : ?>
                  <?php echo "</fieldset>\n<fieldset><legend>". $GLOBALS['TL_LANG']['GUESTBOOK']['gb_fieldsetcaptcha']."</legend>"; ?>
                  <?php echo $field->generateLabel(); ?> 
                  <?php echo $field->generateWithError(); ?> 
                  <?php echo $field->generateQuestion(); ?>
                  <?php echo "</fieldset>"; ?>
                <?php endif; ?>
              <?php endforeach; ?>
    ...
    Nun funktioniert die Sicherheitsfrage und das Formular wird abgesendet . Allerdings wundert mich das ein wenig, da es ja nur eine "Umformulierung" des ursprünglichen Templates von Jens Doberenz ist .

    Trotzdem wäre ich den Urgesteinen dankbar, wenn diese mir in Sachen Einsatz des Honeypots im Gästebuch einen Schubs in die richtige Richtung geben würden.
    Geändert von Seefahrer (18.10.2018 um 07:55 Uhr)

  3. #3
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    Verstehe nicht was du meinst. Contao 4 unterstützt prinzipiell die Sicherheitsabfrage in Kommentaren.

  4. #4
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Hallo Spooky,

    ehrlich gesagt verstehe ich nicht, wie der Schutz im Comment-Bundle greift. Es ist so, dass über die Kommentarfunktion kein Spam abgesetzt wird. Über das Gästebuch kommen - seit das Captcha deaktiviert wurde - neuerdings im 6-Std. Takt - Spam Einträge. Wenn ich den Schutz der Comments verstehen würde, könnte ich den für das GB kopieren ...

    Ich hoffe, ich konnte mich einigermaßen verständlich machen ...

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    Gästebücher machst du in Contao einfach nur mit dem Kommentar Inhaltselement.

  6. #6
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    So sehr ich Deine Hilfe in allen Fragen schätze (und das meine ich auch so!), hilft mir diese Antwort nicht wirklich weiter ...
    Wie ist denn der Antispamschutz in den Kommentaren realisiert?


    EDIT:

    Das Template "mod_comment_form.html5" sieht wie folgt aus, ich kann darin keine Sicherheitsfrage entdecken:

    HTML-Code:
    <!-- indexer::stop -->
    <div class="form">
      <?php if ($this->requireLogin): ?>
        <p class="info"><?= $this->login ?></p>
      <?php else: ?>
        <?php if ($this->confirm): ?>
          <p class="tl_confirm"><?= $this->confirm ?></p>
        <?php elseif ($this->allowComments): ?>
          <form<?php if ($this->action): ?> action="<?= $this->action ?>"<?php endif; ?> id="<?= $this->formId ?>" method="post">
            <div class="formbody">
              <input type="hidden" name="FORM_SUBMIT" value="<?= $this->formId ?>">
              <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
              <?php foreach ($this->fields as $field): ?>
                <?= $field->parse() ?>
              <?php endforeach; ?>
              <div class="widget widget-submit">
                <button type="submit" class="submit"><?= $this->submit ?></button>
              </div>
            </div>
          </form>
        <?php endif; ?>
      <?php endif; ?>
    </div>
    <!-- indexer::continue -->
    Geändert von Seefahrer (17.10.2018 um 14:06 Uhr)

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    1. https://github.com/contao/contao/blo....php#L214-L220
    2. https://github.com/contao/contao/blo...ments.php#L260
    3. https://github.com/contao/contao/blo...ments.php#L268


    Das Kommentar Fomular wird aus regulären Formularfeldern aufgebaut, daraus werden Widgets erzeugt und die einzelnen Widgets werden validiert.

  8. #8
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Im Moment läuft es ja mit der expliziten Sicherheitsfrage. Zukünftig werde ich hoffen, meine PHP Kenntnisse dadurch verbessern zu können, das ganze auf Grundlage des comments-bundle neu aufzulegen.
    Was eigentlich auch meine ursprüngliche Absicht war, einige Forumianer haben da ja Pionierarbeit geleistet ... allerdings hatte ich dann das jedoStyle/guestbook entdeckt und es als brauchbar empfunden. Nun gut, mal sehen, was daraus wird ...
    Geändert von Seefahrer (18.10.2018 um 07:54 Uhr)

  9. #9
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Ich hänge mich hier mal an, weil ich mit der Sicherheitsabfrage in Contao 4.6 auch Probleme habe.

    In meiner Erweiterung erzeuge ich ein Frontend-Formular mit Sicherheitsabfrage. Auszug aus dem Code:

    PHP-Code:
    $fields['captcha'] = array(
       
    'name' => 'captcha',    
       
    'inputType' => 'captcha',
       
    'eval' => array('mandatory'=>true)
    );
    // ...

    foreach ($fields as $arrField) {
        
    $strClass $GLOBALS['TL_FFL'][$arrField['inputType']];
        
    $arrField['eval']['required'] = $arrField['eval']['mandatory'];
        
    $objWidget = new $strClass($this->prepareForWidget($arrField$arrField['name'], $arrField['value']));
            
        
    // Validate widget
        
    if ($this->Input->post('FORM_SUBMIT') == 'caledit_submit') {
            
    $objWidget->validate();
            if (
    $objWidget->hasErrors()) {                    
                
    $doNotSubmit true;
            }
        }            
        
    $arrWidgets[$arrField['name']] = $objWidget;

    Unter Contao 4.4 läuft das durch, mit 4.6 wird eine korrekt beantwortete Sicherheitsabfrage als falsch markiert.

    Auszug aus dem Template
    PHP-Code:
    <div class="formbody">
            <form action="<?php echo $this->action?>" method="post">
            <input type="hidden" name="FORM_SUBMIT" value="caledit_submit" /><?php echo $this->messages?>
            <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
            <table cellpadding="2" cellspacing="2" border="0" >
            <tbody>            
                <?php if ($this->fields['captcha']): ?>
                    <?php $objWidget $this->fields['captcha']; ?>        
                    <tr class="<?php echo $class?>">
                        <td class="label">
                            <?php echo $objWidget->generateQuestion(); 
                                echo 
    '<span class="mandatory">*</span>';?></td>
                        <td class="value"><?php echo $objWidget->generateWithError(); ?></td>
                    </tr>            
                <?php endif; ?>
                        
                <tr class="<?php echo $class?>">
                    <td class="label">&nbsp;</td>
                    <td class="value"><input type="submit" class="submit" value="<?php echo $this->submit?>" /></td>
                </tr>
            </tbody>
            </table>       
            </form>
    </div>
    Wenn ich das Captcha-Feld im Code auskommentiere, funktioniert das Formular wie gewünscht.

    Zu den Kommentaren: Wenn ich in 4.4 und auch in 4.6 ein Kommentarmodul anlege, und die Sicherheitsabfrage nicht deaktiviere (also standard), mit den Standard-Templates, dann wird mir auch keine Sicherheitsabfrage angezeigt. Wie läuft das da? Irgendeine Bot-Erkennung im Hintergrund, die "vermutlich echten Menschen" die Abfrage erspart? Und wie kann ich mein selbst erstelltes Formular in meiner Erweiterung vor Spam schützen? Und seit wann geht das so? In den Changelogs zwischen 4.4 und 4.6 finde ich nichts zu den Captchas ...
    All of this has happened before - but the question remains: Does all of this have to happen again?

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    Diese Honey Pot Implementation gibt es seit Contao 4.4 (iirc). Was meinst du mit "eigene Formulare"? Formulare aus dem Formular Generator? Da brauchst du nur das Feld "Sicherheitsfrage" hinzufügen.

  11. #11
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Mit eigenem Formular meine ich, dass meine Erweiterung ein Formular erzeugt (direkt per "eigenem" Code, nicht über den Formulargenerator), in das der Nutzer Dinge eingibt, die dann in der Datenbank gespeichert werden. Wie ich das mache, habe ich ja auszugsweise gepostet, und das deckt sich auch so ziemlich mit dem Code aus dem Kommentarmodul, was du weiter oben verlinkt hast, wenn ich das richtig überblicke.
    Unterschied ist die Zeile
    PHP-Code:
    // kommntarmodul
    $objWidget = new $strClass($strClass::getAttributesFromDca($arrField$arrField['name'], $arrField['value']));
    // bei mir
    $objWidget = new $strClass($this->prepareForWidget($arrField$arrField['name'], $arrField['value'])); 
    aber das ändert nichts an meinem Problem mit dem Captcha ...
    All of this has happened before - but the question remains: Does all of this have to happen again?

  12. #12
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.555
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Gausi Beitrag anzeigen
    In den Changelogs zwischen 4.4 und 4.6 finde ich nichts zu den Captchas ...
    In dieser Newsmeldung zu Contao 4.4 wird es kurz erwähnt: https://contao.org/de/news/contao_4-4-0.html
    Und hier im Changelog zu Contao 4.4:
    Hide the CAPTCHA field by default by adding a honeypot field (see #832).
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  13. #13
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Gut, dann ist das seit 4.4 so. Das erklärt aber nicht, warum mein Code (bzw. mein Template, wie ich jetzt herausgefunden habe) in 4.4 funktioniert, und in 4.6 nicht mehr.

    Habs aber jetzt für 4.6 hinbekommen - muss jetzt nur noch gucken, ob/wie das unter 4.4 auch so läuft, oder ob ich da ne Fallunterscheidung einbauen muss ...

    Wenn ich im Template die Ausgabe des Captchas nur über diese Zeile mache, dann läuft es:
    PHP-Code:
    <?= $objWidget->parse() ?>
    Das scheint das "neue" Prinzip für Form-Templates zu sein. Dann läuft das auch direkt mit dem Honeypot, wenn ich das Verhalten mit/ohne erlaubten Javascript richtig verstehe. Das fände ich schon mal ganz gut. Wenn ich dann in meinem Formular dem captcha-Widget ein CustomTemplate mit übergebe, dann kann ich da auch mein tabellarisches Formular weiter nutzen, so dass das Layout nicht zerschossen wird, wenn der Anwender kein JavaScript nutzt.

    Da ich Dinge gerne verstehen will: Was ist in 4.6 geändert worden, bzw. warum muss man das in 4.6 jetzt anders machen, was in 4.4 noch ging?
    All of this has happened before - but the question remains: Does all of this have to happen again?

  14. #14
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    Dazu müssten wir deinen ganzen Code sehen. Wie hast du denn zuvor das Widget ausgegeben?

  15. #15
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Hatte ich ja oben beschrieben, wie das Ausgabe-Template aussah:
    PHP-Code:
    <tbody>             
                <?php if ($this->fields['captcha']): ?> 
                    <?php $objWidget $this->fields['captcha']; ?>         
                    <tr class="<?php echo $class?>"> 
                        <td class="label"> 
                            <?php echo $objWidget->generateQuestion();  
                                echo 
    '<span class="mandatory">*</span>';?></td> 
                        <td class="value"><?php echo $objWidget->generateWithError(); ?></td> 
                    </tr>             
                <?php endif; ?> 
                         
                <tr class="<?php echo $class?>"> 
                    <td class="label">&nbsp;</td> 
                    <td class="value"><input type="submit" class="submit" value="<?php echo $this->submit?>" /></td> 
                </tr> 
    </tbody>
    Das neue Template entsprechend so:
    PHP-Code:
    <?php if ($this->fields['captcha']): ?>
            <?php $objWidget $this->fields['captcha']; ?>    
            <?= $objWidget->parse() ?>
    <?php 
    endif; ?>
    mit einem Custom-Template "form_captcha", das ich von dem originalen "\vendor\contao\core-bundle\src\Resources\contao\templates\forms\form_c aptcha.html5" ausgehend angepasst habe, damit das in mein Tabellen-Form-Layout passt (auch wenn das in der Regel jetzt unsichtbar sein sollte).
    PHP-Code:
    <tr class="<?php echo $class?>">
        <td class="label">
            <?php echo $this->generateQuestion(); 
                echo 
    '<span class="mandatory">*</span>';?>
        </td>    
                        
        <td class="value"><?php echo $this->generateWithError(); ?>
        </td>
        
        <?php if (!$this->hasErrors()): ?>
            <td style="display:none">
              <label for="ctrl_<?= $this->id ?>_hp">Do not fill in this field</label>
              <input type="text" name="<?= $this->name ?>_name" id="ctrl_<?= $this->id ?>_hp" value="">
            </td>
            <script>
              document.getElementById('ctrl_<?= $this->id ?>').parentNode.parentNode.style.display = 'none';              
              document.getElementById('ctrl_<?= $this->id ?>').value = '<?= $this->arrCaptcha['sum'?>';
            </script>
        <?php endif ?>
    </tr>            

    <input type="hidden" name="<?= $this->name ?>_hash" value="<?= $this->arrCaptcha['hashes'][0?>">
    Wie gesagt: Knackpunkt für die Funktionsweise ist die Zeile $objWidget->parse() im Ausgabe-Template. Die war in 4.4 noch nicht notwendig, in 4.6 ist sie es. Aber nur beim Captcha, bei den anderen Feldern nicht.
    All of this has happened before - but the question remains: Does all of this have to happen again?

  16. #16
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.060
    Partner-ID
    10107

    Standard

    Sowohl in Contao 4.4 als auch in Contao 4.6 werden Widgets mit der parse Methode im Frontend ausgegeben.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •