bituniverse.com Foren-Übersicht bituniverse.com
Entwickler Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Sicherheitscheck ob File existiert / includiert werden kann

 
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Code-Schnipsel
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: Do 15 Nov, 2007 21:32    Titel: Sicherheitscheck ob File existiert / includiert werden kann Antworten mit Zitat

Hier eine Klasse (PHP5) die ich geschrieben habe um zu prüfen, ob eine
Datei im gewünschten Ordner existiert und inkludiert werden kann / darf:

Php:
  1. <?php
  2.  
  3. class CheckIncludeFileClass
  4. {
  5.   /**
  6.    * Eigenschaften deklarieren
  7.    */
  8.    
  9.   // Variable in der, der aktuelle Arbeitspfad gespeichert wird
  10.   private $actual_path;
  11.  
  12.  
  13.  
  14.   /**
  15.    * Konstruktor
  16.    */
  17.   public function __construct()
  18.   {
  19.     // Arbeitspfad festhalten (Application-Root)
  20.     $this->actual_path = getcwd();
  21.    
  22.   } // ENDE: public function __construct()
  23.  
  24.  
  25.  
  26.   /**
  27.    * Funktion die prüft ob das zu Includierende-File
  28.    * auch wirklich im Include-Verzeichnis liegt
  29.    *
  30.    * @param     string      $path: Pfad der zu prüfenden Datei - Beispiel: '../includes/'
  31.    * @param     string      $file: Name der zu prüfenden Datei - Beispiel: 'home.inc.php'
  32.    * @return      boolean     true, wenn Datei existiert; false, wenn Datei nicht existiert 
  33.    */
  34.   public function checkIncludeFile($path, $file)
  35.   {
  36.     // In das Include-Verzeichnis wechseln
  37.     chdir($path);
  38.    
  39.     // Prüfen ob die zu includierende Datei im gewünschten
  40.     // Include-Verzeichnis liegt
  41.     if(in_array($file, glob("*.*")))
  42.     {
  43.       // Datei ist vorhanden
  44.      
  45.       // Zurück zum Arbeitspfad wechseln
  46.       $this->returnToActualPath();
  47.      
  48.       return true;
  49.     }
  50.     else
  51.     {
  52.       // Datei ist nicht vorhanden
  53.      
  54.       // Zurück zum Arbeitspfad wechseln
  55.       $this->returnToActualPath();
  56.      
  57.       return false;
  58.     }
  59.    
  60.   } // ENDE: function checkIncludeFile($file)
  61.  
  62.  
  63.  
  64.   /**
  65.    * Funktion die zum Arbeitspfad wechselt
  66.    */
  67.   private function returnToActualPath()
  68.   {
  69.     // Zurück zum Arbeitspfad wechseln
  70.     chdir($this->actual_path);
  71.    
  72.   } // ENDE: function returnToActualPath()
  73.  
  74.  
  75.  
  76. } // ENDE: class CheckIncludeFileClass
  77.  
  78. ?>

Hier den Beispiel-Einsatz der Klasse:

Php:
  1. <?php
  2.  
  3. // Gehen wir davon aus, es gibt einen GET-Parameter $page, der an die index.php
  4. // übergeben wird und dann soll anhand dieses Parameters eine Datei inkludiert werden
  5.  
  6. // Pfad für Include-Dateien als Konstante anlegen
  7. define('INCLUDE_PATH', '../includes/');
  8.  
  9. // Prüfung 1 - liegt überhaupt ein Parameter vor - wenn nicht, einen Defaultwert (home) angeben
  10. $page = empty($_GET['page']) ? 'home' : $_GET['page'];
  11.  
  12. // Prüfung 2 - sind in dem Parameter $page Zeichen enthalten, die weder Buchstaben, noch Zahlen,
  13. // noch Unterstriche sind? Wenn ja, ein möglicher Hackversuch - daher Defaultwert angeben!
  14. $page = preg_match('/\W/', $page) ? 'home' : $page;
  15.  
  16. // Objekt der Klasse CheckIncludeFileClass instanzieren
  17. $check_file_obj = new CheckIncludeFileClass;
  18.  
  19. // Prüfen ob Include-Datei vorhanden ist
  20. if($check_file_obj->checkIncludeFile(INCLUDE_PATH, $page . '.inc.php'))
  21. {
  22.   // Datei inkludieren
  23.   require_once(INCLUDE_PATH . $file . '.inc.php');
  24.  
  25. }
  26. else
  27. {
  28.   // Dateiname ist zwar gültig laut preg_match(), aber die Datei existiert nicht
  29.   // daher Default-Datei inkludieren
  30.   require_once(INCLUDE_PATH . 'home.inc.php');
  31. }
  32.  
  33. // Objekt der Klasse CheckIncludeFileClass wieder zerstören
  34. unset($check_file_obj);
  35.  
  36. ?>

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: Do 15 Nov, 2007 21:53    Titel: Trinitäts-Operator Antworten mit Zitat

mir fällt gerade ein, dass bestimmt der eine oder andere Anfänger nicht unbedingt mit der Schreibweise des Trinitäts-Oprator vertraut ist:

Beepa hat Folgendes geschrieben:

Php:
  1. <?php
  2.  
  3. $page = empty($_GET['page']) ? 'home' : $_GET['page'];
  4.  
  5. ?>

Das ist ein Vergleichsoperator mit "wenn-dann-sonst"-Effekt Wink

Um das mal ins "normaldeutsch" zu übersetzen:

Der Wert von $page ist, wenn $_GET['page'] leer ist, "home" und sonst das was als $_GET['page'] übergeben wurde

siehe auch das Beispiel aus dem PHP-Manual:

Php:
  1. <?php
  2.  
  3.   // Beispielanwendung für den Trinitäts-Operator
  4.   $action = (empty($_POST['action'])) ? 'standard' : $_POST['action'];
  5.  
  6.   // Obiges ist mit dieser if/else-Anweisung identisch
  7.   if (empty($_POST['action']))
  8.   {
  9.       $action = 'standard';
  10.   }
  11.   else
  12.   {
  13.       $action = $_POST['action'];
  14.   }
  15.  
  16. ?>

PHP.net hat Folgendes geschrieben:

Der Ausdruck (ausdr1) ? (ausdr2) : (ausdr3) gibt ausdr2 zurück,
wenn ausdr1 TRUE zurückgibt und ausdr3, wenn ausdr1 FALSE zurückgibt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jens
Administrator


Anmeldedatum: 05.11.2007
Beiträge: 193

BeitragVerfasst am: Fr 07 Dez, 2007 11:41    Titel: Anmerkung Antworten mit Zitat

Ich würde zum einen das chdir() weg lassen, da Du die Funktion damit zwischen Instanzierung und check quasi tot legst. Außerdem würde ich im glob() den Include-Pfad und die Extension gleich mit angeben, und vor allem auch prüfen, ob PHP die Datei überhaupt lesen darf.

Gruß jens

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
phpfan



Anmeldedatum: 05.11.2007
Beiträge: 25

BeitragVerfasst am: Fr 07 Dez, 2007 12:52    Titel: Antworten mit Zitat

Eine Klasse, die die Existenz einer Datei prüft? Ist das nicht mit Kanonen auf Spatzen schießen? Mit einem einfachen file_exists geht's doch auch.

Gruß
phpfan

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jens
Administrator


Anmeldedatum: 05.11.2007
Beiträge: 193

BeitragVerfasst am: Fr 07 Dez, 2007 13:55    Titel: Antworten mit Zitat

Naja, als (evtl. statische) Klassenmethode kann man so eine Prüfung schon mal implementieren. So als alleinstehende Klasse ist das IMHO wirklich Overkill.

Gruß Jens

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: Do 13 Dez, 2007 00:54    Titel: Re: Anmerkung Antworten mit Zitat

Sorry für die späte Rückmeldung zu den Anmerkungen Embarassed

Jens hat Folgendes geschrieben:
Ich würde zum einen das chdir() weg lassen, da Du die Funktion damit zwischen Instanzierung und check quasi tot legst.
Außerdem würde ich im glob() den Include-Pfad und die Extension gleich mit angeben, und vor allem auch prüfen, ob PHP die Datei überhaupt lesen darf.

Gruß jens

Ich wollte das mit dem include_path ja variabel halten, daher mein Ansatz mit dem Übergabeparameter.

Und die Klasse sollte ja wirklich nur vor dem include der Datei instanziert werden und dann wieder wech damit...

Jens hat Folgendes geschrieben:
Naja, als (evtl. statische) Klassenmethode kann man so eine Prüfung schon mal implementieren. So als alleinstehende Klasse ist das IMHO wirklich Overkill.

Gruß Jens

Das mit dem statisch ist echt 'ne Klasse Wink Idee, das werde ich machen Exclamation Hätte ich ja eigentlich auch selbst drauf kommen können...

Und da ist in der "echten" Klasse noch eine Funktion für statistische Zwecke - die schreibt in eine Datei,
welches File wann von welcher IP aus angefordert wurde - keine Ahnung warum ich das unbedingt mal haben wollte Rolling Eyes daher habe ich die rausgelassen...

Gruß

Beepa

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Code-Schnipsel Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB2.de
Powered by WebRing.