Hallo Leute!
Dieser Thread soll nicht als Diskussionsthread dienen,nein sondern dazu das Erfahrene User hier einfach mal Sachen rein schreiben die zum sicheren Programmieren in PHP und MySql aufschluss geben!
Das heist zum Beispiel Code rein stellen und eine Erklärung warum diese Sicherheitsmasnahme ergriffen wurde,somit Anfänger auch damit etwas anfangen können! Es wäre gut wenn es verschiedene Beispiele und Verfahrensweisen hier mal zu sehen gibt,denn die Sicherheit ist ja meist auch untershciedlich je nach Aufgabenlage in Betracht zu ziehen!
Darum bitte beteiligt euch mit Beiträgen die Aufschluss geben und keine Diskussion hier im Thread bieten! Eine Diskussion kann ja in einem anderen Thread gemacht werden! Vieleicht wird dieser Thread auch angepinnt als wichtig,denn was ist wichtiger als von Anfang an sicheres programmieren in Betracht zu ziehen?
Nun ich mache mal den Anfang!
Jeder kennt das, das über ein Formularfeld böse Links verschickt werden können oder auch SQL Injektions Einstz finden!
So also ein kleines Beispiel!
Wir haben zwei Variablen die in eine Tabelle geschrieben werden sollen hierzu das kleine Formular!
So ihr seht da das method="post" Attribut damit legen wir fest mit welcher Methode die Daten verschickt werden! So dieses Formular soll von einem Seitenbesucher abgeschickt werden. Das heist wir müssen unbedingt die Inhalte als GENERELL gefährlich und nicht Vertrauenswürdig ansehen und diese natürlich auch behandeln!
Als erstes müssen wir auch register_globals in Betracht ziehen die meistens zum Glück auf off stehen!
So nun zum ersten PHP Teil um die Variablen zu behandel die dann auf unsere DB losgelassen werden!
So die Angaben $_POST[''] bilden sich aus dem Formular heraus nämlich aus dem method!
Warum werden da die Escapes entfernt wenn schon welche da sind durch magic_quotes?
Ganz einfach magic_quotes ist Müll!
Warum überhaupt die Prüfung nach magic_quotes? Nunja tun wir das nicht und setzen einfach so mysql_real_escape_string ein dann wird doppelt escaped und es kann bzw. müsste sogar zu Fehlern kommen.
Gut die Prüfung ist gemacht nun der nächste Schritt!
Die Validierung der Formularfelder!
In diesem Teil machen wir das entgültige escaping auf unsere Variable und behandeln unsere Textfelder je nach Bedarf und Inhaltserwartung mit einem Regex. Ich persönlich finde diese Methode am besten,auch wenn Sie von Fall zu Fall aufwendiger ist,aber ich bin der Meinung es ist die beste und sicherste Methode Feldinhalte von vornherein festzulegen! Somit ist Sichergestellt das auch nur das ankommt was Ihr erwartet und wollt! Also ist hier der Weg für Hacklinks bzw solche per Formular zu verschicken abgebrochen und funtioniert nicht!
Bei der Validierung für das Feld name seht ihr empty stehen und bei dem für icq !empty.
Nun das habe ich deshalb gemacht weil Name ein Pflichtfeld ist und ICQ ein Wahlfeld. Bei ICQ besteht die Möglickeit das Feld unausgefüllt zu verschicken wenn da niemand was eintragen will,jedoch wenn da jemand was rein schreibt darf auch nur das drin stehen was ihr durch das regex fordert!
Die Daten können nun sauber in die Datenbank geschickt werden!
Hier der komplette Code noch mal zusammen gefasst!
Ich hoffe auf mehr Beiträge zu diesem Thema die Aufschluss geben und unser aller Horizont in Sachen Sicherheit erweitern können!
mfg der Litter!
Dieser Thread soll nicht als Diskussionsthread dienen,nein sondern dazu das Erfahrene User hier einfach mal Sachen rein schreiben die zum sicheren Programmieren in PHP und MySql aufschluss geben!
Das heist zum Beispiel Code rein stellen und eine Erklärung warum diese Sicherheitsmasnahme ergriffen wurde,somit Anfänger auch damit etwas anfangen können! Es wäre gut wenn es verschiedene Beispiele und Verfahrensweisen hier mal zu sehen gibt,denn die Sicherheit ist ja meist auch untershciedlich je nach Aufgabenlage in Betracht zu ziehen!
Darum bitte beteiligt euch mit Beiträgen die Aufschluss geben und keine Diskussion hier im Thread bieten! Eine Diskussion kann ja in einem anderen Thread gemacht werden! Vieleicht wird dieser Thread auch angepinnt als wichtig,denn was ist wichtiger als von Anfang an sicheres programmieren in Betracht zu ziehen?
Nun ich mache mal den Anfang!
Jeder kennt das, das über ein Formularfeld böse Links verschickt werden können oder auch SQL Injektions Einstz finden!
So also ein kleines Beispiel!
Wir haben zwei Variablen die in eine Tabelle geschrieben werden sollen hierzu das kleine Formular!
PHP-Code:
<form action="<?php echo htmlentities($_SERVER['SCRIPT_NAME']) ?>" method="post">
<input type="text" name="name">
<input type="text" name="icq">
<input type="submit" name="send" value="Senden">
</form>
Als erstes müssen wir auch register_globals in Betracht ziehen die meistens zum Glück auf off stehen!
So nun zum ersten PHP Teil um die Variablen zu behandel die dann auf unsere DB losgelassen werden!
PHP-Code:
//Prüfen ob magic_quotes auf on stehen
if(get_magic_quotes_gpc())
{
//wenn ja die Escapes entfernen
$name = stripslashes($_POST['name']);
$icq = stripslashes($_POST['icq']);
}
else
{
//wenn nein dann unbehandelt lassen
$name = $_POST['name'];
$icq = $_POST['icq'];
}
Warum werden da die Escapes entfernt wenn schon welche da sind durch magic_quotes?
Ganz einfach magic_quotes ist Müll!
Warum überhaupt die Prüfung nach magic_quotes? Nunja tun wir das nicht und setzen einfach so mysql_real_escape_string ein dann wird doppelt escaped und es kann bzw. müsste sogar zu Fehlern kommen.
Gut die Prüfung ist gemacht nun der nächste Schritt!
Die Validierung der Formularfelder!
PHP-Code:
if(isset($_POST['send']))
{
//Variable wieder escapen bzw. überhaupt escapen
$name = mysql_real_escape_string($_POST['name']);
//Feldvalidierung und Feldinhalt Sicherung mit Regex
if(empty($_POST['name'] && !preg_match("#^([0-9a-zäöü _-]+)$#i",$name)))
{
echo "falscher Inhalt! in Namensfeld";
}
$icq = mysql_real_escape_string($_POST['icq']);
if(!empty($icq) && !preg_match("#[0-9]#",$icq))
{
echo "Keine gültige ICQ Nummer";
}
}
Bei der Validierung für das Feld name seht ihr empty stehen und bei dem für icq !empty.
Nun das habe ich deshalb gemacht weil Name ein Pflichtfeld ist und ICQ ein Wahlfeld. Bei ICQ besteht die Möglickeit das Feld unausgefüllt zu verschicken wenn da niemand was eintragen will,jedoch wenn da jemand was rein schreibt darf auch nur das drin stehen was ihr durch das regex fordert!
Die Daten können nun sauber in die Datenbank geschickt werden!
Hier der komplette Code noch mal zusammen gefasst!
PHP-Code:
if(isset($_POST['send']))
{
if(get_magic_quotes_gpc())
{
//wenn ja die Escapes entfernen
$name = stripslashes($_POST['name']);
$icq = stripslashes($_POST['icq']);
}
else
{
//wenn nein dann unbehandelt lassen
$name = $_POST['name'];
$icq = $_POST['icq'];
}
//Variable wieder escapen bzw. überhaupt escapen
$name = mysql_real_escape_string($_POST['name']);
//Feldvalidierung und Feldinhalt Sicherung mit Regex
if(empty($_POST['name'] && !preg_match("#^([0-9a-zäöü _-]+)$#i",$name)))
{
echo "falscher Inhalt! in Namensfeld";
}
$icq = mysql_real_escape_string($_POST['icq']);
if(!empty($icq) && !preg_match("#[0-9]#",$icq))
{
echo "Keine gültige ICQ Nummer";
}
}
mfg der Litter!
Kommentar