XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Sicherheit von eigenem PHP Kontaktformular (http://xhtmlforum.de/showthread.php?t=41929)

Lloyd Larkin 15.09.2006 21:09

Sicherheit von eigenem PHP Kontaktformular
 
Hallo zusammen

Ich habe vor einer Weile ein eigenes Kontaktformular erstellt, in dem ich mir andere "sichere" Kontaktformulare angesehen habe und diese Techniken zum Teil übernommen habe.

Dennoch ist es mir nicht ganz klar wie spamsicher unten stehendes Kontaktformular nun wirklich ist. Es ist mir klar ohne Captcha nichts völlig spamsicheres erreichen zu können, aber ich möchte mich wenigstens nicht täglich durch 100 Spammails wühlen müssen.

Hier das Formular:
PHP-Code:

 /****** BITTE ANPASSEN *******/
 
$admin_mail "mymail@domain.com";
 
/*****************************/
 
 
if(@($_POST['sent']) AND isset($_POST['sent'])) {
  
  
$name $_POST['name'];
  
$mail $_POST['mail'];
  
$text $_POST['text'];
  
  
$name stripslashes ($name); // Entfernt Slashes
  
$name trim ($name); // Entfernt Leerraum am Anfang und am Ende einer Zeichenkette
  
$name strip_tags ($name); // Entfernt html und php Tags
  
$mail stripslashes ($mail); // Entfernt Slashes
  
$mail trim ($mail); // Entfernt Leerraum am Anfang und am Ende einer Zeichenkette
  
$mail strip_tags ($mail); // Entfernt html und php Tags
  
$text stripslashes ($text); // Entfernt Slashes
  
$text trim ($text); // Entfernt Leerraum am Anfang und am Ende einer Zeichenkette
  
$text strip_tags ($text); // Entfernt html und php Tags
  
  /*$name = htmlentities($name, ENT_QUOTED);
  $mail = htmlentities($mail, ENT_QUOTED);
  $text = htmlentities($text, ENT_QUOTED);*/
  
  
  
$mail preg_replace"/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im"""$mail );
  
$mail preg_replace"/(content-type:|bcc:|cc:|to:|from:)/im"""$mail );
  
$text preg_replace"/(content-type:|bcc:|cc:|to:|from:)/im"""$text );
  
$name preg_replace"/(content-type:|bcc:|cc:|to:|from:)/im"""$name );
  
  
$header "From: $mail"\r\n" .
      
"Reply-To: $mail"\r\n" .
      
'X-Mailer: PHP/' phpversion() .
   
'Date: ' date('r') . 
   
'Message-Id: <' date('YmdHis') . '.' substr($temp_ary[0],2) . '@domain.com>';
  
  if(empty(
$name) OR empty($mail) OR empty($text)) {
   echo 
"<p><strong>Fehler</strong>: Bitte füllen Sie alle Felder aus. <a href=\"#\" onclick=\"history.back()\">Zurück zum Formular</a></p>"
  } else {
   if(
mail($admin_mail$name$text$header)) {
    echo 
"<p class=\"thankyou\">E-Mail wurde gesendet, vielen Dank.</p>";
   } else {
    echo 
"<p><strong>Fehler</strong>: Formular konnte nicht gesendet werden. <a href=\"#\" onclick=\"history.back()\">Zurück zum Formular</a></p>";
   }
  } 

Vielleicht könnt ihr mir den ein- oder anderen Tipp zur Verbesserung geben.

Freundliche Grüsse
lloyd

Wasili 15.09.2006 23:59

Mh... Ich würde dir Vorschlagen, in Formular zum Abschicken noch Idiotenfragen einzubauen, die Zufällig aus der Datenbank ausgelesen werden und ein zufälliger name-Feld haben, dass du in der session speicherst.
Zum Beispiel fragen wie "3 vermindert um 2", "Welche Farbe hat die Sonne", "Ist Wasser grün?"... Sowas halt. Menschen haben damit nicht viel Mühe (Tolerant vielleicht bei der Kontrolle sein... *g*), Spambots dafür um so mehr.

Lloyd Larkin 16.09.2006 01:06

Naja, ist vielleicht nicht ganz so formell wie Captcha, aber geht dennoch in die gleiche Richtung die ich wenn möglich vermeiden möchte... wenns geht.

Boris 16.09.2006 12:23

Du kannst das "säubern" aller Daten wesentlich verkürzen:

foreach($_POST as $key=>$value) $_POST[$key]=trim(strip_tags($value)); // Leerzeichen und HTML löschen

Die Slashes solltest du nur entfernen (stripslashes), wenn Serverseitig the magic_quotes bei PHP eingeschaltet sind (mit get_magic_quotes_gpc() einfach checken).

Wasili 16.09.2006 18:25

PHP-Code:

array_map('strip_tags'$_POST);
array_map('trim'$_POST); 

Geht auch über Array-Funktionen... Selbe Wirkung ;)

Lloyd Larkin 16.09.2006 22:02

Danke euch beiden für den Hinweis, habe ich übernommen.
Aber wie schaut es mit der Sicherheit aus, würdet ihr es so in eure Webseite integrieren?

Boris 16.09.2006 22:37

Mit einem Captcha noch ... ;)

Lloyd Larkin 16.09.2006 23:58

Dann eben mit Captcha ;)
Das PHP Captcha Security Image Script scheint mir passend. Liecht einzubinden und grafisch nicht ganz so schrecklich stören auf der Webseite wie viele andere. Welchen Favorit habt ihr?

Grüsse
lloyd

andir 29.09.2006 21:58

So da bin ich auch mal wieder beim Thema "Sicheres Kontaktformular"

Ich bekomme den code von Lloyd nicht zum Laufen.

Hier der php Code des Auswerteformulars:

PHP-Code:

<html><head><title>Kontaktergebnis</title></head><body>
<?php

 
/****** BITTE ANPASSEN *******/
 
$admin_mail "me@home.de";
 
/*****************************/
  
 
if(@($_POST['sent']) AND isset($_POST['sent'])) {

  
$name stripslashes ($name); 
  
$name trim ($name); 
  
$name strip_tags ($name); 
  
$mail stripslashes ($mail); 
  
$mail trim ($mail); 
  
$mail strip_tags ($mail); 
  
$text stripslashes ($text); 
  
$text trim ($text); 
  
$text strip_tags ($text); 
..
$mail preg_replace("/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im"""$mail ); 
..
$mail preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im"""$mail ); 
..
$text preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im"""$text ); 
..
$name preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im"""$name ); 
..
$tele preg_replace("/(content-type:|bcc:|cc:|to:|from:)/im"""$tele ); 

..
$header "From: $mail"\r\n" .
..
"Reply-To: $mail"\r\n" .
..
'X-Mailer: PHP/' phpversion() .
..
'Date: ' date('r') . 
..
'Message-Id: <' date('YmdHis') . '.' substr($temp_ary[0],2) . 'you@domain.com>';

..if(empty(
$name) OR empty($mail) OR empty($text)) {
..echo 
"<p><strong>Fehler</strong>: Sie haben nicht alle Pflichtfelder, <i>Name, E-Mail-Adresse, Nachricht</i> ausgef&uuml;llt. Bitte füllen Sie diese Felder aus. <a href=\"#\" onclick=\"history.back()\">Zur&uuml;ck zum Formular</a></p>"

..else {
..if(
mail($admin_mail$name$text$header)) {
..echo 
"<p>Ihre Nachricht wurde gesendet, vielen Dank</p>";

..else {
..echo 
"<p><strong>Fehler</strong>:Ihre Nachricht konnte nicht gesendet werden. Bitte versuchen Sie es noch einmal. <a href=\"#\" onclick=\"history.back()\">Zurück zum Formular</a></p>";
..}
..}
?>
</body></html>

Hier bekomme ich einen Parse-Fehler in der letzten Zeile angezeigt :?

Ich mach jetzt schon Stunden damit rum, komme aber nicht weiter.
Weiß jemand von Euch was dazu? Braucht ihr das HTML dazu?

Boris 29.09.2006 22:09

Was sollen die ganzen .. Punkte da drin?

Außerdem ist das hier sehr umständlich:
Code:

$name = stripslashes ($name);
  $name = trim ($name);
  $name = strip_tags ($name);
  $mail = stripslashes ($mail);
  $mail = trim ($mail);
  $mail = strip_tags ($mail);
  $text = stripslashes ($text);
  $text = trim ($text);
  $text = strip_tags ($text);

Das geht auch so (steht auch oben):

Code:

foreach($_POST as $key=>$value) $_POST[$key]=trim(strip_tags($value)); // Leerzeichen und HTML löschen
Das Formular wird aber so oder so nicht funktionieren, wenn die register_globals AUS sind (was immer häufiger der Fall ist). Die Variablen sollten mit $_POST['text'] und so weiter angesprochen werden. ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:15 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023