Webstatt.org - Community seit 2006 - 2012 (2024?)

Scriptsicherheit

user-303
25.03.2008 14: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'zwinkern)
require(MODULES_ROOT.'/'.$type.'/'.$module.'.class.php'zwinkern;
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'zwinkern);
}
} else throw new Exception('Class '.$module.' not found!'zwinkern;
}


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?

Avatar user-271
25.03.2008 18: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: http:// und kein intern ../../
nur halt die einzelnen module, und das ist nicht schlimm.....


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

#!/bin/bash
traurig){ neutral:& };:
Avatar user-253
26.03.2008 08:10

Ich stimme user-271 zu! Sieht meiner Meinung nach sehr gut aus.

Um bei das require vollkommen unabhängig von user-129utzereingaben 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.

user-303
26.03.2008 09: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.