Kontaktformular erstellt,Verbesserungsvorschläge?

leon_20v

Erfahrenes Mitglied
Hallo,

ich habe ein Kontaktformular erstellt, welches Spam sicher sein soll.
Ich werde noch ein Ip-Filter einbauen, damit man nur alle 3min eine Nachricht schreiben kann.

Vielleicht kann mal jemand drüber schauen und sagen wo Sicherheitslücken sind.
PHP:
<?php

session_start();

$firma 		= preg_replace("/[^A-Z a-z0-9]/", "", $_POST['firma']);
$name		= preg_replace("/[^A-Z a-z0-9]/", "", $_POST['name']);
$strasse  	= preg_replace("/[^A-Z a-z0-9]/", "", $_POST['strasse']);
$ort      	= preg_replace("/[^A-Z a-z0-9]/", "", $_POST['ort']);
$plz      	= preg_replace("/[^A-Z a-z0-9]/", "", $_POST['plz']);
$email    	= preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "",  $_POST['email'] ); /* Filter alles auser Zeichen die in einer Email vorkommen können */
$email	    = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $email ); /* Filter alles, was zum versenden an Spam verwendet werden könnte */
$text  		= preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "",  $_POST['text'] );
$Msg 		= "";

// Captcha start in 5 Schritten
$captcha    = preg_replace("/[^0-9]/", "", $_POST['captcha']); // Captcha eingabe vom Formular
$captcha2   = rand(1, 10); // Erste Zahl zwischen 1 und 10 Würfeln
$captcha3   = rand(1, 10); // Zweite Zahl zwischen 1 und 10 Würfeln
$captcha4 = $captcha2 + $captcha3; // Zahlen addieren
$captcha5 = preg_replace("/[^0-9]/", "", $_POST['captcha5']); // $Captcha4 wird aus der Variable Post geholt

if ( $name != "" && $email != "" && $captcha != "" && $text != "") // Prüfen ob alle Pflichtfelder ausgefüllt sind, wenn nicht Nachricht ausgeben
	{
		if ($captcha5 == $captcha) // Prüfen ob das Captcha mit dem eingebenen Captcha identisch ist
		{	// Email versenden:
			$mail_adresse =  "deine-email.de";
			
$EndNachricht = "
Folgende Nachricht wurde über das Kontaktformular übermittelt:\n\n

Name: $name \n
Firma: $firma \n
Name: $strasse \n
Name: $ort \n
Name: $plz \n
eMail: $email \n\n
Nachricht:\n  $text \n \n";

$txt = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $EndNachricht );
mail("$mail_adresse", "web-Kontaktformular",$txt, "From: $email\n");
$Msg = '<p>Vielen Dank, wir werden die Nachricht baldmöglichst bearbeiten!</p> ';
		
		}
		else $Msg = '<p>Die Sicherheitsabfrage (Spamschutz) war falsch, bitte versuche es erneut!</p>';
	}
else $Msg = '<p>Bitte fülle alle Pflichtfelder aus!</p>';




?>

HTML:
<form action="kontakt.php" method="post" enctype="multipart/form-data">
<table width="400" border="1">
  <tr>
    <td colspan="2"><?php echo "$Msg"; ?></td>
    </tr>
  <tr>
    <td><div align="right">Firma:</div></td>
    <td><input name="firma" type="text" value="<?php echo "$firma"; ?>" /></td>
  </tr>
  <tr>
    <td><div align="right">Name*:</div></td>
    <td><input name="name" type="text" value="<?php echo "$name"; ?>" / ></td>
  </tr>
  <tr>
    <td><div align="right">Stra&szlig;e:</div></td>
    <td><input name="strasse" type="text" value="<?php echo "$strasse"; ?>" / ></td>
  </tr>
  <tr>
    <td><div align="right">Ort:</div></td>
    <td><input name="ort" type="text" value="<?php echo "$ort"; ?>" / ></td>
  </tr>
  <tr>
    <td><div align="right">PLZ:</div></td>
    <td><input name="plz" type="text" value="<?php echo "$plz"; ?>" / ></td>
  </tr>
  <tr>
    <td><div align="right">Email*:</div></td>
    <td><input name="email" type="text" value="<?php echo "$email"; ?>" / ></td>
  </tr>
  <tr> 
    <td><div align="right">Sicherheitsfrage*: <br /> <?php echo "$captcha2 + $captcha3 ="; ?></div></td>
    <td><input name="captcha" type="text" value="<?php echo "$captcha"; ?>" / >
    </td>
  </tr>
  <tr>
    <td><div align="right">Nachricht:*</div></td>
    <td><textarea name="text" rows="6" cols="40"><?php echo "$text"; ?></textarea></td>
  </tr>
  <tr>
    <td><input type="submit" value="Absenden" name="senden">
</td>
    <td><input type="reset" value="Löschen" name="reset"></td>
  </tr> 
</table>
<input name="captcha5" type="hidden" value="<?php echo "$captcha4"; ?>" / >
</form>





Jetzt hab ich das Problem, dass durch das preg_replace

PHP:
$text  		= preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "",  $_POST['text'] );

die Zeilenumbrüche im Textfeld auch gefiltert werden, irgendwie bekomme ich es nicht hin, dass es läuft?




Danke :)
 
Zuletzt bearbeitet:
Aus Performancegründen würde ich hier auf reguläre Ausdrücke verzichten.

[phpf]ctype_alnum[/phpf] für alphanumerische Strings
[phpf]ctype_print[/phpf] für alle druckbaren Zeichen (Nachricht selbst)

[phpf]filter_var[/phpf] mit FILTER_VALIDATE_EMAIL für die E-Mail.

[phpf]ctype_digit[/phpf] für deine Captcha Prüfung.

Das sollte eigentlich alles abdecken und deine Probleme lösen ;) Der Captcha ist übrigens relativ unsicher, da die Werte im Klartext gesendet werden... Und wozu sind $captcha2, $captcha3 und $captcha4 da? Die benutzt du hier im Skript ja gar nicht.
 
okay danke, dann werde ich wohl das ganze script umbauen müssen...

in captcha 2 und 3 werden die zahlen gespeichert die mit rand(1,10) erstellt werden und dann unten im php ausgegben.

captcha 4 ist dann das ergebnis welches mit POST übergeben wird.

Naja das Captcha werde ich so lassen, weil ich ja noch eine Ip-Sperre hinzufügen werde :)



wie ist das eigentlich? schützt ctype vor einer injektion? denn druckbare zeichen sind auch "<" oder nicht?
 
Zuletzt bearbeitet:
also ich hab das gerade versucht umzusetzen:

PHP:
if (ctype_print($text)) 
{ // email versenden
 } 
else echo 'Sicherheitsfehler';

Allerdings gibt er mir immer false aus (also immer die else)

Das liegt wohl daran, das die /n die ja im Textarea für Zeilenumbrüche erstellt werden, als falsch interpretiert werden. Wie kann ich das umgehen? ich will ja Zeilenumbrüche haben?

PHP:
$text  		= filter_var($_POST['text'] , FILTER_SANITIZE_EMAIL);

und warum kann ich nicht filtern? der kennt die Funktion filter irgendwie nicht:

Code:
Fatal error: Call to undefined function: filter_var() in /var/www/web1155/html/kontakt.php on line 13
 
Zuletzt bearbeitet:
Anscheinend setzt du eine PHP Version kleiner als 5.2 ein, wo es die Funktion [phpf]filter_var[/phpf] nicht gibt. Ich rate hier dringend ein Update durchzuführen.

Und ich hatte nicht mehr im Kopf, dass [phpf]ctype_print[/phpf] nur auf sichtbare Zeichen reagiert. Da der Text also Zeilenumbrüche beinhalten darf, alphanumerische Zeichen und wahrscheinlich auch die üblichen Satzzeichen und eventuelle Sonderzeichen, würde ich hier auf eine Textprüfung verzichten und nur eine Sicherheitsprüfung durchführen. Das wäre bei mir [phpf]strip_tags[/phpf] und [phpf]addslashes[/phpf]... Ansonsten müsstest du dir einen regulären Ausdruck bauen, der die Nachricht verifiziert, was m. E. n. ein zu großer Aufwand bei zu wenig Gewinn wäre. Zu wenig Gewinn weil die Nachricht keine wirklichen Sicherheitslücken eröffnen kann, außer einer möglichen Injektion von HTML- oder JS-Code, die aber in einer Textmail sowieso vernachlässigt werden können.
 
jap ich habe gerade meinen Hoster kontaktiert und den gebeten er soll doch bitte die Version updaten (das kann ich doch nicht?).

Naja ich habe das ganze jetzt so gelöst, ist zwar nicht ganz sauber, aber erfüllt seinen Zweck:

PHP:
preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)( \\n )]/im", "",  $_POST['text'] );

// Also mit [^(\\n)] wird der Zeilenumbruch nicht ersetzt. Sollte eigentlich ziemlich Sicher jetzt sein
 

Neue Beiträge

Zurück