Antworten auf deine Fragen:
Neues Thema erstellen

PHP-Kontaktformular, Sicherheit und Fragen

schwarzweisz

Noch nicht viel geschrieben

Hallo Gemeinde,

ich habe mir ein Kontaktformular geschrieben und bisher auf einem lokalen System getestet. Soweit gibt es keine Probleme damit. Zumindest keine die ich - vielleicht auch auf Grund mangelnder Erfahrung und Kenntnis - erkennen kann.

Aus diesem Grund, würde ich um prüfende Blicke bitten. Wenn ihr so nett wärt und einmal kritisch darüber schauen und Mängel ansprechen könntet, wäre ich euch sehr verbunden. Vielleicht habt ihr noch weitere Tipps zum Thema Sicherheit.

Ich hoffe, dass ich die Variablen mit Hilfe eines Arrays zusammenführen kann ohne die gleiche Eingaben für jede Variable einzeln zu wiederholen.

Des Weiteren stelle ich mir die Frage, ob, wenn ich die Eingaben des Benutzers noch einmal für diesen übersichtlich zusammenstellen will, ich diese mittels mySQL in einer Datenbank speichern muss, um diese dann anschließend ausgeben zu können. Oder gibt es hierfür noch eine andere Lösung?

Liegt es auch wegen mangelnder Speicherung daran, dass ich die vom Benutzer eingegebene Nachricht nicht wie den Namen, die E-Mail und den Betreff ('value="'.$name.'"') im Formular ausgeben kann?

Bitte hängt euch nicht an den ganzen "div"- und "class"-Tags auf, die ich jetzt der Faulheit halber drin gelassen habe.

Allem voran der HTML-Code:

HTML:
<!DOCTYPE html>
<head>
</head>
<body>
<form action="test_kontakt.php" method="POST">		
		<label for="name">name</label>
		<input type="text" id="name" name="abs_name" placeholder="Your name."><br>
		<label for="email">email address</label>
		<input class="eingabefeld" type="text" id="email" name="abs_email" placeholder="Your email adress."><br>
		<label for="betreff">regarding</label>
		<input class="eingabefeld" type="text" id="betreff" name="abs_betreff" placeholder="What's your question about?"><br>
		<textarea class="nachrichtenfeld" name="abs_nachricht" placeholder="How may I help you?"></textarea><br>
		<input class="button" type="submit" name="submit" value="send">
</form>
</body>
</html>

Hier der PHP-Code, welchem ich das Formular noch einmal nachgestellt habe, falls jemand absichtlich oder versehentlich vergisst eine Eingabe zu tätigen:

PHP:
<!DOCTYPE html>
<body>
<?php
error_reporting (E_ALL);
$name=$_POST['abs_name'];
$email=$_POST['abs_email'];
$betreff=$_POST['abs_betreff'];
$nachricht=$_POST['abs_nachricht'];
$an='email@provider.de';
$von='$name';
$von .='$email';
$abs_eingaben= array($name, $email, $betreff, $nachricht);
$send_mail=mail($an, $betreff | 'Kontaktformular', $von);

function secure($abs_eingaben) {
	$abs_eingaben=trim($abs_eingaben); 						//entfernt Leerzeichen am Anfang und Ende
	$abs_eingaben=stripslashes($abs_eingaben);				//entfernt Schräger
	$abs_eingaben=strip_tags($abs_eingaben);				//entfernt < und >
	$abs_eingaben=htmlentities($abs_eingaben, ENT_QUOTES);	//entfernt Sonderzeichen
	return($abs_eingaben);
	}
 
if (isset ($_POST['submit'])) {
	if (empty($name)) {
		echo	'<div class="fehler_name"><p>How may I call you?</p><p>Please fill in a name.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
	if (empty($email)) {
		echo	'<div class="fehler_email"><p>How may I reply?</p><p>Please fill in an email adress.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
	if (empty($nachricht)) {
		echo	'<div class="fehler_nachricht"><p>How may I help you?</p><p>Please fill in your question.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
		}

if	(isset ($_POST['submit']) &&
	!empty($name) &&
	!empty($email) &&
	!empty($nachricht)) {
		$send_mail;
			if	($send_mail) {
				echo	'<div class="gesendet"><p>Thank you.</p><p>Your message has been sent.</p></div>'; 
			}
			else {
				echo 	'<div class="gesendet"><p>Sorry, your message could not be delivered. Please try again later.</p></div>';}
	}
?>
<form action="" method="POST">
<h1>Got any question?</h1><br>
		<label for="name">name</label>
		<input class="eingabefeld" type="text" id="name" name="abs_name" <?php echo 'value="'.$name.'"'; ?> placeholder="Your name."><br>
		<label for="email">email address</label>
		<input class="eingabefeld" type="text" id="email" name="abs_email" <?php echo 'value="'.$email.'"'; ?> placeholder="Your email adress."><br>
		<label for="betreff">regarding</label>
		<input class="eingabefeld" type="text" id="betreff" name="abs_betreff" <?php echo 'value="'.$betreff.'"'; ?> placeholder="What's your question about?"><br>
		<textarea class="nachrichtenfeld" name="abs_nachricht" <?php echo 'value="'.$nachricht.'"'; ?> placeholder="How may I help you?"></textarea><br>
</form>
</body>
</html>

Schon einmal im Vorab vielen Dank für Hilfestellung, Tipps & Kritik.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

Naja, du benutzt schonmal nicht deine secure()-Funktion und übernimmst ungeprüft Nutzervariablen. Das widerspricht direkt dem "Never trust user input"-Prinzip.

Abgesehen von dadurch entstehenden Angriffsvektoren validierst du die Variablen auch nicht ("ist $email eine korrekt formatierte E-Mail-Adresse?" usw.). Du überprüfst nichtmal, ob die Variablen überhaupt existieren.

Diese Zeile
PHP:
$send_mail;
bedeutet garnichts. Ich vermute, du willst dort mail() aufrufen, aber in $send_mail steht lediglich der Rückgabewert des Funktionsaufrufes.

Kurz: du machst so ziemlich jeden Anfängerfehler. Das ist okay, solange du das Script nicht im Produktivumfeld einsetzt und es nur zum Üben benutzt. Andernfalls solltest du dir dringend die Grundlagen bzgl. Sicherheit von PHP-Scripten bzw. Fehlerabfragen anschauen.

Edit:
Des Weiteren stelle ich mir die Frage, ob, wenn ich die Eingaben des Benutzers noch einmal für diesen übersichtlich zusammenstellen will, ich diese mittels mySQL in einer Datenbank speichern muss
Der Nutzer gibt Daten ein, du verarbeitest sie. An diesem Punkt musst du selbst entscheiden, wie du diese Daten behandeln willst, wie und ob du sie speichern willst usw. Wenn du letzteres tun willst, brauchst du irgendeinen Zwischenspeicher. Dafür musst du keine Datenbank einsetzen, eine Textdatei reicht genau so. Oder Cookies. Oder du führst die Daten im Programm (Session-Variablen). Oder du druckst sie aus und lässt sie bei Bedarf von einem Praktikanten eintippen.


Duddle
 
Zuletzt bearbeitet:

schwarzweisz

Noch nicht viel geschrieben

Hallo Duddle. Vielen Dank für deine Hinweise. Wie du gemerkt hast, stehe ich noch am Anfang des Lernprozesses. An der Umsetzung deiner Anmerkungen bin ich dran.

Allerdings stellt sich mir die Frage, ob ich die Funktion "secure" in vollem Umfang brauche, wenn ich die Eingaben des Benutzers mittels regulärer Ausdrücke überprüfe. Wenn ich in der entsprechenden "Validierung" z.B. des Namens nur Buchstaben und Bindestriche sowie whitespaces zulasse, brauch ich theoretisch htmlentities() nicht mehr zu benutzen, oder?

Ich würde dich auch bitten mir zu erklären, was genau du mit folgendem Zitat meinst:

Diese Zeile
PHP:
$send_mail;
bedeutet garnichts. Ich vermute, du willst dort mail() aufrufen, aber in $send_mail steht lediglich der Rückgabewert des Funktionsaufrufes.
Duddle

Die Variable $send_mail soll mir die Abfrage, ob die Mail gesendet wurde vereinfachen. Und bisher bin ich davon ausgegangen, dass Mails mit mail() gesendet werden.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

In folgendem Kontext
PHP:
//...
!empty($nachricht)) {
    $send_mail;
    if    ($send_mail) { 
//...
hat die Zeile "$send_mail;" keine Bedeutung. Ich weiss nicht, was du dort machen willst, aber falls du an dieser Stelle die vorige Zeile
PHP:
$send_mail=mail($an, $betreff | 'Kontaktformular', $von);
irgendwie neu aufrufen willst, ist das der falsche Weg.

Allerdings stellt sich mir die Frage, ob ich die Funktion "secure" in vollem Umfang brauche, wenn ich die Eingaben des Benutzers mittels regulärer Ausdrücke überprüfe.
Ich habe nicht die Funktion selbst bemängelt, sondern dass du sie nicht benutzt und daher die Nutzereingaben komplett ungeprüft übernimmst.
Wenn ich in der entsprechenden "Validierung" z.B. des Namens nur Buchstaben und Bindestriche sowie whitespaces zulasse, brauch ich theoretisch htmlentities() nicht mehr zu benutzen, oder?
In dem Fall, ja.
Allgemein gesagt solltest du bei sicherheitskritischen Funktionen nie das Rad neu erfinden. PHP hat seit 5.2 eine sehr gute Funktion in filter_var() für die üblichen Anwendungsfälle.

Duddle
 

schwarzweisz

Noch nicht viel geschrieben

AW: PHP-Kontaktformular, Sicherheit und Fragen

In folgendem Kontext
PHP:
Ich habe nicht die Funktion selbst bemängelt, sondern dass du sie nicht benutzt und daher die Nutzereingaben komplett ungeprüft übernimmst.
[/QUOTE]

Keine Sorge, das hatte ich auch so verstanden.

Ich habe jetzt noch einmal ein wenig rumprobiert und würde gern den veränderten Code posten. 

[PHP]<?php
error_reporting (E_ALL);
$name=$_POST['abs_name'];
$email=$_POST['abs_email'];
$betreff=$_POST['abs_betreff'];
$nachricht=$_POST['abs_nachricht'];
$an='email@provider.de';
$von='$name';
$von .='$email';
$abs_eingaben= array($name, $email, $betreff, $nachricht);
$send_mail=mail($an, $betreff | 'Kontaktformular', $nachricht, $von);

function leerzeichen($abs_eingaben) {
	$abs_eingaben=trim($abs_eingaben); 						//entfernt Leerzeichen
	return($abs_eingaben);
}
function check_name($name) {
	$pattern='/^[a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF\-\s]{2,75}$/s';
		if (preg_match($pattern, $name)) {
			return true;}
		else {
			return false;}
}
function check_mail($email) {
	if (strlen($email) > 75) {
		return false;}
	else {
	$pattern='/^[a-z0-9]+[_\-.a-z0-9]+@[a-z0-9]+[_\-.a-z0-9]+\.[a-z]{2,6}$/is';
			if (preg_match($pattern, $email)) {
				return true;}
			else {
				return false;}
	}
}
function check_nachricht($nachricht) {
	$pattern='/^[a-zA-Z0-9\xC4\xE4\xD6\xF6\xDC\xFC\x24\x80\xA3\xA5\%\&\'\+\-\_\,\.\:\!\?\@\(\)\/\s]*$/s'; //Ää Öö Üü $ € £ ¥
		if (preg_match($pattern, $nachricht)) {
			return true;}
			else {
				return false;}
}
function check_betreff($betreff) {
	$pattern='/^[a-zA-Z\xC4\xE4\xD6\xF6\xDC\xFC\-\,\.\!\?\/\s]{0,75}$/s';
		if (preg_match($pattern, $betreff)) {
			return true;}
			else {
				return false;}
}

if	(isset ($_POST['submit']) && ($_POST['abs_name']) && ($_POST['abs_email']) && ($_POST['abs_nachricht'])) {
	if	(!empty($name) &&
		!empty($email) &&
		!empty($nachricht)) {
			//Leerzeichen entfernen
			foreach ($abs_eingaben as $key=>$value) 
				$abs_eingaben[$key]=leerzeichen($value); {
				echo $key=$value;}
			//Überprüfung des Namens
			if (check_name($name) == false) {
				echo 'Sorry, some characters you used are not allowed. Allowed characters are "-".</p>';}
			else {
				echo 'Name ok';}
			//Überprüfung der E-Mail-Adresse
			if (check_mail($email) == false) {
				echo 'Sorry, your entered e-mail-adress is not valid. Please fill in a valid adress.';}
			else {
				echo 'Mail ok';}
			//Überprüfung der Nachricht
			if (check_nachricht($nachricht) == false) {
				echo 'Sorry, some characters you used are not allowed. Allowed characters are "$ € £ ¥ % & \' + - _ , . : ! ? @ ( ) /"';}
			else {
				echo 'Nachricht ok';}
			//Falls Betreff gesetzt, Überprüfung
			if (isset ($_POST['abs_betreff'])) {
				if (check_betreff($betreff) == false) {
					echo 'Falscher Betreff';}
				else {
					echo 'Betreff ok';}
			}	
		}
		mail($an, $betreff | 'Kontaktformular', $nachricht, $von);
			if	($send_mail) {
				echo	'Thank you. Your message has been send.';}
			else {
				echo 	'Sorry, your message could not be delivered. Please try again later.';}
	}
else {
if (empty($name)) {
		echo	'<div class="fehler_name"><p>How may I call you?</p><p>Please fill in a name.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
	if (empty($email)) {
		echo	'<div class="fehler_email"><p>How may I reply?</p><p>Please fill in an email adress.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
	if (empty($nachricht)) {
		echo	'<div class="fehler_nachricht"><p>How may I help you?</p><p>Please fill in your question.</p></div>';
		echo	'<input class="button" type="submit" name="submit" value="again">';}
}
?>

Die secure()-Funktion wird jetzt genutzt. Auch validiere ich die E-Mail und den Namen und habe für Betreff und Nachricht begrenzte Zeichen erlaubt.

Eine Überprüfung, ob Variablen gesetzt sind, ist enthalten. Allerdings bereitet mir es ein wenig Bauchschmerzen, dass ich bei dem else {} keine Überprüfung fahren kann, da sonst die Fehlermeldungen nicht kommen, sobald etwas nicht gesetzt wurde.

Vielleicht habe ich da einen Denkfehler drin, aber

PHP:
//vorheriger Code
else {
if (isset ($_POST ...) && .... {
if (empty($name)) {
echo 'Name fehlt';}
if (empty($email)...
}
}

gibt irgendwie keine Fehlermeldungen aus, auch wenn die entsprechenden Felder nicht gefüllt sind. Ist es bei dem else überhaupt noch wichtig nachzufragen, ob die Variable gesetzt wurde?
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

So wie der Code jetzt ist, ist er immer noch vollkommen ungeschützt. Du schickst die Mail schon vor jeglicher Prüfung ab (Zeile 10), der Rest ist dann egal.
Allerdings bereitet mir es ein wenig Bauchschmerzen, dass ich bei dem else {} keine Überprüfung fahren kann,
Welches "else"? Du hast da ein dutzend drin.

Du musst auch nicht alle POST- und deine eigenen Variablen doppelt prüfen. Wenn die POST-Variable vom Namen leer ist, ist auch die Variable leer welcher du diese POST-Variable zugewiesen hast.

Allgemein sollte dein Ansatz meiner Meinung nach anders aussehen: statt - potentiell mehrfach - zu prüfen ob eine Variable leer ist, solltest du das anfangs machen und dabei Variablen führen, also bspw.
PHP:
$error_mail = check_mail($_POST['mail']);
//...
if($error_mail) {
  // "Mail falsch!"
}
//...
if($error_mail || $error_name || $error_foobar) {
   //loggen oder ignorieren etc.
} else {
   //mail verschicken
}
Dazu gibt es natürlich auch 20 Alternativen: Bitmasken, falls du nicht ewig viele "$error_"-Variablen willst, oder ein einfacher Zähler, falls du es nicht so feingranular brauchst, etc.


Duddle
 

schwarzweisz

Noch nicht viel geschrieben

AW: PHP-Kontaktformular, Sicherheit und Fragen

So wie der Code jetzt ist, ist er immer noch vollkommen ungeschützt. Du schickst die Mail schon vor jeglicher Prüfung ab (Zeile 10), der Rest ist dann egal.

Jetzt komme ich nicht mehr hinterher. Du sagtest doch, dass $send_mail nur der Rückgabewert von mail() sei. Warum schicke ich denn jetzt mit der gleichen Variablen auf einmal die Mail schon ab?

Du musst auch nicht alle POST- und deine eigenen Variablen doppelt prüfen. Wenn die POST-Variable vom Namen leer ist, ist auch die Variable leer welcher du diese POST-Variable zugewiesen hast.

Also es würde reichen zu schreiben:

PHP:
if (isset ($_POST['abs_mail']) && $_POST['abs_name']))

Das heißt die weitere Prüfung

PHP:
if (!empty ($email) && (!empty ($name))

ist schon viel des guten?

Da mittels des letzten else konkrete Fehlermeldungen für den Benutzer ausgegeben werden sollen, überprüfte ich dort nochmals, falls du dies meintest.

Danke für deinen alternativen Ansatz, das werde ich mir einmal anschauen.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

Du sagtest doch, dass $send_mail nur der Rückgabewert von mail() sei. Warum schicke ich denn jetzt mit der gleichen Variablen auf einmal die Mail schon ab?
Die Mail wird durch mail() abgeschickt (bzw. versucht), der Rückgabewert der Funktion wird in $send_mail gespeichert.
Das ist das gleiche wie wenn du beim Pizzaboten anrufst und bestellst: er startet den internen Prozess des Pizza-Bestellens und gibt dir am Ende Bescheid / zurück, ob alles okay war. Auch wenn es fehl schlägt, wurde der interne Prozess dennoch gestartet.

die weitere Prüfung ist schon viel des guten?
Du solltest prüfen, ob eine Variable gesetzt und nicht-leer ist / die Anforderungen erfüllt. Wenn du aber sowieso z.B. $email auf bestimmte Zeichen prüfst, könntest du darin auch gleich prüfen ob sie leer ist. Eine leere Mail-Adresse ist auch nicht valide. Ich hatte mich da etwas inkorrekt ausgedrückt.

Dabei fällt mir jetzt im Code auch noch mehr auf:
PHP:
if    (isset ($_POST['submit']) && ($_POST['abs_name']) && ($_POST['abs_email']) && ($_POST['abs_nachricht'])) {
Warum hast du dort nur ein Mal isset()?

Auch hast du einen Logik-Fehler in der Fehlerabfrage: du prüfst in Zeile 50 mit !empty($name) usw., springst dann in den Block mit den check-Funktionen, hast aber nach diesem Block ein mail(). Erstens ist das ein doppeltes mail(), zweitens wird dann die Mail unabhängig von dem !empty($name) usw. geschickt.

Ich empfehle dir, das ganze drastisch zu entschlacken. Du brauchst die ganzen check-Funktionen nicht wirklich. Abgesehen davon dass die Regex-Muster sowieso nicht ausreichen, gibt es wie erwähnt eine fertige und durchdachte Funktionssammlung in Filter. Auch könntest du in folgendem Abschnitt die Doppelungen vermeiden:
PHP:
if (empty($name)) {
    echo    '<div class="fehler_name"><p>How may I call you?</p><p>Please fill in a name.</p></div>';
    echo    '<input class="button" type="submit" name="submit" value="again">';}
if (empty($email)) {
    echo    '<div class="fehler_email"><p>How may I reply?</p><p>Please fill in an email adress.</p></div>';
    echo    '<input class="button" type="submit" name="submit" value="again">';}
if (empty($nachricht)) {
    echo    '<div class="fehler_nachricht"><p>How may I help you?</p><p>Please fill in your question.</p></div>';
    echo    '<input class="button" type="submit" name="submit" value="again">';}
Beispiel:
PHP:
$errormsg = "";
if(empty($name)) $errormsg .= "<p>Please fill in a name.</p>";
if(empty($email)) $errormsg .= "<p>Please fill in an email address.</p>"; //übrigens: "address"
if(empty($nachricht)) $errormsg .= "<p>Please fill in your question.</p>";

if($errormsg != "") {
	echo    '<div class="fehler">'.$errormsg.'</div>';
	echo    '<input class="button" type="submit" name="submit" value="again">';
}
Du brauchst sicher keine zusätzliche Klasse pro Fehler. Wenn du die "how may I"-Fragen brauchst, wirf sie in $errormsg.


Duddle
 
Zuletzt bearbeitet:

schwarzweisz

Noch nicht viel geschrieben

AW: PHP-Kontaktformular, Sicherheit und Fragen

Hallo Duddle,

entschuldige bitte, dass ich mich jetzt erst wieder melde, hatte viel um die Ohren die letzten Wochen. Über die filter_var()-Funktion habe ich gelesen, dass sie wohl Probleme mit Umlauten macht, deswegen habe ich sie von vornherein außer Acht gelassen.

Ich habe den gesamten Code noch einmal umgestellt und hoffe, dass ich der Auflösung des Problems näher gekommen bin.

PHP:
<?php
error_reporting (E_ALL);
//Wurde Anfrage gesendet?
if (isset ($_POST['submit'])) {
//Einlesen der Daten
    $name=$_POST['abs_name'];
    $email=$_POST['abs_email'];
    $betreff=$_POST['abs_betreff'];
    $nachricht=$_POST['abs_nachricht'];
    $an='mail@provider.de';
    $von='$name';
    $von .='$email';
    $abs_eingaben= array($name, $email, $betreff, $nachricht);}
//Entfernen von Zeilenumbrüchen und cc:,  bcc:, etc.
    $name=preg_replace ('/(content-type:|bcc:|cc:|to:|from:|\\\r|\\\r\\\n|\\\n)/im','',$name);
    $email=preg_replace ('/(content-type:|bcc:|cc:|to:|from:|\\\r|\\\r\\\n|\\\n)/im','',$email);
    $betreff=preg_replace ('/(content-type:|bcc:|cc:|to:|from:|\\\r|\\\r\\\n|\\\n)/im','',$betreff);
    $nachricht=preg_replace ('/(\\\r|\\\r\\\n|\\\n)/', '<br>', $nachricht);
//Löschen von Leerzeichen und -zeilen sowie < und >
    function entfernen($abs_eingaben) {
    $abs_eingaben=trim($abs_eingaben);                         //entfernt Leerzeichen am Anfang und Ende
    $abs_eingaben=strip_tags($abs_eingaben);                //entfernt < und >
    return($abs_eingaben);
    }
        foreach ($abs_eingaben as $key => $value)
            $abs_eingaben[$key]=entfernen($value);
//Funktionen zur Validierung
    function check_name($name) {
    $pattern='/^[a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\xFF\-\s]{2,75}$/s';
        if (preg_match ($pattern, $name)) {
            return true;}
        else {
            return false;}
        }
    function check_email($email) {
    $pattern='/^[a-z0-9]+[_\-\.a-z0-9]+@[a-z0-9]+[_\-\.a-z0-9]+\.[a-z]{2,6}$/is';
        if (preg_match ($pattern, $email)) {
            return true;}
        else {
            return false;}
        }
    function check_nachricht($nachricht) {
    $pattern='/^[a-zA-Z0-9\xC4\xE4\xD6\xF6\xDC\xFC\x24\x80\xA3\xA5\%\&\'\+\-\_\,\.\:\!\?\@\(\)\/\s]{10,1000}$/';
        if (preg_match ($pattern, $nachricht)) {
            return true;}
        else {
            return false;}
        }
// Abfrage ob alles gesetzt und ausggefüllt wurde
    if    (isset($_POST['abs_name']) && isset($_POST['abs_email']) && isset($_POST['abs_nachricht']) &&
        !empty($name) && !empty($email) && !empty($nachricht)) { 
//Validierung
            check_name($name);
            check_email($email);
            check_nachricht($nachricht);}
                if (check_name($name) && check_email($email) && check_nachricht($nachricht) ==true) {
//E-Mail senden
                    mail($an, $betreff | 'Kontaktformular', $nachricht, $von);
                        echo 'Your message has been sent. ';}
    else {
        $errormsg='';
        if (!isset($_POST['abs_name']) || empty($name) || check_name($name) == false) {
            $errormsg .='Please fill in your name.';}
        if (!isset($_POST['abs_email']) || empty($email) || check_email($email) == false) {
            $errormsg .='Please fill in your (valid) email-address.';}
        if (!isset($_POST['abs_nachricht']) || empty($nachricht)) {
            $errormsg .='Please fill in your message.';}
        if (check_nachricht($nachricht) == false) {
            if (strlen($nachricht)<10) {
                $errormsg .='Message must be at least 10 characters.';}
            else {
                $errormsg .='None allowed characters used.';}
    if ($errormsg !='') {
        echo $errormsg;}
        }
    }
?>
Über die einzelnen Validierungsfunktionen kann man sprechen, wenn das Groh des Scriptes in Punkto Sicherheit steht.

Ich danke für deine investierte Zeit und Mühe.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

Über die filter_var()-Funktion habe ich gelesen, dass sie wohl Probleme mit Umlauten macht, deswegen habe ich sie von vornherein außer Acht gelassen.
Dein Muster in check_email() beachtet sie derzeit auch nicht.

Folgende Zeilen haben keine Funktion:
PHP:
//Validierung
            check_name($name);
            check_email($email);
            check_nachricht($nachricht);}
In
PHP:
if (check_name($name) && check_email($email) && check_nachricht($nachricht) ==true) {
muss das "==true" nicht sein, da du die boolschen Rückgabewerte mit UND verknüpfst. Ist eines davon false, wird der gesamte Ausdruck false.
Bei sowas wie
PHP:
// Abfrage ob alles gesetzt und ausggefüllt wurde
    if    (isset($_POST['abs_name']) && isset($_POST['abs_email']) && isset($_POST['abs_nachricht']) &&
        !empty($name) && !empty($email) && !empty($nachricht)) {
könntest du eine Hilfsfunktion einführen, damit du am Ende sowas schreiben kannst wie
PHP:
 if(isDefined($name) && isDefined($email) ...
Ich sehe keinen Mehrwert darin, an diesem Punkt noch zwischen "$_POST['abs_name']" und "$name" zu unterscheiden.
Weiterhin würde ich wohl die Fehlerabfragen defensiver strukturieren. Das heisst, erst auf Fehler prüfen und entsprechend handeln, danach ist es per Definition fehlerfrei. Grob gesagt, statt
PHP:
if(isDefined($foo) && isDefined($bar)) {
  mail();
} else {
  $error = "";
  if(!isDefined($foo)) $error .= $foo;
  if(!isDefined($bar)) $error .= $bar;
}
lieber sowas
PHP:
$error = "";
if(!isDefined($foo)) $error .= $foo;
if(!isDefined($bar)) $error .= $bar;

if($error == "") {
  mail();
}
Das Ergebnis ist das selbe, der Code aber sauberer und einfacher zu erweitern.
Eines noch:
PHP:
foreach ($abs_eingaben as $key => $value)
            $abs_eingaben[$key]=entfernen($value);
Schau dir array_map() an.


Duddle
 

schwarzweisz

Noch nicht viel geschrieben

AW: PHP-Kontaktformular, Sicherheit und Fragen

Ich hoffe ich habe das mit der Hilfsfunktion richtig verstanden und entsprechend umsetzen können.

Diese soll prüfen, ob eine Variable gesetzt und nicht leer ist, oder?

PHP:
function isDefine($name) {
 if (isset($name) && !empty($name)) {
  return true;}
 else {
  return false;}
}

Falls dem so wäre, kann ich mit der Funktion nicht gleich validieren?

PHP:
function isDefine($name) {
 if (isset($name) && !empty($name)) {
  check_name($name);
   if (check_name($name) ==true) {
    return true;}
}
 else {
  return false;}
}

Und von hier aus so weiter machen?

PHP:
$error='';
if (isDefine($name) ==false) {
 $error .='Please fill in your name.';}
if ($error='') {
 mail();
}
 

Robbyn-

PHP / Flex Programmierer

AW: PHP-Kontaktformular, Sicherheit und Fragen

Das wäre der bessere Weg:

PHP:
function isDefine($name) 
{
 if(isset($name) === true && empty($name) === false) 
 {
   return check_name($name);
 }
 else
 {
  return false;
 }
}


Warum du, in deinem Code, check_name() zweimal aufrufst ergibt für mich kein Sinn. Vorallem ohne Überprüfung oder dergleichen
 

Robbyn-

PHP / Flex Programmierer

AW: PHP-Kontaktformular, Sicherheit und Fragen

Du hast ihn in diesem Code:

PHP:
function isDefine($name) {
 if (isset($name) && !empty($name)) {
  check_name($name);
   if (check_name($name) ==true) {
    return true;}
}
 else {
  return false;}
}

Zweimal drin stehen:

PHP:
check_name($name);
   if (check_name($name) ==true) {
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

Falls dem so wäre, kann ich mit der Funktion nicht gleich validieren?
In diesem Fall würde ich davon abraten. Eine Funktion soll Wiederholungen vermeiden und wiederverwendbar sein. Je universeller sie ist, umso besser.
Hier ist isDefined() als ein "okay, ich kann diese Variable benutzen" zu verstehen, nicht "ich kann die Variable $foobar benutzen und $foobar entspricht den Regeln, die für $foobar gelten".

Selbst wenn derzeit die Validierung für alle Variablen gleich wäre, sollte das separat passieren. Würde sich beispielsweise die Validierung für $baz in Zukunft ändern, müsstest du jedes Vorkommen von $baz suchen und ein isDefinedBaz() o.ä. definieren, was offensichtlich nicht besonders klug ist.

Ja, diese Variante entspricht dem, was ich meinte:
PHP:
 function isDefined($name) {
 if (isset($name) && !empty($name)) {
  return true;}
 else {
  return false;}
}
Wenn du jetzt noch die boolschen Operatoren ausnutzt, kannst du das gleiche direkter formulieren:
PHP:
 function isDefined($name) {
 return isset($name) && !empty($name);
}


Duddle
 

schwarzweisz

Noch nicht viel geschrieben

Ah. Danke.
Ich bin davon ausgegangen, dass ich sie einmal aufrufe und beim zweiten mal prüfen, ob true.

Du hast sie mit return check_name() aufgerufen. Wie kann ich dann fortfahren wenn "if (check_name() ==true) die Funktion nochmal aufruft?

Ich glaube so langsam, dass ich mir das Verständnis dafür nicht aneignen kann.

edit:
Dank auch dir Duddle.

Zum Verständnis:
Wenn ich dies so benutze

PHP:
function isDefined($name) {
 return isset($name) && !empty($name);
}

mir also das return true; / return false; spare frage ich dann so weiter

PHP:
$error='';
if (!isDefined($name)) {
    $error .='Please fill in your name.';}
else {
    mail();}

da das "!" die Aussage negativiert (weiß jetzt nicht wie ich das besser ausdrücken kann)?
 
Zuletzt bearbeitet:

Robbyn-

PHP / Flex Programmierer

AW: PHP-Kontaktformular, Sicherheit und Fragen

Garnicht, du musst eine Funktion nicht zweimal aufrufen, wozu auch???

Du rufst die Funktion nur dann auf wenn du sie auch nutzen möchtest. Warum sie vorher einmal aufrufen? Was soll das für einen Sinn ergeben?

Deine Funktion gibt als Rückgabewert einen booleschen Wert zurück (true oder false). Weshalb deine if Abfrage sinnlos ist, es gibt nur 2 Rückgabe Varianten entweder true oder false, weshalb ich das gleich mittels return check_name() gelöst habe.

Ich glaube das Verständnis dafür zu haben ist nicht schwer, du machst es dir nur sehr schwer :D
 

schwarzweisz

Noch nicht viel geschrieben

AW: PHP-Kontaktformular, Sicherheit und Fragen

Okay, soweit verstanden.

Ich hatte die if-Abfrage drin, da es ja irgendwie weitergehen soll. Deswegen dachte ich, dass ich das Ergebnis abfragen muss und dann ausgehend von der Rückgabe fortfahren kann. Frei nach dem Motto, wenn wahr dann mach dies, wenn falsch beende.
 

Robbyn-

PHP / Flex Programmierer

AW: PHP-Kontaktformular, Sicherheit und Fragen

Jop das ist auch richtig so, wie du es gedacht hast. Aber eine Funktion einfach so zu beenden sollte man nicht.

Man sollte von einer Funktion immer was zurück bekommen und wenn es nur ein false oder true ist.

Funktionen sollte man so neutral wie möglich halten, wer weiß was du mit dieser in naher Zukunft noch anstellen möchtest.
Denn wenn eine Funktion immer etwas zurück gibt kannst du damit etwas auf der Gegenstelle, wo du die Funktion aufgerufen hast, etwas anfangen und fortfahren.

Also kurz zusammen gefasst. Eine Funktionen immer einen Rückgabewert geben. Niemals in der Funktion selber beenden. Das kannst du dann dort machen wo du diese Funktion aufgerufen hast.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP-Kontaktformular, Sicherheit und Fragen

PHP:
$error='';
if (!isDefined($name)) {
    $error .='Please fill in your name.';}
else {
    mail();}
Zum Beispiel, ja. Vergiss nur nicht, dass isDefined() so wie du es machst nur prüft ob die Variable gesetzt / deklariert und nicht leer ist.
Robbyn- schrieb:
Eine Funktionen immer einen Rückgabewert geben
Naja, darüber könnte man auch streiten :)


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

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben