• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Formular Überprüfung böse Wörter

Josi

Neues Mitglied
Hallo,


ich verwende gerade das PHP-Formular von 4Webmaster.net.
Ich würde nun gerne das Absenden verhindern, wenn jemand http dort eingibt, um spam zu vermeiden.


Beispiel Formular:
(langer Code ich weiß, aber ich dachte ich poste ihn lieber komplett)


PHP:
<?phperror_reporting(E_ALL);/**************************************************
    Formulargenerator v1.0 by 4Webmaster.net
            Programmed by Borlabs            Website: www.borlabs.de
            visit www.4webmaster.net
**************************************************/$error = false;$errors = array();$receiver = '[email protected]';
function check_email ($string) {    // RegEx created by Myle Ott, found at regexlib.com    return preg_match('/^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$/i', $string);}
function check_onlynumbers ($string) {    return preg_match('/^[0-9,.]{1,}$/', $string);}
function check_onlyletters ($string) {    return preg_match('/^[a-zA-ZäöüÄÖÜß]{1,}$/', $string);}
function send_email ($subject, $body, $receiver, $html = 1) {    if ($html != 1) {        $body = str_replace('<br />', "\n", $body);        $body = str_replace('<br>', "\n", $body);        $body = strip_tags($body);    }
    $subject = str_replace('\n', '', $subject);    $subject = str_replace('\r', '', $subject);
    if ($html) {        $header    = 'MIME-Version: 1.0' . "\n";        $header .= 'Content-type: text/html; charset=iso-8859-15'."\n";        $header .= 'From: '.$receiver.' <'.$receiver.'>'."\n";    } else {        $header    = 'MIME-Version: 1.0' . "\n";        $header .= 'From: '.$receiver.' <'.$receiver.'>'."\n";    }
    if (mail($receiver, $subject, $body, $header)) {        return true;    } else {        return false;    }}
function array_stripslashes(&$var) {    if(is_string($var)) {        $var = stripslashes($var);    } else {        if(is_array($var))            foreach($var as $key => $value)                array_stripslashes($var[$key]);    }}
if(get_magic_quotes_gpc()){  array_stripslashes($_GET);  array_stripslashes($_POST);  array_stripslashes($_REQUEST);  array_stripslashes($_COOKIE);}
if (!empty($_POST)) {    // Prüfung für das Feld "Name"    $errors['Name'] = null;    if (empty($_POST['Name'])) {        $error = true;        $errors['Name'] = ' class="error"';    }    if (!check_onlyletters($_POST['Name'])) {        $error = true;        $errors['Name'] = ' class="error"';    }
    // Prüfung für das Feld "text"    $errors['text'] = null;    if (empty($_POST['text'])) {        $error = true;        $errors['text'] = ' class="error"';    }
}    $_text_Name = (!empty($_POST['Name']) ? htmlspecialchars($_POST['Name'], ENT_QUOTES, 'iso-8859-15') : null);
    $_text_text = (!empty($_POST['text']) ? htmlspecialchars($_POST['text'], ENT_QUOTES, 'iso-8859-15') : null);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" /><!--    Formulargenerator v1.0 by 4Webmaster.net
        Programmed by Borlabs        Website: www.borlabs.de
        visit www.4webmaster.net--><title>Test</title><style type="text/css">body {    font: 12px Verdana, Tahoma, Arial, Helvetica, sans-serif;    color: #444;}
h1, p {    margin: 10px; padding: 0px;}
textarea {    width: 350px;    padding: 2px;    font: normal 12px Verdana, sans-serif;    border: 1px solid #828790;    height: 100px;    color: #777;}
input.button {    margin: 0;    font: bolder 12px Arial, Sans-serif;    border: 1px solid #828790;    padding: 1px;    background: #FFF;    color: #CC0000;}
.error_msg {    padding: 4px;    background-color: #ffeeee;    border: 1px dotted #cc0000;    margin: 5px 10px 5px 10px;    color: #cc0000;}
.error { color: #cc0000; }
fieldset { width: 570px; }
div.formulargenerator-4webmaster label,div.formulargenerator-4webmaster .controlset span {    width: 150px;    display: block;    float: left;    text-align: right;}
div.formulargenerator-4webmaster label { margin: 5px; }div.formulargenerator-4webmaster .controlset span {    margin: 0px 0px 0px 5px; }div.formulargenerator-4webmaster .controlset label {    display: inline;    float: none;}
div.formulargenerator-4webmaster .controlset input { margin: 0px 0px 0px 10px; }div.formulargenerator-4webmaster input,div.formulargenerator-4webmaster select,div.formulargenerator-4webmaster textarea {    margin: 2px 2px 2px 5px;}

div.formulargenerator-4webmaster div { clear: both; }</style></head><body><?phpif ($error || empty($_POST)) {?><form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'iso-8859-15'); ?>" method="post"><fieldset><legend>Test</legend><div class="formulargenerator-4webmaster"><?php if ($error) { ?><div class="error_msg">Bitte alle mit * markierten Felder ausfüllen.</div><?php } ?><div>    <label for="Name"<?php echo !empty($errors['Name']) ? $errors['Name'] : null ; ?>>Name *</label>    <input tabindex="1" type="text" id="Name" name="Name" value="<?php echo $_text_Name; ?>" /></div><div>    <label for="text"<?php echo !empty($errors['text']) ? $errors['text'] : null ; ?>>text *</label>    <input tabindex="2" type="text" id="text" name="text" value="<?php echo $_text_text; ?>" /></div><div style="text-align: center; margin: 5px;">    <input type="submit" value="Absenden" /></div><p style="text-align: center; margin: 0px;"><a style="color: #aaa; font-size: 10px;" href="http://www.4webmaster.net/" title="Webmaster Tools, Scripte, Tutorials, Formulargenerator">Formulargenerator by 4Webmaster.net</a></p></div></fieldset></form><?php} else {    $body = '';    $body .= 'Name: '.htmlspecialchars(!empty($_POST['Name']) ? $_POST['Name'] : '', ENT_QUOTES, 'iso-8859-15').'<br>';    $body .= 'text: '.htmlspecialchars(!empty($_POST['text']) ? $_POST['text'] : '', ENT_QUOTES, 'iso-8859-15').'<br>';    if(send_email('Test', $body, $receiver)) {        ?>        <h1>Test</h1>        <p>Vielen Dank für Ihre Nachricht.</p>        <?    } else {        ?>        <h1>Test</h1>        <p>Das Formular konnte leider nicht abgesendet werden. Bitte versuchen Sie es später noch einmal.</p>        <?    }}?></body></html>




Ich habe es nun mit dem Script von wir prfen auf: bse, bse Wrter (the Badwords) versucht.


dh. ich habe diese Funktion oben eingefügt:


PHP:
// Funktionfunction check_badwords($fieldname, $formmethod){
$badwordsarray=array('www', 'http'); 
if($formmethod=="POST"){$feldwert=$_POST[$fieldname];}elseif($formmethod=="GET"){$feldwert=$_GET[$fieldname];}else{return false;}
$wortliste=array();foreach($badwordsarray as $boeseswort){if($boeseswort!=""){$wortliste[]=strtolower($boeseswort);}}
for($st=0, $hochzaehlen=0; count($wortliste)>$st ; $st++){ $pos = strpos(strtolower($feldwert), $wortliste[$st]); if($pos !== false){$hochzaehlen++;}} if($hochzaehlen==0){return $ergebnis=false;} else{return $ergebnis=$hochzaehlen;}}


und dann habe ich versucht, die Funktion für das Feld "Text" anzuwenden:


PHP:
    // Prüfung für das Feld "text"            $errors['text'] = null;    if (empty($_POST['text']) OR check_badwords('text', 'POST') >=1 ) {        $error = true;        $errors['text'] = ' class="error"';    }


Leider ohne Erfolg, das Formular geht trotzdem raus. Liegt es irgendwie an den Variablen $fieldname, $formmethod, also "check_badwords('text', 'POST')" ?


Oder lassen sich die beiden Scripte gar nicht vereinen?


Was mich irritiert hat, dass das Formular anscheinend schon gefiltert wird. Zumindest lässt sich das Formular mit den Inhalten "arsch" oder "schlampe" nicht abschicken… Ich verstehe gar nicht, an welcher Stelle da der Filter liegt? oder macht das mein Server automatisch?


Ich hoffe ich erschlage euch hiermit nicht, ich weiß ja, dass keine langen Codes erwünscht sind… Aber ich weiß leider nicht weiter! Und ich habe keine Zeit, ein Formular komplett selbst zu machen... Captcha wollte ich eigentlich auch nicht.


Liebe Grüße
Josi
 
Das Scirpt sieht aus wie ein Haufen Stroh da will sich sicher keiner durcharbeiten und die Strohhalme raussuchen.
Weiters wo verhindert du das absenden. Ein Filter ist schön und gut. Aber der Filtert eben nur und verhindert kein Absenden des Formulars.

Weiters werden die meisten Spam einträge von Bots getätig und nicht von realen Menschen schließe alle Bots aus und du hast auch keinen Spam mehr. Dann brauchst du diesen Badword filter auch nicht mehr.

Mfg Splasch
 
Ganz so wirr ist es eigentlich gar nicht, aber hier werden irgendwie einfach mal alle Absätze genommen. Außerdem hatte ich ja den wichtigen Teil unten dargstellt.. aber naja.. geht wohl nicht!
Und natürlich verhindert das Teil ein Absenden des Formulars, wenn ich sage: "Wenn diese Bedingung zutrifft sende nicht ab und schreibe "Fehler"".

Wie schließe ich denn alle Bots aus?
 
"Alle" Bots kann man niemals ausschließen. Dafür gibt es keine 100%ig sichere Methode.

Nach meiner Erfahrung ist jedoch für den Anfang oft ein Honeypot schon ausreichend. Wenn der nicht reicht, dann noch ein Captcha, welches nur bei nicht-aktiviertem JavaScript wird. Darüber habe ich bisher in mehreren Jahren auf verschiedenen Webseiten nur 2 Spam-Mails durchgehen sehen.
Natürlich gibt es noch viele andere Methoden auf die andere Webseiten-Programmierer schwören. Selbst von Captchas gibt es ja dutzende unterschiedliche Methoden. Wenn deine Webseite neu ist und kaum Besucher hat, dürfte aber imho ein Honeypot reichen.
 
Dazu ein Zitat aus einem halbwegs aktuellen php.de-Thread:

Och Leute, stellt doch einfach ein Feld bereit, in das die Antwort auf eine extrem simple Frage (z.B. "Wie lautet der Name von Albert Einstein?") eingegeben werden muss. Die Fragen kann man auch variieren. Anschließend füllt man die Antwort per JavaScript automatisch in das Feld und versteckt es. 90% aller Nutzer bekommen davon gar nichts mit und die 10% ohne JavaScript können sie für gewöhnliche leicht beantworten. Die Bots scheitern daran aber gnadenlos.

- Gästebuch gegen spambot schützen - php.de

Ich kann aber leider aus eigener Erfahrung nur mehr oder weniger objektiv sagen, dass die „einfachen“ Tricks (Honey Pot, Zeitschalter) nicht wirklich viel bringen. Statt 10.000 Spams pro Woche sind es damit eben 100. Das ist trotz allem zu viel.
 
Ganz so wirr ist es eigentlich gar nicht, aber hier werden irgendwie einfach mal alle Absätze genommen. Außerdem hatte ich ja den wichtigen Teil unten dargstellt.. aber naja.. geht wohl nicht!
Und natürlich verhindert das Teil ein Absenden des Formulars, wenn ich sage: "Wenn diese Bedingung zutrifft sende nicht ab und schreibe "Fehler"".

Wie schließe ich denn alle Bots aus?

Am efektivsten sind immer eigene Ideen die noch nicht bekannt sind so können die Bots darauf nicht reagieren.
Am besten du machst das Level Stufen weiße je höher das level um so mehr wird geprüft.

Hier mal die Zusammenfassung der Wichtigsten Punkte:


1.) Zeit prüfen die vergangen ist zwischen dem Aufruf und des absenden des Formulars
2.) Verstecktes Feld benutzen (mit css verstecken ) wenn es ausgefüllt wurde Spam
3.) Token im Formular verwenden der bei jeden neu Aufruf generiert wird
4.) Zufalls Feldnamen bei jeden Aufruf generieren als Cache in der Session zwischen speichern
5.) Prüfe von wo das Formular abgeschickt wurde Server variable ( 'HTTP_REFERER' )
6.) Feld mit Frage und Antwort per Javascirpt automatisch ausfüllen und verstecken.


Mfg Splasch
 
Zurück
Oben