• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

SQL-Injection safe?

michael2105

Neues Mitglied
Hallo allerseits,

folgender Code erstellt Metatags für die einzelnen Seite eines CMS an dem ich gerade arbeite.

Da dachte ich mir, ich bastel einfach die Prüfung aller per $_GET übergebenen Variablen direkt in diese Funktion.

Allerdings kenne ich mich noch nicht wirklich mit SQL_Injection aus und frage daher mal in die Runde, ob ich mit meinem Code auf dem richtigen Weg bin und was ich ggfs. noch verbessern kann um meine Seite zu schützen.

Danke für Eure Hilfe & Gruß
Michael

Code:
// Generiert Meta-Tags
// Prüft alle auf der Seite benutzten Variablen aus $_GET
// Funktionsaufruf erfolgt per hardcode in index.php - also bei jedem Seitenaufruf
function showMetaTags() {
     if (get_magic_quotes_gpc()) {
       $id     = stripslashes( $_GET['id'] );          #nur Zahlen
         $m     = stripslashes( $_GET['m'] );           #nur Zahlen
         $cur     = stripslashes( $_GET['cur'] );         #nur Zahlen
         $news_id = stripslashes( $_GET['news_id'] );    #nur Zahlen
         $seite =  stripslashes($_GET['seite']);         #nur Zahlen

         $show     = stripslashes( $_GET['show'] );  #nur Buchstaben
         $type   = stripslashes( $_GET['type'] );  #nur Buchstaben
    }
    else
    {
        $id = $_GET['id'];
                 $m = $_GET['m'];
                 $cur = $_GET['cur'];
                 $news_id = $_GET['news_id'];
                 $seite = $_GET['seite'];

                 $type = $_GET['type'];
                 $show = $_GET['show'];
    }
    // Trimmen
    $id = trim( $id );
         $m = trim($m);
         $cur = trim($cur);
         $news_id = trim($news_id);
         $seite = trim($seite);

         $show = trim($show);
         $type = trim($type);

         $zahlen = array();
         if(!empty($id)) { $zahlen[] = $id; }
         if(!empty($m)) { $zahlen[] = $m; }
         if(!empty($cur)) { $zahlen[] = $cur; }
         if(!empty($news_id)) { $zahlen[] = $news_id; }
         if(!empty($seite)) { $zahlen[] = $seite; }
             foreach($zahlen as $element)               #Mal sehen ob auch nur Zahlen ankommen - sonst exit
             {
               if(!is_numeric($element)) {
                      exit;
               }
             }

        $buchstaben = array();
        if(!empty($show)) { $buchstaben[] = $show; }
        if(!empty($type)) { $buchstaben[] = $type; }
             foreach($buchstaben as $element)              #Mal sehen ob auch nur Buchstaben ankommen - sonst exit
             {
               if(is_numeric($element)) {
                      exit;
               }
             }
 
Werbung:
Um dich vor SQL-Injections zu schützen gibt es in PHP die Funktion PHP: mysql_real_escape_string - Manual und/oder du nutzt die MySQL-Erweiterung PHP: Mysqli - Manual. Wenn du Integer über $_GET erwartest, kannst du diese per PHP: intval - Manual in einen Integer umwandeln, dann sollte man damit nicht mehr viel anstellen können ;)

Statt dein Script abzubrechen, solltest du daher lieber die übermittelteten Inhalte mit diesen Funktionen so umwandeln, dass sie keinen Schaden mehr anrichten können.
 
Heißt ich setze mir noch vor
Code:
if(get_magic_quotes(gpc))..
ein
Code:
$id = intval($_GET['id']);

wenn ich das richtig verstanden habe?
 
Werbung:
Das kannst du auch danach machen.

Es macht sowieso keinen Sinn eine Variable, die nur aus Zahlen bestehen soll, durch stripslashes zu jagen. magic_quotes_gpc (sofern auf on) sorgt dafür, das Formulardaten, die Zeichen wie ' enthalten, escaped werden. Integer enthalten solche Zeichen aber nicht, daher nur Strings mit stripslashes verarbeiten und integer durch intval jagen. Strings bei Verwendung in SQL-Queries mit mysql_real_escape_string "absichern" und integer eben mit intval.
 
Zurück
Oben