Antworten auf deine Fragen:
Neues Thema erstellen

Spam-Bot hebelt mein javascript aus

strichcode

Nicht mehr ganz neu hier

Ihr Lieben, ich brauch mal etwas Unterstützung:

Mein Anfrage-Formular bringt neuerdings eine große Menge Spam-Mails.
Sämtliche Formularfelder werden mit "lsdkjflskdjf" und natürlich auch Links zu zweifelhaften Seiten gefüllt.

Also habe ich
a. einen Honeypot eingefügt und
b. noch eine zusätzliche Telefonnummern-Prüfung geschrieben

Mein Problem:
Das Telefon-nr.-Feld wird folgendermaßen geprüft: Die Nummer muß mit einer "0" oder einem "+" beginnen, sonst wird das Formular nicht abgeschickt.
Das funktioniert auch!!!

Prüfe ich das Formular mit der Hand ist alles prima.
Aber ich bekomme weiterhin mails in denen das Telefon-Nummer-Feld mit "lljslkjflsdj" gefüllt ist.

Wie kann das sein?

Könnt Ihr mir erklären, wie der Spambot mein javascript umgeht und was ich sonst noch tun kann, damit der Spuk aufhört?

Kleiner Witz am Rande: Ein paar der Textfelder werden auch mal mit folgedem Text ausgefüllt:
"Hello, good guestbook, but many spam post!"
Da musste ich echt lachen, aber das Handwerk legen möchte ich ihm doch!

Danke schonmal für's Mitdenken
 

strichcode

Nicht mehr ganz neu hier

ahem... da brauch ich mehr Erklärung zu.
Den Ausdruck validieren kenne ich nur im Zusammenhang mit sauberem html.

Betrachtet mich bitte programmier-mäßig als ambitionierten Anfänger. ;-)
 

vaha

Noch nicht viel geschrieben

Wenn man Seiten mit einem aktivierten Plug-In wie z.B. "NoScript" aufruft, werden die in der Seite eingebetten JavaScript-en nicht ausgeführt und man kann in die Formularfelder alles eingeben was man möchte und es wird auch so ins Backend abgeschickt.

Das musst Du mittels Regulärer Ausdrücke (regular expressions) abfangen, z.B. mit php o.ä.
Such dazu nach "php regex"
 

Myhar

Hat es drauf

Wie er es abfängt kommt darauf an. Validieren heißt: Schauen ob es richtig ist. Alles, was im Browser geprüft wird (JS/HTML/CSS) kann vom Benutzer beliebig verändert werden. DAs, was am Server läuft, kann nicht verändert werden. Also muss alles, was dein Skript empfängt, auch am Server überprüft werden. Ob dafür wirklich regular expressions notwendig sind kommt auf die Komplexität deiner Abfragen an.
 

strichcode

Nicht mehr ganz neu hier

Aha! Langsam wirds hell. Danke Euch schonmal.

Ich brauche also ein Mail-Script in dem die Prüfungen, die ich jetzt mit js ins Formular geschrieben habe, selbst in z.B. php und erst in diesem script statt finden?

Und das kann so ein Bot dann nicht aushebeln?
 

lachender_engel

Aktives Mitglied

Schalte auf Deinem Rechner JavaSkript aus, und Du siehst, dass es keine Validierung der Daten mehr gibt (wie Myhar und vahar ja schon erklärt haben).
Die Prüfung per JavaSkript ist nur eine kosmetische Sache. Die echte PRüfung erfolg tin einem PHP-Skript, vor dem mail-Befehl.
Es läuft so:
1.) Eingabeformular (wegen mir mit JavaSkript-Prüfung)
2.) Das Formular sendet die Daten an z.B emailsenden.php
3.) in der Datei emailsenden.php erfolgt eine echte Prüfung der Daten.
4.) Sind alle Daten valide (gültig) geht die E-Mail an Dich raus.
5.) Sind Daten ungültig ruft das Skript wieder das Eingabeformular auf und gibt eine entsprechende Meldung raus.
Pascal Bajorat hat mal, in irgendeinem Videotutorial hier, genau dieses Thema besprochen. Solltest Du Dir raussuchen und anschauen.
 

strichcode

Nicht mehr ganz neu hier

So! Vielen, vielen Dank für Eure Antworten. Ich melde mich erst jetzt, da ich mich mit Euren Infos erstmal vergraben musste. ;-)

Ich habe jetzt folgenden Code zusammengebraut, also ein Script von Stefan Münz mit
Validierungen versehen.

Zwei Fragen habe ich noch dazu:
Es kommen noch ein paar Abfragen der Pflichtfelder, usw. dazu, aber reicht das so?
Ist das ein sicheres Mail-Script für ein Kontaktformular?

Und:
Ich hätte gern folgendes abgefragt:
Die Telefonnummer soll mit einem *+* oder einer *0* beginnen müssen und
das Feld PLZ muß bitte Ziffern enthalten. Nicht ausschließlich Ziffern, wegen ausländischen Zip-Codes, aber Ziffern müssen dabei sein.

In meiner js-prüfung habe ich die Telefonnummer folgendermaßen geprüft:

Javascript:
if (document.sendform.telefon.value.indexOf("0") == -1 && document.sendform.telefon.value.indexOf("+") == -1)
{
alert ("Telefon-Nr. ist nicht richtig.");
checked=false;
}


Aber wie mache ich das in php?

Warum gibt es eigentlich nicht mehr diesen Button mit dem man den code ordentlich einbinden kann???
Es tut mir leid, so hänge ich mein Script jetzt einfach so ohne hightlighting unten ran.
Vlt. wisst Ihr auch hierfür eine Antwort. ;-)


PHP:
<?php
// ======= Konfiguration:
error_reporting(E_ALL);
$mailTo = 'xx';
$mailFrom = '"xx>';
$mailSubject  = 'Feedback selbstgebauter Formmailer';
$returnPage = 'xx/danke.html';
$returnErrorPage = 'xx/fehler.html';
$mailText = "";
//Pfichtfelder abfragen und weitere Spammschutzhürden
if(isset($_POST['submit'])) {
 
   if (!empty($_POST['phone']) && is_numeric($_POST['phone']) == false) { //Wenn Feld nicht leer, dann auf nur Ziffern prüfen
$errors[] = "Telefonnummer bitte nur mit Ziffern angeben";
echo "nummer falsch";}
   if(empty($_POST['email'])){ //Wenn Email leer
$errors[] = "Bitte Emailadresse angeben";
echo "email fehlt";
} elseif (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == false) { //Emailformat überprüfen ab PHP 5.2
$errors[] = "Bitte geben Sie ein gültige Emailadresse an";
echo "email falsch";
}
//Wenn die Abfragen positiv sind
if(empty($errors) ) {
// ======= Text der Mail aus den Formularfeldern erstellen:
// Wenn Daten mit method="post" versendet wurden:
if(isset($_POST)) {
  // alle Formularfelder der Reihe nach durchgehen:
  foreach($_POST as $name => $value) {
  // Wenn der Feldwert aus mehreren Werten besteht:
  // (z.B. <select multiple>)
  if(is_array($value)) {
  // "Feldname:" und Zeilenumbruch dem Mailtext hinzufügen
  $mailText .= $name . ":\n";
  // alle Werte des Feldes abarbeiten
  foreach($valueArray as $entry) {
  // Einrückungsleerzeichen, Wert und Zeilenumbruch
  // dem Mailtext hinzufügen
  $mailText .= "  " . $value . "\n";
  } // ENDE: foreach
  } // ENDE: if
  // Wenn der Feldwert ein einzelner Feldwert ist:
  else {
     
  // "Feldname:", Wert und Zeilenumbruch dem Mailtext hinzufügen
  $mailText .= $name . ": " . $value . "\n";
  } // ENDE: else
  } // ENDE: foreach
} // if
// ======= Korrekturen vor dem Mailversand
// Wenn PHP "Magic Quotes" vor Apostrophzeichen einfügt:
if(get_magic_quotes_gpc()) {
  // eventuell eingefügte Backslashes entfernen
  $mailtext = stripslashes($mailtext);
}
// ======= Mailversand
// Mail versenden und Versanderfolg merken
$mailSent = @mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom);
// ======= Return-Seite an den Browser senden
// Wenn der Mailversand erfolgreich war:
if($mailSent == TRUE) {
  // Seite "Formular verarbeitet" senden:
  header("Location: " . $returnPage);
}
// Wenn die Mail nicht versendet werden konnte:
else {
  // Seite "Fehler aufgetreten" senden:
  header("Location: " . $returnErrorPage);
}
// ======= Ende
exit();
}}
//Ende if isset und Ende empty errors
?>
 
Zuletzt bearbeitet:

patrick_l

Hat es drauf

Warum gibt es eigentlich nicht mehr diesen Button mit dem man den code ordentlich einbinden kann???
Den gibt es noch. Sogar besser als zuvor, da mittlerweile neben HTML und PHP auch JavaScript und CSS vernünftig dargestellt werden. Editiere deinen Beitrag und benutze im Editor den Einfügen-Button
screenshot74u6l.png
.

Liebe Grüße, Patrick
 

strichcode

Nicht mehr ganz neu hier

Nein zugegeben die Videos habe ich nicht angeschaut. Mir sind Video-Tutorials immer zu schnell.
Aber das ARBeitsmaterial habe ich mir sehr wohl runter geladen und angeschaut.

Dort notiert Pascal Bajorat zum Beispiel: !empty($plz) && is_numeric($plz)

Dies prüft, ob die plz eingetragen wurde und ob sie aus Ziffern besteht, richtig?
Für Postleitzahlencodes aus anderen Ländern ist dies aber nicht ausreichend, da dort durchaus auch Buchstaben im zip-code vorkommen.

Jetzt mag es natürlch sein, das Herr Bajorat in dem Video genau dazu etwas gesagt hat, das ist mir dann leider entgangen, sorry. Aber wie schon gesagt, die Videos sind mir zu schnell, ich bin dann nur am Stop-und-zurück-weiter-... drücken und komme dann nicht vorwärts. Wenn ich was geschriebenes vor mir habe, kann ich solange drauf starren, bis ich was kapiere, oder auch viel leichter quer-googlen, also Asche über mein Haupt.

Also ich möchte, das die plz Ziffern enthalten müssen, aber nicht aus ihnen bestehen sollen.
Und die Telefonnummer soll mit + oder 0 beginnen.

Wenn jemand ein paar Worte zum googlen für mich hat, bin ich schon glücklich.
 

lachender_engel

Aktives Mitglied

Dort notiert Pascal Bajorat zum Beispiel: !empty($plz) && is_numeric($plz)

Dies prüft, ob die plz eingetragen wurde und ob sie aus Ziffern besteht, richtig?
Ja.

Für Postleitzahlencodes aus anderen Ländern ist dies aber nicht ausreichend, da dort durchaus auch Buchstaben im zip-code vorkommen.

Also ich möchte, das die plz Ziffern enthalten müssen, aber nicht aus ihnen bestehen sollen.
Und die Telefonnummer soll mit + oder 0 beginnen.

Bei der PLZ musst Du in jedem Fall eine "Regel" finden, die Du abfragen willst.
Du kannst die PLZ zum Beispiel in Anlehnung des ausgewählten Landes spezifisch abfragen.
Oder Du bist kreativ. Soll nur eine Zahl enthalten sein?! Dann konvertierst Du z.B. $plz nach integer.
Oder Du nutzt reguläre Ausdrücke (hier ein Tutorial).
Nur, egal was Du willst, denke wie ein Computer. Nur sagen "Ich will das so oder so" reicht nicht. Du musst eine klare Regel aufstellen wonach Du abfragen willst. Zum Beispiel "die ersten zwei Zeichen dürfen ein Buchstabe oder eine Zahl sein, ab der dritten Stelle dürfen nur Ziffern eingegeben werden". Denn wocher sollen wir wissen, wie Du abfragen willst?

Das Selbe gilt für die Telefonnummer. Da kann Dir z.B. strpos helfen oder dieses Tutorial oder jener Beitrag.
 

strichcode

Nicht mehr ganz neu hier

Danke, lachender_engel, für Deine Geduld!

Ich habe nun folgendes im Programm für die Validierung der Telefonnummer:
PHP:
if (strpos($_POST['phone'], '0') !== 0 ){ //prüft of eine 0 an der ersten Stelle steht
$errors[] = "Telefonnummer bitte mit Null beginnen";
echo "Telefonnummer bitte mit 0 beginnen.";}

Funktioniert tadellos, wenn die Nummer nicht mit '0' beginnt, kommt brav die Fehlermeldung.

Aber: laut php schattenbaum kann man Bedingungen auch mit oder überpfüfen, so zum Beispiel:

PHP:
<?php
if($username == "Claudia" or $passwort == "PHP")
{
  echo "Zugriff erlaubt!";
}
?>

Falls nun jemand seine Telefonnummer mit z.B. +49... angeben will, möchte ich ein '+' ebenfalls an der ersten Stelle zulassen.

Jetzt zu meiner Frage: Schreibe ich:
PHP:
if (strpos($_POST['phone'], '0') !== 0 or strpos($_POST['phone'], '+') !== 0 ){ //prüft of eine 0 oder + in der Telefonnummer vorkommt
$errors[] = "Telefonnummer bitte mit 0 oder + beginnen";
echo "Telefonnummer bitte mit 0 oder + beginnen.";}

geht keine meiner Telefonnummern durch. Nicht, wenn sie mit '+' beginnt, nicht, wenn sie mit '0' beginnt und egal, was man eingibt.

Irgend etwas mache ich noch falsch. Magst Du/Ihr mal drüber gucken? Danke schonmal.
Habt Nachsicht, ich bin noch Anfänger.
 

lachender_engel

Aktives Mitglied

Du bist auf einem guten Weg.
Mit der 0 in strpos gibst Du an, dass die 0te-Postion (als das erste Zeichen) geprüft wird. Der Vergleichsoperator ist dahinter. Deine Abfrage muss daher so aussehen:
PHP:
if (strpos($_POST['phone'], '0') != '0' || strpos($_POST['phone'], '0') != '+' ){ //prüft of eine 0 oder + in der Telefonnummer vorkommt
$errors[] = "Telefonnummer bitte mit 0 oder + beginnen";
echo "Telefonnummer bitte mit 0 oder + beginnen.";}
 

strichcode

Nicht mehr ganz neu hier

Irgendein Fehler muß noch drin sein.
Es geht die Telefonnummer mit 0 an der ersten Stelle durch.
Es gibt Fehlermeldungen, wenn an der ersten Stelle keine 0 steht,
aber das + an der ersten Stelle akzeptiert er noch nicht.

Irgendwas ist noch falsch.

Lieben Dank für Deine Mithilfe und Geduld.
 

Duddle

Posting-Frequenz: 14µHz

Mit der 0 in strpos gibst Du an, dass die 0te-Postion (als das erste Zeichen) geprüft wird. Der Vergleichsoperator ist dahinter.
Nein, das stimmt nicht:
http://php.net/manual/de/function.strpos.php schrieb:
Gibt die numerische Position des ersten Vorkommens von needle innerhalb der Zeichenkette haystack zurück.

Die Prüfung mit strpos() ergibt nicht viel Sinn, da es in der gesamten Zahl sucht. Wenn später eine "0" auftritt wird diese auch gefunden, aber nicht an Stelle 0, also ist das laut deiner Logik ein Fehlerfall.
Wenn du Stelle 0 prüfen willst, dann kannst du das direkt so machen:
PHP:
<?php
  if($nummer[0] === "0" or $nummer[0] === "+"){
   echo "ok";
  }
?>


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.638
Beiträge
1.538.503
Mitglieder
67.559
Neuestes Mitglied
mic4mac
Oben