Einzelnen Beitrag anzeigen
  #8  
Alt 10.12.2006, 15:37:43
marc26 marc26 ist offline
Anfänger
 
Registriert seit: Apr 2006
Beiträge: 50
AW: Auslesen und beschreiben einer MySQL Datenbank

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.
Mit Zitat antworten