• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Spams abhalten

The_C

Member
Hallo,
ich habe ab und zu Spams die mein Formularregeln durchbrechen zum einen habe ich bei der Formulareingabe die HTML5 pattern="^[A-Za-z]{3,10}$" benutzt und auch im JS wird der Vorname, Nachname und das Mail abgefragt ob da was eingegeben wurde das gleiche im PHP die das schlußendlich zu mir sendet.
Grundsätzlich funktioniert es ja auch, aber Spams kommen da irgendwie durch weil Sie beim Vornamen und Nachnamen das mit Zahlen befüllen obwohl ich nur Zeichen mit den pattern erlaubt habe!
Das verstehe ich nicht :mad:

Wie kann ich die Spams überlisten die Maileingabe müssen die ja auch richtig eintragen also wird die richtig überprüft und auch ausgefüllt...

Habe hier mal alle Dokumente eingefügt die zum Formular gehören eventuell gibt es ja eine einfache Lösung für mein Problem.
Ich weis nicht so recht wo ich da anfangen soll, weil ich habe 3 verschiedene Stellen an denen ich herumschrauben kann aber welche eignet sich dafür am besten.

Danke schon mal jetzt für Eure Hilfe!

Das HTML:
PHP:
<div id="support">
          <div id="slidecontent1">
          <div class="supportheadline">Support</div>
            <div class="support_aleart"><b>Der Support</b> startet in kürze!</div>
            <div id="chat">
              <a href="fileadmin/Resources/Private/rc-chat/">
                <img src="fileadmin/Resources/Public/Images/livechat1.jpg" alt="Chat Live Support" title="Chat Live Support"/>
              </a> 
            </div>
            <div id="modalDiv">
              <iframe id="modalIFrame" title="Dialog Title"></iframe>
            </div>
            <form id='supportmail' method='post' action='fileadmin/Resources/Public/JavaScript/process.php'>
              <dl>
                <dd><input id='sender_vorname_chat' class="text" type="text" name="vorname" required="required" pattern="^[A-Za-z]{3,10}$" placeholder="Vorname" /></dd>
                <dd><input id='sender_nachname_chat' class="text" type="text" name="nachname" required="required" pattern="^[A-Za-z]{3,10}$" placeholder="Nachname" /></dd>
                <dd><input id='sender_mail_chat' class="text" type="text" name="email" required="required" pattern="[^@]+@[^@]+\.[a-zA-Z]{2,6}" placeholder="E-Mail" /></dd>
                <dd><input type='submit' class='absende_button_chat' value='Anmelden' />
                  <div class="loading"></div>
                </dd>
              </dl>
            </form>
          </div>
        </div>

Das JS:
PHP:
/************** JS Ajax mit PHP send Mail *********************/

$(document).ready(function () {

placeholder = ['Vorname', 'Nachname', 'E-Mail'];

    //var Input = $('input[type!="submit"]');
    var Input = $('#supportmail').find('input[type!="submit"]');

    trim = function (str) {
        return str.replace(/^\s+/, '').replace(/\s+$/, '');
    };

    Input.each(function (i) {
        $(this).val(placeholder[i]).data('placeholder', placeholder[i]);
    });

    Input.focus(function () {
        var element = $(this);
        if (trim(element.val()) == element.data('placeholder')) {
            $(this).val('');
        }
    });

    Input.blur(function () {
        var element = $(this);
        if (trim(element.val()) == '') {
            element.val(element.data('placeholder'));
        }
    });

    // Wenn der Absende Button geklickt wird
    $('#supportmail').submit(function (e) {
        var failed = 0;
        $('input[required="required"]').each(function () {
            var element = $(this);
            var value = element.val();
            var pattern = element.attr('pattern');
            var regex = new RegExp(pattern);
            var result = regex.exec(value);
            if (result === null || result == element.data('placeholder')) {
                failed = 1;
                element.css('border-color', 'red');
            } else {
                element.css('border-color', 'green');
            }
        });

        if (failed > 0) {
            e.preventDefault();
            alert('Bitte füllen Sie das Formular richtig aus...');
        } else {
            e.preventDefault();
            var data = $('#supportmail').serialize();
            //$('.text').attr('enabled','false');
            // Supportmail Formular ausblenden
            //$('#supportmail').fadeOut('slow');
            // Nachricht anzeigen
            //$('.support_aleart').fadeIn('slow');
            $('.loading').show();

            $.ajax({

                // Url zum verarbeiteten PHP File
                beforeSend: function () {
//alert(data);
                },
                url: "fileadmin/Resources/Public/JavaScript/process.php",
                // GET Methode benutzen
                type: "GET",
                // Abfrage mit data         
                data: data,
                // Die Page nicht cashen
                cache: false,
                //success
                datatype: 'html',
                error: function() {
                    //alert('failed');
                },
                success: function (html) {
                    //alert(html);
                    // Wenn die PHP Datei 1 zurückgibt also richtig das Mail senden
                    // Wenn die PHP Datei 0 zurückgibt also falsch das Mail nicht senden und den Fehler ausgeben
                    if (html == 1) {
                        // Supportmail Formular ausblenden
                        $('#supportmail').fadeOut('slow');
                        // Nachricht anzeigen
                        $('.support_aleart').fadeIn('slow');
                        
                        // Plungi für Starter Chat
                        $.fn.delay = function( time, name ) {
                            return this.queue( ( name || "fx" ), function() {
                                var self = this;
                                setTimeout(function() { 
                                    $.dequeue(self); 
                                } , time );
                            });
                        };
                        $('.support_aleart').delay(3000).fadeOut('slow');
                        // Starter Chat
                        $('#chat').delay(5000).fadeIn('slow');
                        //$('.support_aleart').fadeOut('slow');
                          
                        $('#modalDiv').dialog({
                            modal: false,
                            autoOpen: false,
                            height: 800,
                            width: 540,
                            draggable: true,
                            resizeable: true,
                            title: 'Live Support',
                            close: function( event, ui ) {
                                $('#modalIFrame').attr('src', '');
                                $('#supportmail').show();
                            }
                        });
                        
                        // Automatische Weiterleitung mit .trigger('click');                           
                        $('#chat').click(function(e) {
                            e.preventDefault();
                            $(this).delay(5000).fadeOut('slow');
                            url = 'fileadmin/Resources/Private/chat/';
                            $('#modalDiv').dialog('open');
                            $('#modalIFrame').attr('src', url);
                        }).trigger('click');


                    } else {
                        alert('Es ist ein unerwarteter Fehler ist aufgetreten, bitte versuchen Sie es später noch einmal.');
                    }
                }
            });
        }

    }); // supportmail ende

}); // ready end

und das PHP:
PHP:
<?php

//Retrieve form data. 
//GET - user submitted data using AJAX
//POST - in case user does not support javascript, we'll use POST instead
$vorname = ($_GET['vorname']) ? $_GET['vorname'] : $_POST['vorname'];
$nachname = ($_GET['nachname']) ? $_GET['nachname'] : $_POST['nachname'];
$email = ($_GET['email']) ?$_GET['email'] : $_POST['email'];

//flag to indicate which method it uses. If POST set it to 1
if ($_POST) $post = 1;

//Simple server side validation for POST data, of course, you should validate the email
if (!$vorname) $errors[count($errors)] = 'Geben Sie bitte Ihren Vornamen ein';
if (!$nachname) $errors[count($errors)] = 'Geben Sie bitte Ihren Nachnamen ein';
if (!$email) $errors[count($errors)] = 'Geben Sie bitte Ihre Mailadresse ein';  

//if the errors array is empty, send the mail / no errors found
if (!$errors) {


//recipient
    $to = 'admin@support.com';   
    //sender
    $from = $vorname .' '. $nachname . ' <' . $email . '>';

    //subject and the html message
    $subject = 'Chat Anmeldung'; 
    $message = '
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
    <table>
        <tr><td>Vorname</td><td>' . $vorname . '</td></tr>
        <tr><td>Nachname</td><td>' . $nachname . '</td></tr>
        <tr><td>Email</td><td>' . $email . '</td></tr>
    </table>
    <p>Bitte Log Dich in den Chat ein<br />
    Ein User wartet auf Deine Antwort im Chat<br />
    <a href="fileadmin/Resources/Private/chat/">Chat LogIn</a>
    </body>
    </html>';

    //send the mail
    $result = sendmail($to, $subject, $message, $from);

    //if POST was used, display the message straight away
    if ($_POST) {
        echo 'Die Freischaltung wird aktiviert!';

    //This one for ajax
    //1 means success, 0 means failed
    } else {
        echo '1';   
    }


} else {
    //display the errors message
    for ($i=0; $i<count($errors); $i++) echo $errors[$i] . '<br/>';
    echo '<a href="http://www.url.com">Back</a>';
    exit;
}


//Simple mail function with HTML header
function sendmail($to, $subject, $message, $from) {
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
    $headers .= 'From: ' . $from . "\r\n";

    $result = mail($to,$subject,$message,$headers);

    if ($result) return 1;
    else return 0;
}

?>
 
aber Spams kommen da irgendwie durch weil Sie beim Vornamen und Nachnamen das mit Zahlen befüllen obwohl ich nur Zeichen mit den pattern erlaubt habe!
Spambots sind keine Browser und können daher die HTML5-Validierung nach Belieben ignorieren.

- - - Aktualisiert - - -

Spambots müssen auch nicht dein Formular benutzen, sondern können den Request selbst zusammenbauen.
 
Indem man alle Überprüfungen auch auf dem Server (in PHP) macht. Sogar mit einem normalen Browser kann man die pattern-Überprüfung ausschalten.
 
ok also in meinem PHP Code.
Aber wie wo was schreib ich jetzt da hinein das es auch so funktioniert wie ich das möchte?
PHP:
<?php

//Retrieve form data. 
//GET - user submitted data using AJAX
//POST - in case user does not support javascript, we'll use POST instead
$vorname = ($_GET['vorname']) ? $_GET['vorname'] : $_POST['vorname'];
$nachname = ($_GET['nachname']) ? $_GET['nachname'] : $_POST['nachname'];
$email = ($_GET['email']) ?$_GET['email'] : $_POST['email'];

//flag to indicate which method it uses. If POST set it to 1
if ($_POST) $post = 1;

//Simple server side validation for POST data, of course, you should validate the email
if (!$vorname) $errors[count($errors)] = 'Geben Sie bitte Ihren Vornamen ein';
if (!$nachname) $errors[count($errors)] = 'Geben Sie bitte Ihren Nachnamen ein';
if (!$email) $errors[count($errors)] = 'Geben Sie bitte Ihre Mailadresse ein';  

//if the errors array is empty, send the mail / no errors found
if (!$errors) {


//recipient
    $to = 'admin@support.com';   
    //sender
    $from = $vorname .' '. $nachname . ' <' . $email . '>';
 
Du hast doch schon die "Simple server side validation"... das musst du einfach entsprechend erweitern. Was ist denn konkret deine Frage?
 
Beim Vornamen und Nachnamen darf mann keine Zahlen eingeben, sondern nur Buchstaben.
Das ist eigentlich alles die Mailvalidierung passt.

- - - Aktualisiert - - -

irgendwie so aber php ist nicht meine Stärke:
if (!preg_match("/^[a-zA-Z ]*$/",$vorname,$nachname))

- - - Aktualisiert - - -

könnte das richtig sein?
hab das jetzt nur für den Vornamen gemacht.

PHP:
//Retrieve form data. 
//GET - user submitted data using AJAX
//POST - in case user does not support javascript, we'll use POST instead
$vorname = ($_GET['vorname']) ? $_GET['vorname'] : $_POST['vorname'];
$nachname = ($_GET['nachname']) ? $_GET['nachname'] : $_POST['nachname'];
$email = ($_GET['email']) ?$_GET['email'] : $_POST['email'];

//flag to indicate which method it uses. If POST set it to 1
if ($_POST) $post = 1;

//Simple server side validation for POST data, of course, you should validate the email
//if (!$vorname) $errors[count($errors)] = 'Geben Sie bitte Ihren Vornamen ein';
if (empty($_POST["vorname"])) {
    $errors = "Geben Sie bitte Ihren Vornamen ein";
  } else {
    $vorname;
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$vorname)) {
      $errors = "Nur Buchstaben erlaubt!";
    }
  }
if (!$nachname) $errors[count($errors)] = 'Geben Sie bitte Ihren Nachnamen ein';
if (!$email) $errors[count($errors)] = 'Geben Sie bitte Ihre Mailadresse ein';  

//if the errors array is empty, send the mail / no errors found
if (!$errors) {

bei dem count weis ich nicht ob ich das brauche das ist anscheinend da um eine Endlosschleife zu vermeiden...
 
Zuletzt bearbeitet:
könnte das richtig sein?
Die Zuweisung an die $errors Variable ist falsch. Das musst du genauso wie im Original machen.

bei dem count weis ich nicht ob ich das brauche das ist anscheinend da um eine Endlosschleife zu vermeiden...
Doch, das brauchst du und das hat nichts mit einer Endlosschleife zu tun. Im Grunde genomme ist das ein push an das Array - wobei man das im PHP performanter machen kann
PHP:
$errors[] = 'Geben Sie bitte Ihren Nachnamen ein';
 
Hmmm... verstehe das leider nicht :-((
Kannst mir Bitte den Code zeigen wie der zusammengebaut gehört?
Danke!
 
Dann eventuel so, also ich rate ja nur:
PHP:
if (empty($_POST["vorname"])) {
    $errors[count($errors)] = "Geben Sie bitte Ihren Vornamen ein";
  } else {
    $vorname;
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$vorname)) {
      $errors[count($errors)] = "Nur Buchstaben erlaubt!";
    }
  }

- - - Aktualisiert - - -

Jetzt habe ich eine andere Lösung um den Spamer zu verwirren...
Im HTML habe ich einfach die action: <form id='supportmail' method='post' action='fileadmin/Resources/Public/JavaScript/process.php'> eine Fake action zugewiesen da es ja sowiso mit JS gesendet wird.
<form id='supportmail' method='post' action='site.php?id=179'>
Mal sehen ob es klappt somit ist auch der Spamer etwas beschäftigt ;-)
Besser ist natürlich die PHP Methode wenn man sich damit auskennt!
 
Zurück
Oben