Sichere $_GET[''] Variable im Link

Liondo

Grünschnabel
Hallo liebe Community,

ich habe mal folgende Frage: Ich habe ein einfaches UserSystem geschrieben. Also Registrieren, Anmelden, Ausloggen etc. als Basis für mein Webscript. Das ganze habe ich dabei modular gestaltet das heißt meine einzelnen funktionen liegen in Ordnern.
Meine Ablage hat folgende Struktur: modules/"MODULNAME"/index.php

Nun gestalte ich gerade meine index.php und will im content Bereich das jeweils per Link aufgerufene Modul laden. Wenn ich also nun im linken Startmenü einen link zum Registrieren setze soll im content Bereich das Register modul geladen werden.

Einfachste Variante index.php?module=register

derzeit sieht dann meine Verarbeitung für den content wie folgt aus:
PHP:
if(isset($_GET['action']) && !empty($_GET['action'])) {
    require_once ('modules/'.$_GET['action'].'/index.php');
} else {
    echo "Kein Bereich ausgewählt";
}

Funktioniert auch super, nur ich mache mir gerade Gedanken zur Sicherheit. Einfach eine $_GET Variable auslesen birgt ja ein großes Risiko an externen eingriffen. Nun habe ich dazu 2 Fragen:

1) Kann ich den Bereich ?module=register gänzlich verschlüsselt angeben, also in der Adresszeile des Browsers nicht in klarem Text ?
2) Wie kann ich nun mit dem ankommendem Ergebniss weiter arbeiten um es zu überprüfen bzw nur das anzunehmen was ich auch haben will ? (Bereinigen etc.)


Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt und ihr könnt mir Tipps geben. In der Suche habe ich nichts wirkliches gefunden, immer nur zu spezielle GET Fragen.

Liebe Grüße
Liondo
 
Du könntest dir auch ein Array bilden indem die erlaubten Seiten gelistet sind und mit dem Get-Wert abgleichen.
PHP:
$sites = array();
$sites['index'] = 'index.php';
$sites['register'] = 'register.php';
$sites['logout'] = 'logout.php';


if(isset($_GET['action']) && !empty($_GET['action'])) {

    if(isset($site[$_GET['action'])) {
        require_once ('modules/'.$_GET['action'].'/index.php');
    }else{
        require_once ('index.php');
    }
} else {
    echo "Kein Bereich ausgewählt";
}
 
Zu 1:
URL-Verschlüsselung ist möglich mit htaccess und RewriteRules
Dies ist auch Suchmaschinenfreundlicher


Zu 2:
Daten, die über $_POST oder $_GET kommen müssen immer geprüft werden.
In einer Fachliteratur habe ich hierzu folgende Funktion gefunden, die sich gut eignet:
PHP:
function array_item($ar, $key)
{
    if(is_array($ar) && array_key_exists($key, $ar))
    {
    	if(get_magic_quotes_gpc())
        {
    	    return trim(stripslashes($ar[$key]));
    	}
        else
        {
    	    return $ar[$key];
    	}
    }
}

// Variable validieren

$var = array_item($_REQUEST,'var');
 
In einer Fachliteratur habe ich hierzu folgende Funktion gefunden, die sich gut eignet:
Bitte gib die Quelle an, wenn du Code 1:1 kopierst ;)

Man sollte stets nach Ausgabekontext filtern, d.h. ob du in HTML, in einem RegExp, in einem SQL-String (nur noch bei LIKE-Ausdrücken, sonst Prepared-Statements!), in einem Verzeichnis-Pfad (Dateiupload), ... ausgibst. Dafür kann es keine allgemeine generische Funktion geben. Du wirst also immer noch Sicherheitslücken haben. PHP hat dies damals versucht mit der magic_quotes-Funktion, aber diese wurde aus genau aus dem genannten Grund wieder gestrichen.
 
Zurück