Jetzt kostenlos Anmelden!

Dirk Kántor Männlich

aká Dooki

Beiträge: 2 064

Geschlecht: Männlich

PHPKIT Version: keine

1

Dienstag, 20. November 2007, 22:18

Kontaktformular gegen Spam schützen

Zitat

Ich habe schon einen Artikel, der einen Bug behebt, wodurch es möglich war, eine Email an mehrere zu schicken.

Dieser hier hat damit aber nichts zutun, damit ihr nichts verwechselt.. der andere ist wichtig!
http://www.kitnetwork.de/wbb/index.php?p…ead&threadID=68




Ich bin der Meinung, nur darauf basiert diese Codeänderung, dass Bots, welche Spam über das Kontaktformular verschicken, sich den HTML Code der durch das PHPKIT erstellt wird, "schnappen" und ihn ab sofort selber verwenden.
Damit meine ich, dass sie auf die Homepage kommen, Quelltext schnappen, es bei sich selber abspeichern und fort an, von dem Formular, was sie sich gespeichert haben, Spam losschicken.
Schicken tun sie das an die contact.php des PHPKIT's, da sie von der auch das Formular geschnappt haben!

Änderungen am Formular selbst, das entfernen des Links zum Formular, all diers bringt nix, da sie ja das Formular selbst bei sich haben und es nur zu euch schicken.

Wie handelt man dagegen?

Sollten Bots so vorgehen, wie oben beschrieben, dann muss man ein Formular flexibel mit abfragen machen. Das bedeutet, die INPUT Felder müssen stetig andere Namen haben. Wie das? Wie soll das gehen? Die einfachste Lösung war in meinen Augen, einen Timestamp vorzuschalten. Ein Timestamp ist ein aus Ziffern bestehender Zahlencode der den aktuellen Zeitstempel in Sekunden in sich trägt, bzw aus dem besteht er! Nun noch eine Abfrage einbauen, damit das Formular trotzdem noch genutz werden kann, mit teilweise festen Werten.

Funktionieren tut das Formular weiterhin, wie zuvor auch.
Was nun nicht mehr geht ist, dass jemand x Minuten nachdem er das Formular aufrief, noch abschicken kann. Man muss also innerhalb von bsp. 10 Minuten seinen Text geschrieben haben und diesen abgeschickt haben.
Sollten Bots nun das Formular gespeichert haben, so haben sie den Zeitstempel von damals, wo sie sich das Formular geholt haben, also oftmals weit über 10 Minuten her.

Sollten Bots wirklich so vor gehen, dann könnten hiermit 90% der Spams ausbleiben, denn irgendwelche kommen immer durch (manuelles eintragen oder so..)!


Wer das versuchen will nimmt Änderungen an der contact.php vor..

contact.php mit einem Editor öffnen.

suche:
PHPKIT 1.6.03

PHP-Quelltext

1
2
3
4
5
6
7
8
if (isset($_POST['action'])) {
 $contact_message=$_POST['contact_message'];
 $contact_subject=$_POST['contact_subject'];
 $contact_email=$_POST['contact_email'];
 $contact_name=$_POST['contact_name'];#
 $ACTION=$_POST['action']; 
 }
else $ACTION='view';


PHPKIT 1.6.1

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
if(isset($_POST['action'])) {
    $ACTION=$_POST['action'];
    
    $contact_message=$ENV->_post('contact_message');
    $contact_subject=$ENV->_post('contact_subject');
    $contact_email=$ENV->_post('contact_email');
    $contact_name=$ENV->_post('contact_name');
    }
else
    $ACTION='view';



ersetze es in beiden PHPKIT Versionen damit:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
unset($contact_message);unset($contact_subject);unset($contact_email);unset($contact_name);
$time time();
$minuten 1;
$timestamp_array_1 = array("0","1","2","3","4","5","6","7","8","9");
$timestamp_array_2 = array("a","b","c","d","e","f","g","h","i","j");
$formular_array = array("name","email","subject","message");
$formular_array_key str_replace($timestamp_array_1,$timestamp_array_2,$time);
$formular_contact_name    base64_encode($formular_array_key."_contact_name");
$formular_contact_email   base64_encode($formular_array_key."_contact_email");
$formular_contact_subject base64_encode($formular_array_key."_contact_subject");
$formular_contact_message base64_encode($formular_array_key."_contact_message");
if(isset($_POST['action'])) {
  $formular_array_keys1 array_keys($_POST);
  for($i=0;$i<count($formular_array_keys1);$i++) {
    $formular_array_key_explode explode("_",base64_decode($formular_array_keys1[$i]));
    $formular_array_keys_str_replace str_replace($timestamp_array_2,$timestamp_array_1,$formular_array_key_explode[0]);
    $formular_array_keys2[$i] = $formular_array_keys_str_replace."_".$formular_array_key_explode[1]."_".$formular_array_key_explode[2];
    if(in_array($formular_array_key_explode[2],$formular_array)) {
      if(($time-$formular_array_keys_str_replace) <= (60*$minuten)) {
        //$formular_error = "nein";
        if($formular_array_key_explode[2] == "message") eval("\$contact_message=\$_POST['".base64_encode($formular_array_key_explode[0]."_contact_message")."'];");
        if($formular_array_key_explode[2] == "subject") eval("\$contact_subject=\$_POST['".base64_encode($formular_array_key_explode[0]."_contact_subject")."'];");
        if($formular_array_key_explode[2] == "email") eval("\$contact_email=\$_POST['".base64_encode($formular_array_key_explode[0]."_contact_email")."'];");
        if($formular_array_key_explode[2] == "name") eval("\$contact_name=\$_POST['".base64_encode($formular_array_key_explode[0]."_contact_name")."'];");
        $ACTION=$_POST['action'];
      } else {
        //$formular_error = "ja";
        $ACTION='view';
      }
    }
  }
 }
else $ACTION='view';


templates/contact.htm

folgende Zeichenfolgen suchen: (stehen alle einzeln!)

Quellcode

1
2
3
4
name="contact_name"
name="contact_email"
name="contact_subject"
name="contact_message"


und ersetzt sie wie folgt:

Quellcode

1
2
3
4
name="$formular_contact_name"
name="$formular_contact_email"
name="$formular_contact_subject"
name="$formular_contact_message"


also:

Zitat

name="$formular_contact_name"


das rote hinzufügen...


Für das testen bei der 1.6.1 bedanke ich mich bei Headless

Der direkte Download befindet sich bei den "Verwandten Downloads" hier unter dem Artikel.
  • Zum Seitenanfang
  • Zum Seitenende