PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sicherheitsfrage bei einer großen Webapplikation


atheos
22.10.2007, 16:45:47
Grüß Euch,

Derzeit entwickle ich an einer Webapplikation, welche Veranstalter später für Ihre Website nutzen können.
Dahinter steht ein Server und eine einheitliche Datenbank um die gleiche Benutzerauthetifizierung zu nutzen.
Jeder Veranstalter bekommt einen ftp Zugang und kann dort seine Seite bearbeiten
Im Grunde funktioniert auch alles Prima.
in den UserPHPDatein werden die CoreKomponenten eingebunden und liefern die Dtaen zurück. Das einzige Problem besteht darin, dass man mit show_source bzw file_get_contents den SourceCode der CoreKomponenten ausgeben kann.
Das ist natürlich nicht gewünscht.
anzumerken wäre, dass unser server sich im php safe_mode befindet. ergo kann ich kein ini_set aufrufen. weiteres gibt es mehrere Webapplikationen auf diesem Server, aus diesem Grund kann ich funktionen nicht einfach verbieten.
Spitze wäre eine Möglichkeit die "gefährlichen" funktionen für diese Webseite wärend der Laufzeit umzubenennen . aber wie ? Falls es noch andere Lösungsvorschläge gibt, dann her damit :)
Anbei nochdie Ordnerstruktur um einwenig klarheit zu schaffen

Ordnerstrukur
+applikationsordner
+projekte
+ProjektA
+ProjektB
+user templates
>user php datein
>Corekomponenten

Danke im Voraus AtHeOS

feuervogel
22.10.2007, 17:21:31
also entweder deine nutzer kommen an ihre daten nur mittels xmlrpc, oder du lädst alle daten in die templates und die nutzer dürfen nur die templates bearbeiten.gerade smarty hat da ein paar sehr komfortable möglichkeiten in der richtung.

atheos
23.10.2007, 07:15:26
Grüß dich,

Danke für deinen Post.
Diesen Denkansatz hatte ich ganz am Anfang auch.
Jedoch ist man, wenn man nur Templates anbietet, ziemlich eingeschränkt.

Gestern bin ich noch auf folgenden Denkansatz gekommen.
Man könnte die CoreKlassen ja verschlüsseln.(sowie der zend guard)
jetzt stellt sich die Frage:
Gibt es soetwas kostenlos ? bzw. wie integriert man eigene Programme in php, damit sie vor der Ausführung den Code wieder übersetzten.

Oder gibt es andere vorschläge ?

feuervogel
23.10.2007, 13:44:54
Grüß dich,

Danke für deinen Post.
Diesen Denkansatz hatte ich ganz am Anfang auch.
Jedoch ist man, wenn man nur Templates anbietet, ziemlich eingeschränkt.


einerseits willst du ja eine gewisse einschränkung, die dir php nicht bietet, also musst du wohl auf etwas anderes zurückgreifen.desweiteren: in welcher hinsicht ist z.b. die template-sprache von smarty einschränkend?

Chance
23.10.2007, 20:00:58
In Smarty Templates kann man PHP ausführen lassen.

Muss leider zugeben, das ich mich nicht so gut mit den Kern von Apache & PHP auskenne.
Aber gibt es nicht die Möglichkeit, in dem es mehere PHP Threads gibt, die alle eine eigene php.ini haben ?
So könnte es für jede Installation speziell aktiviert und deaktiviert werden.

feuervogel
23.10.2007, 20:18:48
In Smarty Templates kann man PHP ausführen lassen.


Man kann aber auch verbieten, php ausführen zu lassen, genau dafür gibts einen extra sicherheits-schalter.

atheos
24.10.2007, 07:24:24
Grüß Euch,

Danke für eure Antworten.
Punkt ist der, dass man sich bei diesem Projekt für eine andere Lösung als smarty entschieden hat.
Smarty bzw. die TemplteEngine selbst waren auch nicht die Frage.

Aber gibt es nicht die Möglichkeit, in dem es mehere PHP Threads gibt, die alle eine eigene php.ini haben ?
So könnte es für jede Installation speziell aktiviert und deaktiviert werden.
Man kann sogar für jede Applikation eine eigenen php.ini verwenden. Ich glaub jedoch, dass diese Option im safe_mode nicht verfügbar ist (hat auf jedenfall nicht funktioniert)..
dann könnte man unerwünschte php-eigene Funktionen einfach deaktivieren.
Wenn ich das jetzt mache, dann wirkt es sich auf den ganzen server aus.
Lieber wäre mir eine Lösung, wo ich sessionbezogen funktionen umbennen kann.
damit könnte ich projekte von programmierern die das system gefährden auch deaktivieren.

lg AtHeOS

feuervogel
24.10.2007, 09:07:40
Lieber wäre mir eine Lösung, wo ich sessionbezogen funktionen umbennen kann.


das ist meines wissens nach nicht möglichl.

Tumasch
13.12.2007, 11:55:05
da du ja die User-PHP's inkludest resp. evalst sollte ein file_get_content mit anschliessender strpos($filecontent, 'file_get_content') genügend sein um zu wissen ob die Datei inkludiert werden soll, oder?

atheos
13.12.2007, 12:19:09
@Tumasch
Danke das ist ein spitze denkansatz.

Übersicht:
Userprojekt
index.php
|---->include der Core Klasse
|---->include des aktuellen Moduls

Woher weis ich jetzt welche Dateien alles eingebunden werden, damit ich sie überprüfen kann ?

Alle Datein Checken wird zu langsam sein.



//LanCore>Core einbinden
include("../../LC.Core.php");

//LanCore>TemplateEngine einbinden
include("../../LC.TemplateEngine.php");

// Templateklasse initialisieren
// Du kannst ein eigenes Template erstellen, in dem du die Datein im Ordner './templates/default' änderst oder
// dir einen eigenen Ordner anlegst(am besten default kopieren) und die *.tpl änderst.
// !!!Hier musst du dann den unten angeführten Pfad ändern!!!

$tmp = new LC_TemplateEngine("./templates/default/");
//LanCore>TemplateInclude einbinden
// Hier werden globale Variable inkludiert
include("../../LC.TemplateInclude.php");



if(isset($_GET['cmd']))// Wenn ein Moduleingebunden werden soll
{
if(file_exists($_GET['cmd'] . ".php"))
{
include $_GET['cmd'] . ".php";
}
else // Wenn ein spezielles Modul geladen werden soll und die Datei nicht existiert.
{
$tmp->add("content", $tmp->load("error.page.tpl"));
$tmp->add("error_message","Die Datei '". $_GET['cmd'] .".php' ist nicht vorhanden.");
}
}
else //Hier wird das Standard Modulgeladen. In diesem Fall die News.
{
if(file_exists("news.php"))
{
include 'news.php';
}
else
{
$tmp->add("content","Die Datei 'news.php' ist nicht vorhanden.");
}
}
//var_dump($tmp->werte);
// Seite ausgeben
$tmp->output("index.tpl");
?>

Tumasch
13.12.2007, 12:38:28
1. include $_GET['cmd'] . ".php"; ist nicht clever. Da kann ja dann jede mögliche Datei auf dem ganzen webserver geincluded werden, auch eine die `rm -rf /` enthält ... Zur sicherheit würde ich zumindest safemode on setzen. Das inkluden von schädlichem Code lässt sich aber nicht wirklich vermeiden, hier musst du deinen User vertrauen...

Schau mal ob dirname($_GET['cmd'] ) im richtigen verzeichnis ist (= User-directory). es sollte so heissen:


$filename = $_GET['cmd'];
if (dirname($filename) != $user_directory) {
die("Dateien ausserhalb Userdirectory können nicht inkludiert werden");
}
$filecontent = file_get_content($filename);
if (strpos($filecontent, 'file_get_content') !== false) {
die("file_get_content in User-dateien nicht erlaubt");
}
if (strpos($filecontent, 'include') !== false) {
die("include in User-dateien nicht erlaubt");
}
if (strpos($filecontent, 'require') !== false) {
die("requirein User-dateien nicht erlaubt");
}
include ($filename);


Du könntest ja alernativ eine funktion bereitstellen, welche dateien inkludiert und/oder ausliest, nachdem deren Position geprüft wurde:


function user_file_get_content($file){
if (dirname($file) != $user_directory) {
die("Dateien ausserhalb Userdirectory können nicht inkludiert werden");
}
$filecontent = file_get_content($file);


Weiter darfst du selber denken :-)
}

atheos
13.12.2007, 12:45:37
es stimmt im grunde.

das includen der datein macht der user selbst in seinem projekt
was ist wenn er die get variable umbenennt in z.b. modul ?
wichtig wäre, dass ich in der coreklasse mitbekomme was er includiert. man könnt auch

wenn er jetzt jedoch die coreklasse nicht einbindet und gleich ein 'file_get_content' macht, dann kann mir ja nur noch einen verschlüsselungder datei helfen

oder was meinst du ?

trotzdem möchte ich erkennen, wenn jemand eine verbotne funktion benutz, damit ich seinen zugang serren kann

Tumasch
13.12.2007, 12:47:45
Sorry, lies nochmals oben, hatte gröbere korrekturen drinn.

atheos
13.12.2007, 13:05:37
lessig wäre, wenn ich z.b. file_get_content überschreiben könnte.
dabei sagt er mir klarerweise Cannot redeclare file_get_contents()

kennst du einen möglichkeit wie ich im safe mode eine funktion überscheiben kann ?

Tumasch
13.12.2007, 13:09:50
funktionen überschreiben is nicht. Mach eher einen

str_replace("file_get_contents","user_file_get_contents", $filecontent);

und eval()'e den code dann. Oder filter den Code und schreib die korrigierte Version in ein Tempfile und incude diese datei.