Apache / PHP: open_basedir restrictions ...

  • Es gibt ja schon einige Einträge zu diesem Thema, aber da werde ich nicht richtig schlau (ich bin jetzt auch nicht der grosse Profi, aber meine Mini-Anwendung läuft zumindest "zu Hause").

    Ich habe die Files in das Verzeichnis einer subdomain kopiert, es funktioniert aber nicht, die entsprechende Meldung im Log lautet:


    mod_fcgid: stderr: PHP Warning: file_exists(): open_basedir restriction in effect. File(/var/www/vhosts/hostingXXXXXX.XXXXX.netcup.net/subdomains/bernd/img.php/".$dirname.$curimg.") is not within the allowed path(s): (/var/www/vhosts/hostingXXXXXX.XXXXX.netcup.net/:/tmp/:/var/lib/php/sessions) in /var/www/vhosts/hostingXXXXXX.XXXXX.netcup.net/subdomains/bernd/img.php on line 1259, referer: https://xxxxx.xxxxx.de/index2.html


    Ich möchte aus einem Unterverzeichnis "pictures" der Subdomain eine Liste von Files erstellen, ich habe sowohl scandir('pictures') als auch scandir('/pictures') sowie scandir('/var/www/---/pictures' verwendet, nichts funktioniert.

    Im Dokumentenstamm für die subdomain habe ich '/subdomains/bernd' eingegeben.


    Was mache ich verkehrt ??


    Danke Bernd


  • Du hast das übrigens im ersten enthaltenen Link nicht vollständig zensiert…


    Unabhängig davon: Die Fehlermeldung mit den Variablen sieht komisch aus. Kannst Du mal einen vollständigen Beispielcode (MRE) posten?

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Auch wenn es ja kein Geheimnis ist: danke für Tip mit Links (typisch copy & paste).


    Ich hoffe, das diesmal copy & paste besser funktioniert, hier das etwas verkürzte Stück


    <!DOCTYPE html>

    <html lang="en-us">

    <head>

      <meta charset="utf-8">

      <title>Lightbox Example</title>

      <link rel="stylesheet" href="gallery/css/lightbox.css">

    </head>

    <body>


      <section>

    <ul>

        <?php

    $dirname = "pictures/";

    $images = scandir($dirname);

    $ignore = Array(".", "..");

            foreach($images as $curimg) {

                if(!in_array($curimg, $ignore)) {

                    echo "<a class='example-image-link' href='".$dirname.$curimg."' data-lightbox='hardware0' data-title='click'><img class='example-image' src='img.php?src=".$dirname.$curimg."' alt='' /></a>\n";

    }

    }

        ?>

    </ul>

      <script src="gallery/js/lightbox-plus-jquery.min.js"></script>

    </body>

    </html>



    Es sollen alle Bilder aus dem pictures Verzeichnis angezeigt werden ...

  • Bitte benutze das nächste mal die Code-Funktion des Beitragseditors. (</> Button) :)


    Das sieht aber nicht nach der problematischen Stelle aus? Du lässt Dein Script hier nochmals mit einem src Argument aufrufen:


    Code
    img.php?src=".$dirname.$curimg."


    Was passiert dort? Ich vermute die Zeilennummer gehört eher dort dazu, wo $_GET['src'] ausgewertet wird?

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

    3 Mal editiert, zuletzt von KB19 ()

  • Hallo,

    wieder was gelernt ...

    ... ich hatte den Code auf meinem lokalen Rechner, auf dem der originale Code "natürlich" funktioniert, reduziert und dann hierher kopiert.

    In img.php wird aus dem originalen Bild ein thumbnail generiert, das dann zur Anzeige gebracht werden soll.

    Ich hatte ja vermutet, das das Problem in "meinem" scandir liegt, auf deinen Hinweis auf img.php hin habe ich mir die Fehlermeldung

    noch einmal genauer angesehen: das Problem scheint wirklich in img.php zu liegen. Zur Verifizierung habe ich einmal

    $images statisch mit existierenden Dateinamen belegt und das Ganze funktioniert auch nicht !

    Ich schaue mir jetzt zuerst einmal img.php selbst an ...

    ... auf jeden Fall scheint die Portabilität auch in diesem Environment nicht problemlos zu sein (ich hab' bisher eigentlich nur mit

    "normaler" Programmierung zu tun)


    Danke für den Tip, ich melde mich auf jeden Fall noch einmal mit entweder der Lösung oder weiteren Fragen :)


    Danke Bernd

  • So ist es halt, wenn man nur "schnell" was zusammenbauten will und keine Ahnung davon hat :(

    Wenn ich es richtig sehe, dann liegt es(nach einigem probieren) daran, das der PHP code gar nicht ausgeführt wird.


    In meiner lokalen Installation habe ich einen AddType und einen AddHandler Eintrag in https.conf gemacht und alles war gut.

    Die habe ich hier nicht (gefunden), vermutlich liegt es daran das ich "nur" einen WebHosting Tarif habe.


    Aus ähnlichen Forenbeiträgen werde ich allerdings nicht wirklich schlau, sie sind zudem zum Teil auch schon sehr alt und ich

    weis somit nicht, ob das noch "Stand der Dinge" ist.


    Die Lösung scheint ja irgendwie zu sein, einige Einträge in der ".htaccess" zu machen (die Datei existiert bei mir noch nicht), stimmt dies tatsächlich ?

    Ich habe bis jetzt in diese Richtung noch nicht weiter gesucht, da ich nicht wirklich weiß, ob das der richtige Weg ist; wenn ja,

    gibt es die ".htaccess" einmalig für die domain oder kann für jede subdomain eine eigene Datei angelegt werden ?

  • In meiner lokalen Installation habe ich einen AddType und einen AddHandler Eintrag in https.conf gemacht und alles war gut.

    Die habe ich hier nicht (gefunden), vermutlich liegt es daran das ich "nur" einen WebHosting Tarif habe.

    Korrekt (siehe auch hier). Die Nennung der konkreten Einträge, welche in einer anderen Umgebung zur Lösung führten, erleichtert übrigens meistens das Finden eines Workarounds bei Diskussionen in Foren. Sofern hier nicht seitenweise Angaben veröffentlicht werden, sind mehr Details eher hilfreich denn hinderlich.


    Die Lösung scheint ja irgendwie zu sein, einige Einträge in der ".htaccess" zu machen (die Datei existiert bei mir noch nicht), stimmt dies tatsächlich ?

    Ich habe bis jetzt in diese Richtung noch nicht weiter gesucht, da ich nicht wirklich weiß, ob das der richtige Weg ist; wenn ja,

    gibt es die ".htaccess" einmalig für die domain oder kann für jede subdomain eine eigene Datei angelegt werden ?

    (Gültige) Inhalte von .htaccess wirken auf das aktuelle Verzeichnis, in dem diese Datei liegt, sowie alle Unterverzeichnisse – sofern sich dort nicht wiederum .htaccess-Dateien befinden, welche diese Einstellungen übersteuern können (vgl. hier).

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    2 Mal editiert, zuletzt von m_ueberall ()

  • Es kann in jedem Verzeichnis eine .htaccess angelegt werden. Ich denke aber nicht, dass dir der PHP-Handler fehlt, PHP läuft ja laut Fehlermeldung offensichtlich. Die erste Fehlermeldung betraf ja open_basedir, du greifst also aus PHP heraus an irgendeiner Stelle auf eine Datei zu, die nicht innerhalb der laut Fehlermeldung erlaubten Pfade liegt. Ich würde mir da den entsprechenden Pfad, auf den in der angegebenen Zeile zugegriffen werden soll, einfach mal ausgeben lassen.

    Mit der zweiten open_basedir Einstellung kannst du auf alle Dateien innerhalb deines Webhostings zugreifen. Wenn das nicht reicht, dann hast du wohl irgendwo einen absoluten Pfad drin oder ein oder mehrere "../" zuviel.

  • Ich glaube, das war zumindest bedingter Schwachsinn, denn in der Fehlermeldung steht ja etwas von einer PHP Fehlermeldung ...

    ... ich habe die Dateinamen einmal hart codiert und mit und ohne php eingebunden.

    PHP
    <ul>
    <a class='example-image-link' href='pictures/hardware/0/Zyxel.jpg' data-lightbox='hardware0' data-title='click'><img class='example-image' src='img.php?src=pictures/hardware/0/Zyxel.jpg' alt='' /></a>
    <?php
            echo "<a class='example-image-link' href='pictures/hardware/0/Zyxel.jpg' data-lightbox='hardware7' data-title='click'><img class='example-image' src='img.php?src=pictures/hardware/0/Zyxel.jpg' alt='' /></a>";
    ?>
    <?php
            $imagefile = 'pictures/hardware/0/Zyxel.jpg';
            echo "<a class='example-image-link' href='{$imagefile}' data-lightbox='hardware7' data-title='click'><img class='example-image' src='img.php?src={$imagefile}' alt='' /></a>";
    ?>


    Das erste Element wird korrekt angezeigt, beim zweiten wird "das Ende" des PHP - Teils mit angezeigt, das dritte funktioniert gar nicht, die Fehlermeldung zeigt wieder, das $imagefile nicht aufgelöst wurde, ausserdem wieder der "Rattenschwanz am Ende" ...

    Screenshot 2023-06-13 at 19.14.32.png

  • Kann es sein, das der PHP code nicht in der .html - Datei erkannt wird, während der img.php Aufruf funktioniert, da dieser eine .php Endung hat ?

    Das kann sein, siehe den Anfang des in meiner Antwort verlinkten Diskussionsfadens: "Fü[h]rt php in html nicht aus […]".

    VServer IOPS Comparison Sheet: https://docs.google.com/spreadsheets/d/1w38zM0Bwbd4VdDCQoi1buo2I-zpwg8e0wVzFGSPh3iE/edit?usp=sharing

    Einmal editiert, zuletzt von m_ueberall ()

  • Ich hab gesehen, das dies auch eine Möglichkeit der Stringkonkatenation ist, das ist für mich etwas lesbarer als das "Gedöns mit " und '.

    Auf jeden Fall muss dort ja der tatsächliche Dateinamen stehen ...

  • Das kann sein, siehe den Anfang des in meiner Antwort verlinkten Diskussionsfadens: "Fü[h]rt php in html nicht aus […]".

    das habe ich zwar gelesen, weil aber gleich drunter steht: "das scheint nicht ganz zu gehen", habe ich es zuerst einmal gedanklich "nach hinten" geschoben.


    Was mich bei dieser Einstellung etwas unsicher macht:

    - ich kenne den Standardwert nicht

    - wenn ich einen eigenen Wert eingebe, wird der Standard überschrieben oder ergänzt (evtl. läuft ja dann etwas anderes nicht mehr)

  • Es liegt in der Tat an der Datei-Endung: als .php läuft das Ganze problemlos.

    Da ich nicht vorhabe, mich mit dem dem Thema Webseiten-Erstellung in größerer Tiefe zu befassen (es geht nur um

    eine kleine Seite zum Verkauf von ein paar Dingen), ist das Thema für nicht damit (hoffentlich) erledigt.


    Ich möchte mich bei Allen bedanken, die mir auf die Sprünge geholfen haben.

    Ciao Bernd