Vor dem Einfügen: Validierung
Weil es gefragt wurde, kurz ein paar Worte zur Validierung. Es ist immer gut zu wissen, was man sich so alles in die Datenbank schreibt. Bestenfalls habt ihr z.B. Tausende von Anmeldungen und ein paar Spinner sind immer darunter, die versuchen euch und eurer DB zu schaden. In einem ersten Schritt sollte man die Daten, die aus einem Formular kommen validieren, auch wenn es sich um so scheinbar harmlose Dinge wie Email Adressen und User Namen handelt.
Drei Fälle sind eigentlich gängig:
a) Überprüfen, welche Länge ein String hat
PHP-Code:
<?php
// set max. length
$maxlength = 50;
// get form data
$user_name = $_POST['user_name'];
// check length
if (strlen($user_name) > $maxlength) {
// redirect to error page
header ("Location: error.php");
}
?>
b) Überprüfen, ob es sich dabei ausschliesslich um Zahlen und Buchstaben handelt
Diese Überprüfung kann mit 'normalem' PHP ziemlich lang werden, deshalb bedient man sich hier gerne einer 'Regular Expression' (regexp).
PHP-Code:
<?php
// function: only letters and numbers allowed
function onlyLettersNumbers($string) {
$eregi = eregi_replace("([A-Z0-9]+)","",$string);
if (empty($eregi)) {
return true;
}
return false;
// get form data
$user_name = $_POST['user_name'];
// check letters and numbers
if (onlyLettersNumbers($user_name) == false) {
// redirect to error page
header ("Location: error.php");
}
?>
c) Überprüfen, ob eine Email Adresse gültig ist
Ob eine Email Adresse wirklich gültig ist, also ob sie wirklich existiert, kann man so natürlich nicht überprüfen. Allerdings kann man kontrollieren, ob die eingegebene Email Adresse zumindest so aussieht, d.h. alle Elemente einer Email Adresse hat. Die folgende Funktion muss man nicht komplett verstehen, was sie tut ist aber relativ simpel: sie überprüft, ob ein@ Zeichen vorhanden ist, ob sich vor dem @ Zeichen zugelassene Zeichen befinden, ob sich danach zugelassene Zeichen befinden, ob danach ein Punkt folgt und danach wiederum mind. 2 zugelassene Zeichen für den Domain Namen.
PHP-Code:
<?php
function checkEmail($email) {
// First, we check that there's one @ symbol, and that the lengths are right
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// Split it into sections to make life easier
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++) {
if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
return false;
}
}
if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0; $i < sizeof($domain_array); $i++) {
if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
return false;
}
}
}
return true;
}
// get form data
$user_email = $_POST['user_email'];
// check if email is valid
if (checkEmail($user_email) == false) {
// redirect to error page
header ("Location: error.php");
}
?>
Vor dem Einfügen: SQL Injections verhindern
Um zu verhindern, dass nach der Eingabe von Formulardaten aus Eurer INSERT Anweisung eine DELETE Anweisung wird, sollte man sich einmal mit dem Thema 'SQL Injections' auseinandersetzen. Im Kern geht es darum, dass bestimmte Formulareingaben dazu führen können, dass Euer SQL Code 'erweitert' wird - und das kann Schaden anrichten. Wie man diesem Problem begegnet kann unterschiedlich sein, es hängt von Eurer Version und bestimmten Konfigurationen ab. Ein gutes Stichwort hierzu: 'magic_quotes'.
Die folgende Funktion führt dazu, dass Eure Formulareingaben vor der Verwendung in einem SQL Statement 'escaped' werden. D.h., dass Zeichen die schädlich sein könnten z.B. Hochkommas mit einem \ (Slash) versehen werden, so dass Sie im SQL Statement keinen Schaden mehr anrichten können.
Die Funktion fährt zweigleisig, so dass 'escaped' wird, unabhängig davon ob magic_quotes an- oder ausgeschaltet sind.
PHP-Code:
<?php
function noInjection($value) {
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)) {
$value = mysql_real_escape_string($value);
}
return $value;
}
?>
Die Werte in Eurem SQL Statement lasst ihr jetzt z.B. vor dem Insert durch diese Funktion laufen:
PHP-Code:
<?php
// get user info
$user_name = 'Klaus';
// insert user info
$insertSQL = "
INSERT INTO users (
user_name
)
VALUES (
'".noInjection($user_name)."'
)";
mysql_select_db($database_connDB, $connDB);
$result = mysql_query($insertSQL, $connDB) or die(mysql_error());
?>
Zum Thema Sicherheit gibt es in PHP/SQL sehr viel zu sagen, mit einer vernünftigen Validierung und den magic_quotes fahrt ihr aber zunächst einmal schon sehr gut.