venty: move_uploaded_file

Hi!

Ich versuche gerade zum ersten mal ein skript zu bauen das mir ermöglicht dateien hochzuladen und in den richtigen bestimmungsort zu verschieben.

Dazu verwende ich move_uploaded_file aber das gibt mir immer FALSE zurück. laut phpinfo() darf ich files uploaden. Auch $_FILES['error'] gibt 0 zurück.

Wo kann ich noch nach der Fehlerquelle suchen?

Ich arbeite übrigens erst mal auf meinem localen server also kann ich die php.ini bearbeiten. In meinem versuch habe ich es mit einer JPG-Datei und einem bash-Script versucht.

MfG venty

  1. Hi!

    Dazu verwende ich move_uploaded_file aber das gibt mir immer FALSE zurück. laut phpinfo() darf ich files uploaden. Auch $_FILES['error'] gibt 0 zurück.

    move_uploaded_file benötigt Parameter. Davon schreibst du nichts.

    Kalle

    1. move_uploaded_file benötigt Parameter. Davon schreibst du nichts.

      Kalle

      Oh, ja klar der code :P

      move_uploaded_file($_FILES['module']['tmp_name'], '../../modules/')

      1. Hi,

        move_uploaded_file($_FILES['module']['tmp_name'], '../../modules/')

        Und das zweite soll ein *Datei*name sein ...?

        MfG ChrisB

        --
        The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
        1. Und das zweite soll ein *Datei*name sein ...?

          MfG ChrisB

          Wuste nicht das ich den datei namen noch dazu geben muss. Sieht jetzt so aus:
          move_uploaded_file($_FILES['module']['tmp_name'], '../modules/'.$_FILES['module']['name'])

          1. Moin!

            Möglicherweise öffnet Dir ein

            print "<pre>";  
            print_r ($_FILES);  
            die ("</pre>");  
            
            

            die Augen.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. Moin!

              Möglicherweise öffnet Dir ein

              print "<pre>";

              print_r ($_FILES);
              die ("</pre>");

              
              > die Augen.  
              >   
              >   
              > MFFG (Mit freundlich- friedfertigem Grinsen)  
              >   
              > fastix  
              >   
              
              Ne, was soll ich denn da sehn?
              
  2. Hi,

    Dazu verwende ich move_uploaded_file aber das gibt mir immer FALSE zurück. laut phpinfo() darf ich files uploaden. Auch $_FILES['error'] gibt 0 zurück.

    Wo kann ich noch nach der Fehlerquelle suchen?

    Bei den Berechtigungen im Dateisystem.

    Hast du das error_reporting auf E_ALL und display_errors auf 1 stehen?

    MfG ChrisB

    --
    The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
    1. Hast du das error_reporting auf E_ALL und display_errors auf 1 stehen?

      MfG ChrisB

      Nein, error_reporting ist 22527 und auf off. Wozu dient das? kannst du mir das kurz erklähren bevor ich es umstelle?

      MfG venty

      1. Hi,

        Hast du das error_reporting auf E_ALL und display_errors auf 1 stehen?

        Nein, error_reporting ist 22527 und auf off. Wozu dient das? kannst du mir das kurz erklähren bevor ich es umstelle?

        http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

        MfG ChrisB

        --
        The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
    2. Hast du das error_reporting auf E_ALL und display_errors auf 1 stehen?

      MfG ChrisB

      Also, habe die display_errors auf 1 gesetzt. Jetzt bekomme ich diese fehlermeldung:

      Notice: Undefined variable: replace in /home/venty/public_html/shop/backend/modules/install.php on line 40 Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44 Warning: move_uploaded_file(): Unable to move '/tmp/php9XIBK3' to '/home/venty/public_html/shop/backend/modules/start.sh' in /home/venty/public_html/shop/backend/modules/install.php on line 44 0

      Ich versuche mal das abzu arbeiten. Wäre aber nett wenn jemand das problem mit dem move_uploaded_file erklären könnte.

      MfG venty

      1. Hi!

        Mal ein bisschen vereinzeln ...

        Notice: Undefined variable: replace in /home/venty/public_html/shop/backend/modules/install.php on line 40

        Das ist eine Meldung, die von PHP üblicherweise verschwiegen wird. Du greifst auf eine Variable zu, die nicht existiert. Das kann harmlos sein, aber auch ein Hinweis auf einen Tippfehler oder ein logisches Problem mit dem Programmablauf. In der Regel ist es auch bei harmlos aussehenden Verwendungen günstig, dafür zu sorgen, dass eine Variable mit einem definierten Wert angelegt wird. Als register_globals noch per Default angeschaltet war, holte man sich mit so einer Unachtsamkeit eine potentielle Sicherheitslücke ins Script, weil nun jeder von außen Variablen mit beliebigen Werten versehen konnte.

        Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44
        Warning: move_uploaded_file(): Unable to move '/tmp/php9XIBK3' to '/home/venty/public_html/shop/backend/modules/start.sh' in /home/venty/public_html/shop/backend/modules/install.php on line 44 0

        Das sind die beiden Meldungen, die dein unmittelbares Problem betreffen. Die erste ist das eigentliche Problem, die zweite wird sich bei Beseitigung der Ursache mit der ersten auflösen. Die Kennung, unter der dein Script läuft, darf in das Zielverzeichnis nicht schreiben.

        Bist du sicher, dass du ausführbare Dateien über ein PHP-Script hochladen willst und solche sicherheitstechnisch bedenkliche Vorgänge nicht lieber über ein Administrator-Interface (z.B: FTP-Zugang) erledigen willst?

        Lo!

        1. Moin!

          Bist du sicher, dass du ausführbare Dateien über ein PHP-Script hochladen willst und solche sicherheitstechnisch bedenkliche Vorgänge nicht lieber über ein Administrator-Interface (z.B: FTP-Zugang) erledigen willst?

          Zusammen mit den Pfadangaben

          Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44

          und der Antwort aus  ?t=199433&m=1341951 komme ich darauf, dass der Frager gar nicht PHP kann und beim Versuch der Installation eines gewiss ganz tollen Modules für einen Fertig- Webshop scheitert.

          Dass das Modul ganz gewiss ganz toll ist ergibt sich aus:

          http://forum.de.selfhtml.org/my/?t=199433&m=1341951Notice: Undefined variable: replace in /home/venty/public_html/shop/backend/modules/install.php on line 40

          Um Deine Frage aus der Sicht eines Dritten zu beantworten: Der Frager weiß nicht was er tut. Wie soll er da sicher sein?

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Moin!

            Bist du sicher, dass du ausführbare Dateien über ein PHP-Script hochladen willst und solche sicherheitstechnisch bedenkliche Vorgänge nicht lieber über ein Administrator-Interface (z.B: FTP-Zugang) erledigen willst?

            Zusammen mit den Pfadangaben

            Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44

            und der Antwort aus  ?t=199433&m=1341951 komme ich darauf, dass der Frager gar nicht PHP kann und beim Versuch der Installation eines gewiss ganz tollen Modules für einen Fertig- Webshop scheitert.

            Dass das Modul ganz gewiss ganz toll ist ergibt sich aus:

            http://forum.de.selfhtml.org/my/?t=199433&m=1341951Notice: Undefined variable: replace in /home/venty/public_html/shop/backend/modules/install.php on line 40

            Um Deine Frage aus der Sicht eines Dritten zu beantworten: Der Frager weiß nicht was er tut. Wie soll er da sicher sein?

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            Tja auch wenn das ganz lustig klingt, stimmt das so nicht ;)

            Ich kann sehr wohl php und ich versuche ein kleines cms zu programmieren das genau auf die Anforderungen einer kleinen vorarlberger Firma passt.

            Da ich dies als gute herausforderung sah und sowieso irgendwann einmal in richtung cms entwicklung gehen will, habe ich den job angenommen und versuche nun mein glück :)

            Ja ich will ausführbare Scripte hochladen können. Allerdings werden das nur php-Scripte sein. Das bash-Script aus dem beispiel war nur ein test.

            Kann mir nun bitte jemand sagen wie ich die datei von /tmp in dem module ordner meines cms (im public_html) verschieben kann.

            MfG venty

            1. BTW: Außer der $_FILES['filename']['error'] bekomme ich nur 0 zurück ...

              Ich weiß also nicht was der comment von fastix soll :S

              1. BTW: Außer der $_FILES['filename']['error'] bekomme ich nur 0 zurück ...

                Ich weiß also nicht was der comment von fastix soll :S

                korrektur: Außer der $_FILES['filemane']['error'] ist der rest ja uninterresant und das error-Feld gibt nur 0 zurück.

                Sry

                1. Moin!

                  Ich weiß also nicht was der comment von fastix soll :S

                  korrektur: Außer der $_FILES['filemane']['error'] ist der rest ja uninterresant und das error-Feld gibt nur 0 zurück.

                  Hm. An anderer Stelle hast Du was von

                  move_uploaded_file($_FILES['module']['tmp_name'], '../../modules/')

                  geschrieben. Irgendwelche Daten scheinen hier nicht korrekt.

                  2. Dein Rechteproblem:

                  Der Ordner gehört "www-data", der owner "www-data" hat Schreibrechte am Verzeichnis. Das klingt nach idealen Voraussetzungen dafür, dass der Benutzer "www-data" Dateien anlegt. Die Fehlermeldung "failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php" sagt aber, es sei verboten.

                  Entweder prüfst Du also ob wirklich "www-data" die Datei anzulegen versucht oder Du vergibst die Rechte mit 0777, so dass wirklich jeder mal kann.

                  Sry

                  MFFG (Mit freundlich- friedfertigem Grinsen)

                  fastix

                  1. Ich weiß also nicht was der comment von fastix soll :S

                    korrektur: Außer der $_FILES['filemane']['error'] ist der rest ja uninterresant und das error-Feld gibt nur 0 zurück.

                    Hm. An anderer Stelle hast Du was von

                    move_uploaded_file($_FILES['module']['tmp_name'], '../../modules/')

                    geschrieben. Irgendwelche Daten scheinen hier nicht korrekt.

                    Ich wollte es veralgemeinert darstellen wie in der php-documentation. Da heißt es glaube ich userfile oder so. Das Feld heist eigentlich 'module'.

                    1. Dein Rechteproblem:

                    Der Ordner gehört "www-data", der owner "www-data" hat Schreibrechte am Verzeichnis. Das klingt nach idealen Voraussetzungen dafür, dass der Benutzer "www-data" Dateien anlegt. Die Fehlermeldung "failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php" sagt aber, es sei verboten.

                    Entweder prüfst Du also ob wirklich "www-data" die Datei anzulegen versucht oder Du vergibst die Rechte mit 0777, so dass wirklich jeder mal kann.

                    nach dem vergeben von 'chmod a+w modules/' hat es funktioniert. Wiso den aber das? Apache führt laut phpinfo() die scripts doch als www-data aus? Und www-data gehört da schon alles und ich (benutzer: venty) gehöre auch der gruppe www-data an ...

                    Ich kenn mich garnicht mehr aus :S

                    1. Hi!

                      nach dem vergeben von 'chmod a+w modules/' hat es funktioniert. Wiso den aber das? Apache führt laut phpinfo() die scripts doch als www-data aus? Und www-data gehört da schon alles und ich (benutzer: venty) gehöre auch der gruppe www-data an ...

                      Unterscheide zwischen Benutzer- und Gruppennamen, auch wenn da teilweise die selben Werte verwendet werden. Wenn die Gruppe www-data die Benutzer www-data und venty beinhaltet, und die Gruppe www-data in einem Verzeichnis keine Gruppen-Schreibrechte hat, dann nützt dir da auch die Mitgliedschaft von venty in der Gruppe nichts.

                      Lo!

            2. 'ǝɯɐu$ ıɥ

              Kann mir nun bitte jemand sagen wie ich die datei von /tmp in dem module ordner meines cms (im public_html) verschieben kann.

              Versichere dich das dein Script schreibrechte in dem Ordner hat!

              ssnɹƃ
              ʍopɐɥs

              --
              I like children. If they're properly cooked.
              - W.C. Fields
              1. 'ǝɯɐu$ ıɥ

                Kann mir nun bitte jemand sagen wie ich die datei von /tmp in dem module ordner meines cms (im public_html) verschieben kann.

                Versichere dich das dein Script schreibrechte in dem Ordner hat!

                ssnɹƃ
                ʍopɐɥs

                alles in public_html gehört www-data, alles steht auf 755 aber es geht trozdem nicht :(

        2. Hi!

          Mal ein bisschen vereinzeln ...

          Notice: Undefined variable: replace in /home/venty/public_html/shop/backend/modules/install.php on line 40

          Das ist eine Meldung, die von PHP üblicherweise verschwiegen wird. Du greifst auf eine Variable zu, die nicht existiert. Das kann harmlos sein, aber auch ein Hinweis auf einen Tippfehler oder ein logisches Problem mit dem Programmablauf. In der Regel ist es auch bei harmlos aussehenden Verwendungen günstig, dafür zu sorgen, dass eine Variable mit einem definierten Wert angelegt wird. Als register_globals noch per Default angeschaltet war, holte man sich mit so einer Unachtsamkeit eine potentielle Sicherheitslücke ins Script, weil nun jeder von außen Variablen mit beliebigen Werten versehen konnte.

          Macht sinn. Danke :)

          Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44
          Warning: move_uploaded_file(): Unable to move '/tmp/php9XIBK3' to '/home/venty/public_html/shop/backend/modules/start.sh' in /home/venty/public_html/shop/backend/modules/install.php on line 44 0

          Das sind die beiden Meldungen, die dein unmittelbares Problem betreffen. Die erste ist das eigentliche Problem, die zweite wird sich bei Beseitigung der Ursache mit der ersten auflösen. Die Kennung, unter der dein Script läuft, darf in das Zielverzeichnis nicht schreiben.

          Also der ordner public_html gehört der gruppe www-data und hat die dateirechte 755 das betrifft auch alle unterordner. :S

          1. Hi!

            Bitte zitiere nur konkret die Stellen auf die du dich beziehst und nicht das gesamte Posting. Danke.

            Warning: move_uploaded_file(/home/venty/public_html/shop/backend/modules/start.sh): failed to open stream: Permission denied in /home/venty/public_html/shop/backend/modules/install.php on line 44
            Also der ordner public_html gehört der gruppe www-data und hat die dateirechte 755 das betrifft auch alle unterordner. :S

            Also, einer von euch beiden sagt hier nicht die Wahrheit und nach meiner Erfahrung war bisher immer PHP im Recht. Schreibrechte brauchst du nur in modules/. Die Verzeichnisse davor müssen nur les- und ausführbar sein (wobei man, ich glaube Lesen, nicht unbedingt braucht, aber das nur in seltenen Fällen so haben will). Für die Rechte interessiert neben den Besitzverhältnissen auch noch, wer man selbst ist. Ansonsten kann man die Rechtelage nur eingeschränkt interpretieren. Wenn dir phpinfo() keine Auskunft über den Ausführenden deiner Scripts geben kann, kannst du mit touch() einen Eintrag im /tmp erzeugen - das sollte für alle schreibbar sein - und dann nachschauen, wer der Besitzer ist.

            Lo!

            1. Also, einer von euch beiden sagt hier nicht die Wahrheit und nach meiner Erfahrung war bisher immer PHP im Recht. Schreibrechte brauchst du nur in modules/. Die Verzeichnisse davor müssen nur chles- und ausführbar sein (wobei man, ich glaube Lesen, nicht unbedingt braucht, aber das nur in seltenen Fällen so haben will). Für die Rechte interessiert neben den Besitzverhältnissen auch noch, wer man selbst ist. Ansonsten kann man die Rechtelage nur eingeschränkt interpretieren. Wenn dir phpinfo() keine Auskunft über den Ausführenden deiner Scripts geben kann, kannst du mit touch() einen Eintrag im /tmp erzeugen - das sollte für alle schreibbar sein - und dann nachschauen, wer der Besitzer ist.

              Lo!

              drwxr-xr-x 2 venty www-data 4096 2010-07-25 16:17 modules/

              stimmt doch oder?

              was heißt chles- ?

              phpinfo() sagt: User/Group: www-data(33)/33

              wenn ich in /tmp die datei test erstelle, gibt mir ls -l folgendes:
              -rw-r--r--  1 venty venty    0 2010-07-31 15:36 test

              MfG Venty

              1. Hi!

                drwxr-xr-x 2 venty www-data 4096 2010-07-25 16:17 modules/
                stimmt doch oder?

                Besitzer venty, Gruppe www-data. Nur venty darf schreiben.

                was heißt chles- ?

                Da ist das "ch" zu viel, "lesbar" sollte das insgesamt werden.

                phpinfo() sagt: User/Group: www-data(33)/33

                PHP-Script werden also vom Benutzer www-data mit der Gruppe 33 (vermutlich ebenfalls www-data, siehe /etc/group) ausgeführt. www-data ist vermutlich nicht venty (oder hat venty auch die uid 33?) und andere dürfen nicht schreiben.

                wenn ich in /tmp die datei test erstelle, gibt mir ls -l folgendes:
                -rw-r--r--  1 venty venty    0 2010-07-31 15:36 test

                Wenn du mit "ich" ein PHP-Script meinst, dann müsste das passen, widerspricht aber der phpinfo()-Ausgabe. Wenn du aber damit meinst, touch zu Fuß am (bash-)Prompt ausgeführt zu haben, dann ist diese Information für PHP-Scripte im Apachen belanglos. Den Versuch müsstest du dann mit einem PHP-Script wiederholen.

                Lo!