Ankündigung

Einklappen
Keine Ankündigung bisher.

if abfrage : wenn nicht, dann.....

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • if abfrage : wenn nicht, dann.....

    Hallo Alle,

    Ich habe nun über 2 Stunden gesucht, aber ich finde keine Antwort, also frage ich hier mal nach:

    Ich rufe meine Seiten über eine solche index.php auf:

    <?php
    if ($stuff == "") { $stuff = "home"; }
    require("content/$stuff.content");
    ?>

    im Ordner content befinden sich die links auf die einzelnen Seiten.

    Wenn nun jemand unter ?stuff=bloedsinn aufruft, sprich etwas aufruft, zu dem es keine xxxxx.content gibt, dann erhalte ich die Warnung:

    Warning: main(content/blabla.content): failed to open stream: No such file or directory in......

    Gibt es eine Möglichkeit, so wie bei Wildcard-Subdomains, im Script zu sagen, wenn ein aufruf kommt, der im Ordner content nicht vorhanden ist, dann ist der content der "home" ?????


  • #2
    http://www.php.net/manual/de/function.file-exists.php
    Developers-Guide.net
    Senseless

    Kommentar


    • #3
      Hi.

      Das ist prinzipiell kein Problem. Jedoch solltest du erstmal noch ein paar
      andere Dinge beachten:

      1. Zugriff auf externe Variablen:
      Du solltest über die superglobalen $_GET, $_POST oder $_REQUEST auf
      die externen Vars zugreifen. Dann hast du nämlich a) Klarheit woher die
      Variablen kommen (was man sonst ja schon dazuschreiben muss) und
      b) kannst du dann register_globals abschalten, womit du dir quasi einen
      Spot dicht machst, den du sonst ständig im Auge haben musst.

      2. Fehler ausgeben
      Beim Programmieren ist es sehr hilfreich, sich alle PHP-Meldungen
      ausgeben zu lassen. u kannst dir also in die erste Zeile
      set_error_reporting(E_ALL); schreiben und dann auf dem Zielserver
      E_ALL durch eine 0 ersetzen.

      m nun keine Meldung zu bekommen, musst du erstmal sicherstellen,
      dass eine ext. Variable, auf die du zugreifst auch existiert:
      PHP-Code:
      <?php
      if (empty($_GET['stuff'])) {
          
      $stuff 'home';
      } else {
          
      $stuff $_GET['stuff'];
      }

      // oder, in Kurzschreibweise:

      $stuff = empty($_GET['stuff']) ? 'home' $_GET['stuff'];
      ?>
      3. Überprüfe externe Vars
      Du solltest sicherstellen, dass der übergebene Wert (stuff) nur erlaubte
      Zeichen enthält. Andernfalls kann ein Angreifer womöglich Dateien aus
      anderen Verzeichnissen einbinden. basename() ist hier ganz praktisch.

      In dein eigentliches Problem löst du mit is_file() und is_readable().

      Basti

      Kommentar


      • #4
        Hi,
        du könntest noch einen anderen Weg gehen und die aufzurufenden Dateien explizit im Script verankern.
        Das ist allerdings nur zu empfehlen, wenn du nicht wirklich viele Seiten hast .

        Ich habe da kürzlich etwas zu geschrieben:
        http://forum.developers-guide.net/sh...age=2#post5260

        Lies mal ab da.

        Grüße Ben.
        privater Blog

        Kommentar


        • #5
          Hallo Alle!!!

          Vielen Dank für die schnellen Antworten....

          Der erste Post hat mich auf die php.net Seite geführt...

          nun habe ich es nach zahlreichen versuchen geschafft...

          die index.php sieht nun so aus:

          <?php

          if (file_exists("content/$stuff.content")) {
          include("content/$stuff.content");
          } else {
          include("content/home.content");
          }

          ?>

          und was soll ich sagen? Es funktioniert so...
          kann ich das so lassen? Was meint Ihr dazu??

          Kommentar


          • #6
            Vielleicht mal das zweite Posting lesen...?

            Basti

            Kommentar


            • #7
              okay basti...,
              sorry, ich habs nun gelesen...

              Ich verstehe es nur nicht ganz....

              Ist das wie ich es gelöst habe nicht gut...
              vielleicht sogar bedenklich....
              Ich meine, habich das so richtig verstanden, dass jemand irgendwelchen Sch... damit machen kann??

              Dann sollte ich Deinen Vorschlag wohl annehmen...

              Kommentar


              • #8
                Liege ich richtig damit, wenn ich davon ausgehe, dass $stuff über den URL übermittelt werden soll?

                Dann beachte zwei Dinge:
                1. Benutze die superglobalen Arrays. Wenn register_globals deaktiviert ist, kannst du nämlich auf Werte, die von Außen an das Script übermittelt werden, nicht mehr direkt zugreifen. Ein Beispiel für URL-Parameter findest du hier: http://tut.php-q.net/get.html
                2. Vertraue niemals Werten, die von Außen in das Script gebracht werden. Stell dir mal vor, ein Benutzer gibt einfach als Wert den Pfad zu einer Datei an, auf die er gar keine Zugriff haben darf wie zum Beispiel die Datei mit den Zugangs- / Benutzerdaten auf deinem Rechner. So wäre es beispielsweise für den Benutzer auch möglich per htaccess-Datei geschützte Verzeichnisse und Dateien ausführen zu lassen.

                Kommentar


                • #9
                  Hi "bender".

                  Ich weiß nicht genau, ob man quasi das Prefix (.content) in require umgehen kann, indem man einen Wert übergibt, der mit einem Nullbyte abschließt. In jedem Fall kann so schonmal jede Datei eingebunden werden, die mit ".content" endet. Also auch Datien außerhalb deines content-Verzeichnisses, da man ja auch z.B. stuff=../secret übergeben könnte.

                  Um dir Gedanken darüber zu sparen, jag den Wert einfach, wie beschrieben, durch basename(). Damit werden definitiv nur Dateien eingebunden, die auch im Verzeichnis content/ liegen.

                  Die anderen Punkte sind nur indirekt sicherheitsrelevant. Ein error_reporting-Level, dass dir Meldungen nicht ausgibt, führt eher zu fehlerhafter Programmierung und somit zu unsicheren Anwendungen. Allerdings steht hier eher die Zeit im Vordergrund, die du durch das Anzeigen aller Meldungen bei der Fehlersuche einsparst.

                  http://php.net/manual/en/security.errors.php

                  Über register_globals wurde derart viel geschrieben, dass ich es nicht nochmal wiederholen will. Soviel nur: Mit regiser_globals = Off musst du auch wiederum mehr Sorgfalt an den Tag legen, fehlerfrei und sicher zu programmieren. Also schalte die Option besser aus. Falls du auf diesen Wert keinen Einfluss hast, dann programmiere zumindest so, dass deine Skripte unabhängig von regsiter_globals funktionieren.

                  http://php.net/manual/en/security.globals.php

                  Basti

                  Kommentar


                  • #10
                    Okay, danke nochmal an alle....

                    @basti:

                    Ich check das vorerst noch nicht....
                    .... habe mir gerade dieses basename() - dingens angeschaut, aber ich begreife es (noch) nicht....

                    Die Anfrage die mit der URL übergeben wird (?stuff=home) wird nun per file_exists überprüft, ob eine Textdatei mit dem übergebenen Namen (home)und der Endung .content im Ordner content existiert. Wenn Ja, dann wird die Datei aufgerufen und per include eingebunden. Wenn Nein, wird ausnahmslos die Datei home.content eingebunden...
                    Für mich bedeutet das jetzt, dass man unter ?stuff=() quasi jeden Quatsch eintragen kann und man landet immer auf der home.content, also auf der Startseite....?
                    sollte das nicht reichen...? Oder ist mein Gedankengang da falsch???

                    Kommentar


                    • #11
                      Zitat von bender
                      Für mich bedeutet das jetzt, dass man unter ?stuff=() quasi jeden Quatsch eintragen kann und man landet immer auf der home.content, also auf der Startseite....?
                      sollte das nicht reichen...? Oder ist mein Gedankengang da falsch???
                      Der Benutzer könnte z.B. auch ?stuff=../geheim verwenden.

                      Jetzt würde die Datei content/../geheim.content (.. = Elternverzeichnis), also geheim.content, eingebunden (wenn diese existiert).


                      In Deinem Beispiel ist es wahrscheinlich eher unproblematisch, da die Dateiendung fest mit .content definiert ist. Aber sicher ist sicher...

                      basename() liest übrigens den reinen Dateinamen aus, also gibt z.B. basename('../geheim.content') nur geheim.content zurück!

                      Kommentar

                      Lädt...
                      X