Kontaktformular: Probleme Umlaute und Sicherheit

Alori

Grünschnabel
Hallo zusammen!

Ich hab für eine Website ein Kontaktformular gemacht (html/css), dass ich jetzt irgendwie auslesen, verarbeiten und abschicken muss.

Weil ich die Verarbeitung mit PHP machen wollte melde ich mich jetzt mit 2 Problemen diesbzgl. hier im PHP-Forum.

Das Formular sieht so aus:

HTML:
		<fieldset id="kontakt">
				<form id="kontakt" name="kontaktformular" 
				action="mail.php" method="post" enctype="multipart/form-data"
				onsubmit="return chkFormular()"> 
			
				<div style="float:left">
					<input class="required" id="vorname" name="vorname" type="text" value="Vorname" required="required" 
					onfocus="if(this.value == 'Vorname') { this.value = ''; }" 
					onblur="if(this.value == '') { this.value = 'Vorname';} if(this.value != 'Vorname fehlt!' && this.value != 'Vorname') {this.className = 'correct';}">
				</div>
				<div style="float:right; margin-right:-5px">
					<input class="required" id="nachname" name="nachname" type="text" value="Nachname"  required="required"
					onfocus="if(this.value == 'Nachname') { this.value = ''; }" 
					onblur="if(this.value == '') { this.value = 'Nachname';} if(this.value != 'Nachname fehlt!' && this.value != 'Nachname') {this.className = 'correct';}">
				</div>
				<div style="float:left">
					<input class="required"  name="email" type="text" value="Ihre Email"  required="required"
					onfocus="if(this.value == 'Ihre Email') { this.value = ''; }" 
					onblur="if(this.value == '') { this.value = 'Ihre Email';this.className='correct';} if(this.value != 'Email fehlt!' && this.value != 'Ihre Email') {this.className = 'correct';}">
				</div>
				<div style="float:left">
					<input class="required"  name="betreff" type="text" value="Betreff"  required="required"
					onfocus="if(this.value == 'Betreff') { this.value = ''; }" 
					onblur="if(this.value == '') { this.value = 'Betreff';} if(this.value != 'Betreff fehlt!' && this.value != 'Betreff') {this.className = 'correct';}">
				</div>
				<div style="float:left">
					<textarea class="required"   name="nachricht" cols="20" rows="5" required="required"
					onfocus="if(this.value == 'Nachricht') { this.value = ''; }" 
					onblur="if(this.value == '') { this.value = 'Nachricht'; } if(this.value != 'Nachricht fehlt!' && this.value != 'Nachricht') {this.className = 'correct';}"> Nachricht</textarea>
				</div>
				<div>
					<input class="button" type="submit" value="Senden" />
				</div>
			</form>
		</fieldset>

Beim Submit wird dann erstmal per Javascript validiert:

Code:
<script type="text/javascript">
function chkFormular () {
  if (document.kontaktformular.vorname.value == "Vorname") {
	document.kontaktformular.vorname.className = 'error'
	document.kontaktformular.vorname.value = "Vorname fehlt!"
    document.kontaktformular.vorname.focus();
    return false;
  }
  if (document.kontaktformular.nachname.value == "Nachname") {
	document.kontaktformular.nachname.className = 'error'
	document.kontaktformular.nachname.value = "Nachname fehlt!"
    document.kontaktformular.nachname.focus();
    return false;
  }
  if (document.kontaktformular.email.value == "Ihre Email") {
	document.kontaktformular.email.className = 'error'
	document.kontaktformular.email.value = "Email fehlt!"
    document.kontaktformular.email.focus();
    return false;
  }
  if (document.kontaktformular.email.value.indexOf("@") == -1) {
	document.kontaktformular.email.className = 'error'
	document.kontaktformular.email.value = "Email fehlt!"
    document.kontaktformular.email.focus();
    return false;
  }
  if(document.kontaktformular.betreff.value == "Betreff") {
	document.kontaktformular.betreff.className = 'error'
	document.kontaktformular.betreff.value = "Betreff fehlt!"
    document.kontaktformular.betreff.focus();
    return false;
  }
    if(document.kontaktformular.nachricht.value == "Nachricht") {
	document.kontaktformular.nachricht.className = 'error'
	document.kontaktformular.nachricht.value = "Nachricht fehlt!"
    document.kontaktformular.nachricht.focus();
    return false;
  }
  
}
</script>

Und bei erfolgreichem Durchlauf (oder deaktiviertem JS halt sofort) geht's an die mail.php.

Diese sieht nun so aus:

PHP:
<?php

if(isset($_POST['vorname'])) // feststellen, ob das Formular abgeschickt wurde
{
	setlocale(LC_ALL, 'de_DE');
  
	error_reporting(0);

  if($_POST['vorname'] == "Vorname")
	{
		ob_start();
		echo "Keinen Vornamen eingegeben!<br>";
		echo "Senden nicht erfolgreich.<br>";
		echo "Sie werden in 5 Sekunden weitergeleitet.";
		header("Refresh: 5; http://www.illutie.de/test/kontakt.html");
		ob_end_flush();
		exit;		
	}
  else
  if($_POST['nachname'] == "Nachname")
	{	
		ob_start();
		echo "Keinen Nachnamen eingegeben!<br>";
		echo "Senden nicht erfolgreich.<br>";
		echo "Sie werden in 5 Sekunden weitergeleitet.";
		header("Refresh: 5; http://www.illutie.de/test/kontakt.html");
		ob_end_flush();
		exit;
	}
  else
  if($_POST['email'] == "Ihre Email")
	{
		ob_start();
		echo "Keine Emailaddresse eingegeben!<br>";
		echo "Senden nicht erfolgreich.<br>";
		echo "Sie werden in 5 Sekunden weitergeleitet.";
		header("Refresh: 5;  http://www.illutie.de/test/kontakt.html");
		ob_end_flush();
		exit;
	}
  else
  if($_POST['betreff'] == "Betreff")
	{
		ob_start();
		echo "Keinen Betreff eingegeben!<br>";
		echo "Senden nicht erfolgreich.<br>";
		echo "Sie werden in 5 Sekunden weitergeleitet.";
		header("Refresh: 5; http://www.illutie.de/test/kontakt.html");
		ob_end_flush();
		exit;
	}
  else
  if($_POST['nachricht'] == "Nachricht")
	{
		ob_start();
		echo "Keine Nachricht eingegeben!<br>";
		echo "Senden nicht erfolgreich.<br>";
		echo "Sie werden in 5 Sekunden weitergeleitet.";
		header("Refresh: 5; http://www.illutie.de/test/kontakt.html");
		ob_end_flush();
		exit;
	}
  else
	{
  	        $vorname = htmlentities($_POST['vorname']);
	        $nachname = htmlentities($_POST['nachname']);
	        $email = htmlentities($_POST['email']);
			$betreff = htmlentities($_POST['betreff']);
			$nachricht = htmlentities($_POST['nachricht']);
			
		    //$empfaenger = "info@illutie.com";
			
			mail($empfaenger, $betreff, $nachricht, 
			"From: $vorname $nachname <$email>"); 
			
			header("Refresh: 0; http://www.illutie.de/test/erfolg.html");  
			exit;
	}
}
	


?>

Wobei ich nun Hilfe brauche:

1.: Ein kleineres Problem, konnte es aber dennoch nicht lösen: Das Problem mit den Umlauten.
Nachrichten mit Umlauten werden nicht korrekt dargestellt in der Email.
Hab schon viele Sachen mit charset=utf-8, irgendwelchen Header-Direktiven oder einer MIME - Angabe ausprobiert... -> nichts
hat funktioniert leider...

2.: Das bei weitem größere Problem. Thema Sicherheit. Hab mich ein bisschen "umgesehen" und bei dem Thema Angriffe auf
PHP-Formulare echt Angstschweiß bekommen....
Gibt es irgendwelche EINFACHEN Mittel und Wege, Sachen/Anweisungen die ich einbauen kann um so ein php skript halbwegs
sicher zu übermitteln? (wo man nicht 20 jahre php kenntnisse haben muss um 3 seiten-lange Abfragen zu formulieren)
Hab in PHP eher Grundkenntnisse...

Hoffe ihr könnt mir helfen.

und Danke schonmal.

mfG
 
Zuletzt bearbeitet:

alxy

Erfahrenes Mitglied
Zu 1.)
Das kann mehrere Gründe haben. Konsequent auf UTF-8 setzen hilft fast immer. D.h. meta charset, Kodierung der Datei selbst, header(Acthung, auch der Webserver kann header senden. DIese werden vom Browser priorisiert), accept-charset (Bei deinem form-Tag also entsprechend hinzufügen: accept-charset="utf-8" )

Zu 2.)
Bei kleinen Seiten ist die Wahrscheinlichkeit eines Spamüberfalls relativ gering, du kannst aber eine Sicherheitsfrage wie zB "Welche Farbe haben Bananen" einbauen und serverseitig (!!) das Ergebnis prüfen ("gelb").
Dein Skript hat aber ein weiteres, viel Größeres Problem: Es ist anfällig gegen Header-Injections. Jemand kann also deinen Server benutzen um selber Spam zu versenden. (htmentitiies verhidnert nicht, dass man Linebreaks verwenden kann.)
Außerdem wird man dein Skript wohl nicht verwenden können, wenn man ein Sonerzeichen in der Mail hat, wie zB ö ä ü und viele weitere Zeichen aus anderen Sprachen. Und diese Domains gibt es wirklich! Das htmlentities zerhaut die dir komplett.
 

Alori

Grünschnabel
Danke erstmal.

zu 1) Hmm laut Notepad++ haben meine Dateien die Kodierung UTF8 ohne BOM.
Hab versucht sie in UTF8 zu konvertieren, dann hat er aber die mail.php nicht mehr korrekt
ausgeführt. (Seite blieb weiß und oben in der addressleiste stand ../mail.php)

zu 2) Wenn die Frage aber immer die gleiche ist kann man auch nen Script schreiben, dass da automatisch "gelb" einträgt... denke dann würd eher ne Rechenaufgabe sinn machen mit zufälligen zahlen.... aber da weiss ich dann nicht ob man da nicht die anzahl der möglichen versuche noch begrenzen muss.....
Sonderzeichen in der mail, zb. im emailfeld "müller@gmx.de" ? Das kommt an, halt wieder mit dem nicht dargestellten ü....