1. Dashboard
  2. Articles
  3. Forum
  • Login or register
  • Search
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • More Options
  1. webEdition Forum
  2. Forum
  3. Deutschsprachiges Support Forum
  4. webEdition Templates erstellen (we:tags)

Spammails über das Kontaktformular trotz Captcha

  • steff11
  • July 23, 2024 at 10:38 AM
1st Official Post
  • steff11
    Beginner
    Posts
    25
    • July 23, 2024 at 10:38 AM
    • #1

    Hallo zusammen,

    trotz eingebautes Captcha kommen sehr viele Spam Nachrichten.

    Hat jemand eine Ahnung, wie ich dies unterbinden kann?

    Vielen dank :)

  • mokraemer
    Senior Member
    Reactions Received
    13
    Posts
    162
    • July 23, 2024 at 11:55 AM
    • Official Post
    • #2

    schau dir mal <we:formToken/> und <we:ifFormToken/> an. Das könnte evtl. bei automatisierten Anfragen helfen. Gibt aber noch ein paar weitere Tricks.

    • Next Official Post
  • e-site
    Student
    Reactions Received
    7
    Posts
    110
    • July 23, 2024 at 2:47 PM
    • #3

    Hallo,

    ich nutze dagegen mittlerweile mehrere Sachen.

    Ein Honeypot. Ein per CSS verstecktes Textfeld, das bei normaler Nutzung des Formulars leer sein sollte. Das stürzen sich die Bots gerne drauf und befüllen es.

    Ein Zeitstempel, die Bots versenden eher in 1-2 Sekunden die Formulare, alles unter 10 Sekunden ist bei mir SPAM.

    Dann prüfe ich auch bei Textareas oder anderen ausgewählten Feldern den Inhalt auf Keywords wie z.B. Links usw.

    Was eigentlich nicht gegen SPAM gedacht ist, sind CSRF-Token welche ich bei jedem Abschicken des Formulars mit einer Session abgleiche und immer wieder aktualisiere. Da hatte ich hier und da auch schon gesehen, dass versucht wurde die Formulare ohne gültige Session zu versenden. Wie oben erwähnt mal <we:ifFormToken/> einsetzen.

    Leider werden die Bots immer intelligenter, z.B. langsameres Versenden hier und da, sodass der Zeitstempel nicht mehr greift oder der Honeypot wird auch ab und zu erkannt.

    Bisher funktionieren diese Methoden zusammen immer noch sehr gut, als letzte Maßnahme kommt eigentlich nur noch ein Captcha bei mir.

    Gruß

    Heiko

    Edited once, last by e-site (July 23, 2024 at 3:11 PM).

  • steff11
    Beginner
    Posts
    25
    • July 23, 2024 at 4:03 PM
    • #4

    Ich danke euch vielmals für eure schnellen Antworten :)

    Hätten Ihr Code Snippets, mit denen ich etwas anfangen könnte?
    Wie nutzt man <we:ifFormToken/> am besten in diesem Fall?

    @Heiko Ich habe das webedition captcha eingebunden, aber dies schein nicht ausreichend :(

  • e-site
    Student
    Reactions Received
    7
    Posts
    110
    • July 23, 2024 at 4:16 PM
    • #5

    Da ich die Formulare per AJAX versende, mache ich alles mit eigener PHP-Programmierung.

    Quick & Dirty:

    Code
    <we:ifVar match="Absenden" name="Absenden" type="request">
        <we:ifFormToken>
            ...weitere Verarbeitung z.B. 
            <we:ifCaptcha name="KontaktFormCaptcha">
                <we:sendMail/>
            </we:ifCaptcha>
        <we:else/>
            <p>
                Ein Fehler ist aufgetreten.
            </p>
        </we:ifFormToken>
    </we:ifVar>
    Display More
  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • August 5, 2024 at 12:01 PM
    • Official Post
    • #6

    Wir nutzen mittlerweile: https://www.cloudflare.com/products/turnstile/

    Bisher bin ich sehr zufrieden, super einfach einzubinden und oft braucht es keine Interaktion des Nutzers.

    Die grafischen Captchas werden immer leichter mit Bilderkennung überwunden.

    https://www.wg-werbeagentur.de

    • Previous Official Post
    • Next Official Post
  • rkempf
    Beginner
    Reactions Received
    2
    Posts
    38
    • July 15, 2025 at 3:34 PM
    • #7

    Finn

    Ich habe gute Erfahrungen mit turnstile bei einer statischen Seite (ohne WE) gemacht und möchte das jetzt auch in WE nutzen. Die Frage ist, wie das am besten im Template eingebunden wird. Vermutlich über eine classe per include.

    Hättest Du ein Script-Beispiel für ein Kontaktformular mit we:form?

  • mokraemer
    Senior Member
    Reactions Received
    13
    Posts
    162
    • July 15, 2025 at 8:41 PM
    • Official Post
    • #8

    Ich kann auch noch empfehlen JS zu nutzen um ggf. damit Elemente zu besetzen. Das werten die wenigsten Bots aus, v.a. wenn es in externen Skripten steckt. Gibt genug offene Relays, das sie sich an sowas nicht so schnell die Zähne ausbeißen.

    • Previous Official Post
    • Next Official Post
  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • July 15, 2025 at 9:50 PM
    • Official Post
    • #9
    Quote from rkempf

    Finn

    Ich habe gute Erfahrungen mit turnstile bei einer statischen Seite (ohne WE) gemacht und möchte das jetzt auch in WE nutzen. Die Frage ist, wie das am besten im Template eingebunden wird. Vermutlich über eine classe per include.

    Hättest Du ein Script-Beispiel für ein Kontaktformular mit we:form?

    Das sehr einfach ergänzt.

    Du bekommst ja einen public und einen secret key und den Rest an Code kannst du von Cloudflare direkt kopieren.

    Client-side rendering
    You can initialize and customize the Turnstile widget on your web page via implicit or explicit rendering.
    developers.cloudflare.com


    Das eingesetzte DIV rendert dann mit Hilfe des JS die Prüfung fürs Frontend.

    Im Backend nehmen wir dann den übertragenen Key und schicken den an Cloudflare zum prüfen. Es gibt dann einen entsprechenden Response.

    Server-side validation
    Turnstile needs to be verified using Siteverify because it is a front-end widget that creates a token which is cryptographically secured. To ensure that a…
    developers.cloudflare.com


    Grundsätzlich kannst du beim we:form vorgehen wie bei einem klassischen html form. Ist ja auch eins :)

    https://www.wg-werbeagentur.de

    • Previous Official Post
    • Next Official Post
  • rkempf
    Beginner
    Reactions Received
    2
    Posts
    38
    • July 16, 2025 at 10:50 AM
    • #10
    Quote from Finn

    Grundsätzlich kannst du beim we:form vorgehen wie bei einem klassischen html form. Ist ja auch eins :)

    Ahhh, echt? Das muss einem Dummie auch gesagt werden :)

  • rkempf
    Beginner
    Reactions Received
    2
    Posts
    38
    • July 16, 2025 at 1:38 PM
    • #11

    So funktioniert es bei mir:

    1. Kontaktform
    Mit Cloudflare-Script. Absenden verlinkt auf send.php

    HTML
    <we:sessionStart />
    <!DOCTYPE HTML>
    <html dir="ltr" lang='de'>
    	<head>
    		<we:css id="65" />
    		<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" defer></script>
    	</head>
    	<body>
    		<we:ifNotEditmode>
    			<section class="container mt-5">
    				<div class="row">
    					<div class="col-md-6">
    							<we:form name="kontaktformular" method="post" class="form-horizontal" id="156" remove="Absenden" charset="UTF-8">
    								<input type="hidden" name="subject" value="Kontaktanfrage">
    								<h4 class="h3">Formular</h4>
    								<div class="col-md-12">
    									<div class="mb-4">
    										<label for="Name" class="form-label-lg">Name</label>
    										<input class="form-control border-red" type="text" name="name" id="Name" required placeholder="Ihr Name" required>
    									</div>
    								</div>
    								<div class="col-md-12">
    									<div class="mb-4">
    										<label for="Telefon" class="form-label-lg">Telefon</label>
    										<input class="form-control border-red" type="text" name="telefon" id="Telefon" placeholder="Telefon" required>
    									</div>
    								</div>
    								<div class="col-md-12">
    									<div class="mb-4">
    										<label for="email" class="form-label-lg">E-Mail</label>
    										<input class="form-control border-red" type="email" name="email" id="email" required placeholder="Gültige E-Mail-Adresse" required>
    									</div>
    								</div>
    								<div class="col-md-12">
    									<div class="mb-4 mt-2">
    										<label for="Nachricht" class="form-label-lg">Ihre Nachricht</label>
    										<textarea name="message" class="form-control border-red" id="Nachricht" rows="5" placeholder="Ihre Nachricht" required></textarea>
    									</div>
    								</div>
    								<div class="col-md-12 mb-3">
    									<p class="small">Mit dem Absenden dieses Formulars akzeptieren Sie unsere <a href="/datenschutzerklaerung.html">Datenschutzerklärung</a>.</p>
    								</div>
    								<div class="col-md-12 mb-3">
    								<div class="cf-turnstile" data-sitekey="YOUR DATA SITE KEY" ></div>
    							</div>
    								<div class="mb-4"><input type="submit" name="submit" id="approve" class="btn btn-primary btn-lg" style="width:200px;" value="Absenden"></div>
    							</we:form>
    					</div>
    				</div>
    			</section>
    			<we:js id="67" />
    		</we:ifNotEditmode>
    	</body>
    </html>
    Display More

    2. send.php -> WE include mit serverseitigem turnstile check

    PHP
    <?php
    $msg = '';
    // Define your secret key
    $secretKey = 'YOUR SECRET KEY';
    
    // Get response token from the form
    $responseToken = $_POST['cf-turnstile-response'];
    
    // Get user's IP address
    $remoteIP = $_SERVER['REMOTE_ADDR'];
    
    // Prepare data for the POST request
    $data = array(
        'secret' => $secretKey,
        'response' => $responseToken,
        'remoteip' => $remoteIP
    );
    
    // Initialize curl session
    $ch = curl_init();
    
    // Set curl options
    curl_setopt($ch, CURLOPT_URL, 'https://challenges.cloudflare.com/turnstile/v0/siteverify');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    // Execute the POST request
    $response = curl_exec($ch);
    
    // Close curl session
    curl_close($ch);
    
    // Decode JSON response
    $result = json_decode($response, true);
    
    // Check if verification was successful
    if ($result && isset($result['success']) && $result['success'] === true) {
        // Verification successful, proceed with sendmail
        $msg = 'success';
        
    } else {
        // Verification failed, handle error
         $msg = 'failed';
    }
    ?>
    Display More

    3. send.php -> HTML

    HTML
    <we:include type="template" id="29" />
    <we:sessionStart />
    <!DOCTYPE HTML>
    <html dir="ltr" lang='<we:pageLanguage type="language" />'>
    	<head>
    		<we:title></we:title>
    		<we:description></we:description>
    		<we:keywords></we:keywords>
    		<we:charset defined="UTF-8">UTF-8</we:charset>
    		<we:css id="65" />
    		<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" defer></script>
    	</head>
    	<body>
    		<we:ifNotEditmode>
    			<section class="container mt-5">
    				<div class="row">
    					<div class="col-md-6">
    						<we:comment>sendmail nach Absenden des Formulars</we:comment>
    							<we:ifVar match="success" name="msg" type="global">
    								<we:sendMail from="noreply@beispiel.de" recipient="mail@beispiel.de" id="155" subject="Anfrage von der Website"/>
    								<div class="alert alert-success" role="alert">
    									Vielen Dank für Ihre Nachricht! Wir melden uns schnellstmöglich bei Ihnen!
    								</div>
    							</we:ifVar>
    							<we:ifVar match="failed" name="msg" type="global">
    								<div class="alert alert-danger" role="alert">
    									Fehler - ein Spamversuch ist unterbunden worden.
    								</div>
    							</we:ifVar>
    					</div>
    				</div>
    			</section>
    			<we:js id="67" />
    		</we:ifNotEditmode>
    	</body>
    </html>
    Display More
  • mokraemer
    Senior Member
    Reactions Received
    13
    Posts
    162
    • July 17, 2025 at 2:23 PM
    • Official Post
    • #12

    Ihr müßt nur überlegen, welche Informationen ggf. an den Dienstleister fliesen und dies ggf auch dokumentieren. => Tracking, ....

    • Previous Official Post
    • Next Official Post
  • Finn
    Administrator
    Reactions Received
    12
    Posts
    295
    • July 18, 2025 at 12:13 PM
    • Official Post
    • #13

    Exakt, es muss auf jeden Fall in die DSGVO. Je nach Endgerät werden Persönliche Daten (IP-Adresse und weitere Metriken) genutzt um die Besucher zu verifizieren:

    Datenschutzerklärung für Cloudflare Turnstile
    Was macht&nbsp;Cloudflare Turnstile?Cloudflare Turnstile ist eine Software, die überprüft, ob es sich bei Webseitenbesuchern um Menschen handelt. Dazu…
    www.e-recht24.de

    https://www.wg-werbeagentur.de

    • Previous Official Post

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!

Register Yourself Login

Donations

200.00 EUR

Donate now
  1. Privacy Policy
  2. Legal Notice
Powered by WoltLab Suite™