kostenloser Webspace werbefrei: lima-city


index.php als Scheinordner

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    a******o

    Hallo,

    wie kann ich index.php als Ordner verwenden (Scheinordner)?
    Das Beispiel auf dieser Seite klappt leider nicht: http://www.guweb.com/postcards/help/antileech.shtml
    Leider kenne ich nicht den genauen Begriff dafür, deswegen finde ich dazu nichts passendes.
    index.php soll die Session überprüfen und dann weiterleiten auf den Ordner "privat".

    URL Beispiel: http://myserver.de/index.php/bild.jpg
    statt: http://myserver.de/privat/bild.jpg

    Danke im Vorraus!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. function cc_getServer ($index, $return = false) {
      return ((isset ($_SERVER[$index]) && trim ($_SERVER[$index])) ? $_SERVER[$index] : $return);
    }
    
    function extractPath () { // return an array | index.php/data[1]/data[2]/data[3]
      $data = getPathInfo ();
      $data = (substr ($data, 0, 1) === '/') ? $data : '/'.$data;
      $data = (substr ($data, -1, 1) === '/') ? $data : $data.'/';
      if ($data == '/') {
        return (array (1 => false, 2 => false, 3 => false));
      } else {
        if (preg_match ('/^\/([a-zA-Z0-9\_]+)\/([a-zA-Z0-9\_]*)\/*(.*)$/', $data, $matches)) {
          $matches[3] = explode ('/', $matches[3]);
          return ($matches);
        } else {
          return (array (1 => false, 2 => false, 3 => false));
        }
      }
    }
    
    function getPathInfo () {
      if (cc_getServer('PATH_INFO')) {
        return ($_SERVER['PATH_INFO']);
      } elseif (cc_getServer ('ORIG_PATH_INFO')) {
        return ($_SERVER['ORIG_PATH_INFO']);
      } elseif (cc_getServer ('PHP_SELF')) {
        $data = preg_replace ('/^'.preg_quote ($GLOBALS['_PATH']['index'], '/').'(.*)$/', '$2', $_SERVER['PHP_SELF']);
        if ($data != $_SERVER['PHP_SELF']) {
          return ($data);
        } else {
          return (false);
        }
      } elseif (cc_getServer ('REQUEST_URI')) {
        $data = preg_replace ('/^'.preg_quote ($GLOBALS['_PATH']['index'], '/').'(.*)$/', '$2', $_SERVER['REQUEST_URI']);
        if ($data != $_SERVER['REQUEST_URI']) {
          return ($data);
        } else {
          return (false);
        }
      } else {
        return (false);
      }
    }

    Einfach im Script "extractPath ()" aufrufen, dass gibt ein Array zurück mit allen Werten hinter index.php/, wobei jeder Wert durch ein Slash getrennt ist.

    Gruß Lucas
  4. Autor dieses Themas

    a******o

    Ich glaube ich habe etwas anderes gemeint als du gedacht hast.
    An einem anderen Beispiel:
    http://myserver.de/privatordner.php/bild.jpg
    auch möglich http://myserver.de/zufall1234/bild.jpg
    ich möchte das das Bild so geladen wird:

    <img src="privatordner.php/bild.jpg" />


    Wie hat privatordner.php


    Mein Ziel: kein Zugriff auf dem privat Ordner wenn man nicht in der Session ist.
    Für Sessionüberprüfung habe ich ein include Script. Es ist nicht nötig es dazu zu posten.
  5. abitendo schrieb:
    Ich glaube ich habe etwas anderes gemeint als du gedacht hast.
    An einem anderen Beispiel:
    http://myserver.de/privatordner.php/bild.jpg
    auch möglich http://myserver.de/zufall1234/bild.jpg
    ich möchte das das Bild so geladen wird:

    <img src="privatordner.php/bild.jpg" />


    Wie hat privatordner.php


    Mein Ziel: kein Zugriff auf dem privat Ordner wenn man nicht in der Session ist.
    Für Sessionüberprüfung habe ich ein include Script. Es ist nicht nötig es dazu zu posten.

    Deinen ersten Post habe ich verstanden, deinen zweiten allerdings nicht.

    Lege eine blabla.php an, kopiere meine Code rein, rufe die genannten Funktion auf und checke ob "bild.jpg" im Array mit Indize 0 steht.
    Wenn ja "readfile ('deinprivatesverzeichnis/bild.jpg');" -> fertig.
    Ansonsten schreibem al ausführlich, grammatikalisch korrekt und logisch aufbauend, was du machen möchtest.

    edit:
    Mal lieber als Script, ich habe das Gefühl sonst ist es nicht verständlich für dich...
    privatordner.php
    <?php
    // meinen code von oben
    
    $tmpArray = extractPath ();
    if (exists ($tmpArray[0]) && $tmpArray[0] == 'bild.jpg') {
    readfile ('zufall1234/bild.jpg');
    } else {
    exit ('soory, bild nicht vorhanden');
    }

    Wenn man nun "privatordner.php/bild.jpg" aufruft, erscheint das Bild" aus dem Ordner "'zufall1234/bild.jpg'"

    Beitrag zuletzt geändert: 25.2.2011 23:09:06 von lucas9991
  6. Ich glaube, ich weiß, was er meint:
    Er will das Bild "privatordner/bild.gif" mittels folgender URL aufrufen: "index.php/bild.gif". Dabei will er überprüfen, ob der Benutzer eine gültige Session hat.
    Das realisierst du mittels ModRewrite in deiner .htaccess-Datei:
    # Zum Sperren der Bilder in dem Verzeichnis
    ## Sperren der *.gif
    <Files *.gif>
    Order allow,deny
    Deny from all
    </Files>
    ## Sperren der *.jpg
    <Files *.jpg>
    Order allow,deny
    Deny from all
    </Files>
    
    # Zum Anschalten der Rewrite-Engine
    RewriteEngine On
    
    # Zum Umleiten der Anfrage auf "index.php?bild=bild.gif"
    RewriteRule ^index\.php/(.*)$ index.php?bild=$1

    Das sollte alle Anfragen von "index.php/bild.gif" auf "index.php?bild=bild.gif" und somit den Dateinamen des Bildes als Übergabeparameter mittels GET übergeben. Diese Daten kannst du dann auswerten und bearbeiten (Sollte unter deinem Link stehen). Ich habe jetzt stellvertretend nur alle *.jpg- & *.gif-Bilder gesperrt. Für andere Dateitypen geht das analog genauso!

    Eine Frage hätte ich hierzu noch: Wieso gibst du nicht gleich als Bild-URL "pics.php?bild=bild.gif", wobei dein Session-überprüfungs, sowie Bildausgabescript unter pics.php ist, und per Get-Variable (bild) der Dateiname deines Bildes übergeben wird. Dann könntest du dir ModRewrite sparen! :wink:
  7. biolauri schrieb:
    [...]

    Das ist doch exakt das, was ich mit meinem Script mache. Ich verzichte lediglich auf die .htaccess, da sie überflüssig ist. Oo
  8. lucas9991 schrieb:
    biolauri schrieb:
    [...]

    Das ist doch exakt das, was ich mit meinem Script mache.

    Sorry, habs mir nicht so ganz durchgelesen, da ich dafür nie so viel Script verwenden würde. Die Überprüfung, ob das Bild vorhanden ist, kann man sich sparen, da man entweder eine Exception abfängt. Zur kann man - auch wenns unschön ist - ein @ davor setzen und prüfen, ob der Rückgabeparameter false ist.
    Ich verzichte lediglich auf die .htaccess, da sie überflüssig ist. Oo

    Die .htaccess ist nicht ganz überflüssig. Du musst ja i-wie die Bilder schützen, dass man drauf zugreifen kann.
    Und ich persönlich würde die Methode per GET-Parameter bevorzugen, da sie ja primär für soetwas gemacht wurde. Aber das muss jeder für sich selbst entscheiden! :wink:
  9. Autor dieses Themas

    a******o

    @lucas9991
    wenn ich http://meinserver.de/privatordner.php/bild.jpg aufrufe:
    dann bekomme ich mit var_dump das aus dem $tmpArray raus:

    array(3) { [1]=> bool(false) [2]=> bool(false) [3]=> bool(false) }

    @biolauri
    Kann das auch gehen wenn mod_rewrite aus ist?
  10. abitendo schrieb:
    @lucas9991
    wenn ich http://meinserver.de/privatordner.php/bild.jpg aufrufe:
    dann bekomme ich mit var_dump das aus dem $tmpArray raus:

    array(3) { [1]=> bool(false) [2]=> bool(false) [3]=> bool(false) }

    Bei mir geht es auf mehreren Servern, sowohl unter Linux als auch Windows.
    Ein leeres Array kommt dann zurück, wenn die Datei ohne Parameter aufgerufen wird.

    Ansonsten lass dir mal die folgendewn Variablen ausgeben und poste sie hier.
    $_SERVER['PATH_INFO']
    $_SERVER['ORIG_PATH_INFO']
    $_SERVER['PHP_SELF']
    $_SERVER['REQUEST_URI']



    @biolauri
    Kann das auch gehen wenn mod_rewrite aus ist?

    Lesen und Verstehen... "Das realisierst du mittels ModRewrite" - natürlich muss dafür mod_rewrite an sein, um mod_rewrite nutzen zu können.
    Du fragst doch auch nicht, ob man Radio hören kann, wenn es ausgeschaltet ist...

    edit:
    @biolauri:
    Die .htaccess ist aus meiner Sicht überflüssig, da ich schützenswerte Dateien nicht in den Webroot legen würde. ;-)
    Also so ablegen, dass erst gar kein externer Zugriff möglich ist.


    [...] Die Überprüfung, ob das Bild vorhanden ist, kann man sich sparen, da man entweder eine Exception abfängt. Zur kann man - auch wenns unschön ist - ein @ davor setzen und prüfen, ob der Rückgabeparameter false ist.

    Die Funktion sollte "isset ()" heißen, nicht "exists ()". ;-)
    Darüberhinaus war es ein simples Beispiel zur Anwendung. Wie man es letztendlich implementiert bleibt einem selbst überlassen.

    Beitrag zuletzt geändert: 26.2.2011 12:21:59 von lucas9991
  11. Autor dieses Themas

    a******o

    (mein privater Testserver)
    PATH_INFO: <- NULL
    ORIGPATHINFO: <- NULL
    PHP_SELF: bildtester.php
    REQUEST_URI: /bildtester.php

    (Webspace)
    Pathinfo: <- NULL
    ORIGPATHINFO: /bildtester.php
    PHP_SELF: /bildtester.php
    Request_URI: /bildtester.php

    Das <- NULL ist nur ein Vermerk, das es keinen Wert dafür gibt.
  12. abitendo schrieb:
    (mein privater Testserver)
    PATH_INFO: <- NULL
    ORIGPATHINFO: <- NULL
    PHP_SELF: bildtester.php
    REQUEST_URI: /bildtester.php

    (Webspace)
    Pathinfo: <- NULL
    ORIGPATHINFO: /bildtester.php
    PHP_SELF: /bildtester.php
    Request_URI: /bildtester.php

    Das <- NULL ist nur ein Vermerk, das es keinen Wert dafür gibt.


    Lass dir die Variablen in "privatordner.php" ausgeben, wenn du "privatordner.php/bild.jpg" aufrufst.

    edit:
    Dann solltest du sehen, dass dort bei ein oder mehreren der Variablen "privatordner.php/bild.jpg" steht.
    Wenn dass der Fall ist, dann müsste mein Script auch korrekt arbeiten.
    Ist das nicht der Fall würde es mich wundern. :)
    Ich probiere es mal auf lima aus.

    edit2: Oh, tatsächlich bei Eingabe eines Punktes gibt es Probleme. Moment. :-)
    edit3: Ich überarbeite mal den RexEx. :-)

    edit4:
    Ok, hier nochmal das Script für deine Bedürfnisse. ;-)
    http://nopaste.info/09b926ed52.html
    Zum Test:
    http://lucas9991.lima-city.de/tmp.php/bild.jpg/test%20bla,/asd

    Beitrag zuletzt geändert: 26.2.2011 14:00:32 von lucas9991
  13. Autor dieses Themas

    a******o

    jetzt zeigt er mir nur den link also das: http://myserver.de/privatordner.php/bild.jpg
    statt das Bild anzuzeigen.
    Den Content-type per mit header() zu setzen (vor die readfile() gesetzt), hat nur die binär Daten ersetzt (vgl. öffne .jpg mit Notepad o. ä.).
    header('Content-type: image/jpg');
  14. abitendo schrieb:
    jetzt zeigt er mir nur den link also das: http://myserver.de/privatordner.php/bild.jpg
    statt das Bild anzuzeigen.
    Den Content-type per mit header() zu setzen (vor die readfile() gesetzt), hat nur die binär Daten ersetzt (vgl. öffne .jpg mit Notepad o. ä.).
    header('Content-type: image/jpg');


    Wie bitte?
    Du wolltest doch wissen, wie man alles hinter "index.php/" ausliest. Das habe ich dir gezeigt.
    Klappt das nun auch bei dir?

    Und was möchtest du noch machen? Hast du Probleme, dass das Bild aucah an den Browser gesendet wird und dieser es dir anzeigt?
    Dazu müsstest du in der Tat den Content-Type vor der Ausgabe des Bildes setzen.

    Versuche dich einfach mal klar strukturiert und vernünftig auszudrücken.

    Beitrag zuletzt geändert: 26.2.2011 14:28:08 von lucas9991
  15. Autor dieses Themas

    a******o

    Ich möchte durch den Aufruf diesen Links http://myserver.de/privatordner.php/bild.jpg
    das Bild anzeigen mit:
    <img src="privatordner.php/bild.jpg" />

    der Ordner soll nur Personen in der Session aufrufbar sein.
    Als zukünftige Erweiterung würde ich gerne es dann noch erlauben das lima-city auf die Dateien zugreifen kann.
    (Brauche lima-city wegen SSL)
  16. abitendo schrieb:
    Ich möchte durch den Aufruf diesen Links http://myserver.de/privatordner.php/bild.jpg
    das Bild anzeigen mit:
    <img src="privatordner.php/bild.jpg" />

    der Ordner soll nur Personen in der Session aufrufbar sein.
    Als zukünftige Erweiterung würde ich gerne es dann noch erlauben das lima-city auf die Dateien zugreifen kann.
    (Brauche lima-city wegen SSL)

    Aha, und wo ist nun dein Problem, bzw. wo hast du Fragen oder wo kann man dir Hilfestellungen geben?
    Denkst du wir programmieren dir das jetzt fertig, oder was erwartest du?
    Hier stehen doch alle Antworten zu deiner Frage.
    Wenn du keine Ahnung von Sessions etc. hast, dann lies dich halt ein, oder hol dir ein PHP Buch!

    edit:
    Oder schreibe ein Lastenheft, schick es mir und ich mache dir darauf basierend einen Kostenvoranschlag...

    Beitrag zuletzt geändert: 26.2.2011 17:10:21 von lucas9991
  17. Autor dieses Themas

    a******o

    Nein,
    die Session habe ich alles schon. Ich wollte nur die Webseite dadurch sicherer machen.
    Der Quellcode den ich gefunden habe klappt nicht bei mir.
    Ich wollte wissen wie ich es machen muss damit so etwas funktioniert. Du kannst mir auch Links geben wo ich mich damit beschäftigen kann. Nur fehlt mir der Begriff dafür wie man so etwas genau nennt.

    gefundener Beispielquellcode:
    <?php
    
     // Eigene Domain (ohne "www." oder dergleichen)
     $selfdomain = "eigenedomain.de";
    
     // Verzeichnis der Bilder (kein Slash am Ende!)
     // Relativ zum Verzeichnis dieses PHP-Skriptes
     $imgdir = "bilder";
    
     // Zusätzlich erlaubte Domain
     $allowdomain = "guweb.com";
    
     $selfdomain = strtoupper($selfdomain);
     $allowdomain = strtoupper($allowdomain);
    
     $ref = strtoupper($HTTP_REFERER);
    
     // protokoll entfernen
     $ref = str_replace("HTTP://", "", $ref);
    
     // domain extrahieren
     if (strpos($ref, "/")) $ref = substr($ref, 0, strpos($ref, "/"));
    
     if (($ref=="") || (strpos($ref, $allowdomain))
       || (strpos($ref, $selfdomain))) {
    
       $fn = $PATH_INFO;
                        
       if ((strpos($fn, "../")) || (strpos($fn, "..\\")))
       {
         echo "Zugriffsverletzung"; // Server schützen
       } else readfile($imgdir.$fn); // Datei ausgeben
                         
     } else {
       echo "Kein Zugriff";
     }
    
    ?>

    Quelle: http://www.guweb.com/postcards/help/antileech.shtml

    Natürlich habe ich den Quellcode für meine Webseite angepasst.

    Beitrag zuletzt geändert: 26.2.2011 17:23:29 von abitendo
  18. Ich habe dir das gepostet, was du haben wolltest. Und jetzt fängst du mit Code an, der den Refererr prüft?
    Das ist mir echt zu doof. Viel Erfolg trotzdem.
  19. Autor dieses Themas

    a******o

    lucas9991 schrieb:
    Ich habe dir das gepostet, was du haben wolltest. Und jetzt fängst du mit Code an, der den Refererr prüft?
    Das ist mir echt zu doof. Viel Erfolg trotzdem.


    Entschuldigung, ich haben einen Fehler gemacht.
    Um das Bild anzuzeigen muss ich readfile() ersetzen durch fopen() + fpassthru().
    Dann klappt alles.

    Danke für alles auch wenn ich es dir nicht ganz leicht gemacht habe.
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!