Willkommen in der Webstatt Zum Webstatt Blog und Stories
Snake am 25.03.08 15:15

Hallo,

ich frage mich seit einiger Zeit, ob meine Scripte sicher gegen die gänigen Anriffsmethoden wie SQL-Inject und irgend einer Form von ungewollter inclusion sicher sind.
SQL-Injects begegne ich bei strings mit mysql_real_escape_string() und bei ints mit intval(). reicht das?
Außerdem benutz ich sehr oft die get Variable 'id'. Da ich von Hausaus nunmal Faul bin, dachte ich mir, anstatt sie jedesmal zu Intvallen, prüfe ich sie einfach beim Start:
if(isset($_GET['id']) && !is_numeric($_GET['id'])) unset($_GET['id']);
Ob das nun schön ist oder nicht ist ansichts Sache, aber sehr ihr darin ein Problem? Irgendeine möglichkeit, da irgendwie in die SQL-Abfrage einzugreifen?

Dann wegen ungewollter inclusion, hier mein Code:

/**
* handle http request
*
*/
private function handleRequest() {
if(isset($_GET['p'])) {
$type = 'page';
$name = $_GET['p'];
}elseif(isset($_GET['s'])) {
$type = 'setting';
$name = $_GET['s'];
} elseif(isset($_GET['f'])) {
$type = 'form';
$name = $_GET['f'];
} else {
$type = 'page';
$name = 'index';
}
$name = ucfirst(strtolower($name)).ucfirst($type);

$this->loadModule($type, $name);
$this->execModule($name);
}

/**
* load a module
*
* @param string $type type of module
* @param string $module module name
*/
private function loadModule($type, $module) {
if(preg_match('/^[a-zA-Z0-9]+$/', $module) && file_exists(MODULES_ROOT.'/'.$type.'/'.$module.'.class.php'))
require(MODULES_ROOT.'/'.$type.'/'.$module.'.class.php');
else throw new Exception('Requested module not found: '.$type.' - '.$module);
}

/**
* exec module
*
* @param string $module module name
*/
private function execModule($module) {
if(class_exists($module)) {
try {
$m = new $module();
$m->execToTemplate();
} catch(PermissionDenitedException $e) {
self::getTemplate()->addVariable('content', new template('PermissionDenitedException.htm'));
}
} else throw new Exception('Class '.$module.' not found!');
}


Mit preg_match('/^[a-zA-Z0-9]+$/', $module) will ich erreichen, dass nur Buchstaben und Zahlen als Modulname angegeben werden können. Reicht das?
Verbesserungsvorschläge?

netcup.de Warum gibt es hier Werbung?
nuit nuit am 25.03.08 19:33

naja wie du schon gesagt hast ist schönheit ansichtssache ^^

bei der Get variable seh ich keine möglichkeit, da er nur numerische sachen durchlässt...und mit numerisch wüsste ich nichts einzuschleusen...weiss ja nicht wie du die id später verwendest....aber noja


zum Fremd include:
$type wird ja von dir gesetzt...und $module wird ja über einen RegEx geprüft und kann daher nur Buchstaben und Zahlen sein...demnach kein extern: [URL]http://[/URL] und kein intern ../../
nur halt die einzelnen module, und das ist nicht schlimm.....


also cih seh da keine möglichkeit: Schön gemacht snake

Michael Michael am 26.03.08 09:10

Ich stimme nuit zu! Sieht meiner Meinung nach sehr gut aus.

Um bei das require vollkommen unabhängig von Benutzereingaben zu machen, könntest du zu Beginn das MODULES_ROOT auslesen und einen Array mit den verfügbaren Modulen machen und zusätzlich prüfen, ob dies übereinstimmt.
Aber das machst du ja im Grunde mit file_exists

Ansonsten würde ich $_GET['id'] vielleicht auf 0 oder -1 und nicht auf undef setzen, damit eventuell davon abhängige Datenbankabfragen nicht mit "... WHERE ID=" einen Fehler produzieren.

Michael

Offtopic @Snake: Kannst du vielleicht deinen Aufbau (insbesondere das Exception Handling) kurz beschreiben. Es ist immer sehr hilfreich und wertvoll einmal zu sehen, wie das andere lösen.

Snake am 26.03.08 10:57

Naja, mein Exceptionhandling ist nichts besonderes:
'PermissionDenitedException' wird, wie man sieht, in dem Code abgefangen.

Dann gibts noch MysqlException, PHPException und einfach nur Exception. Per set_error_handler() wird ein Phpfehler zu PHPException umgebaut. Diese 3 werden einfach auf unterster Ebene abgefangen und geben eine Fehlermeldung aus bzw. senden bei Bedarf eine E-Mail mit dem Fehler.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt