Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Datei upload auf Server mittels PHP und HTTP-Post

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Datei upload auf Server mittels PHP und HTTP-Post

    Hallo,

    ich möchte mittels Http post eine Datei auf meinen Server laden. Folgendes Skript habe ich geschrieben:
    PHP-Code:
    <?php
    $filetoupload 
    $_POST['filetoupload'];

    $uploaddir '/uploads/';
    $uploadfile $uploaddir basename($_FILES[$filetoupload]['name']);


    echo 
    '<pre>';
    if (
    move_uploaded_file($_FILES[$filetoupload]['tmp_name'], $uploadfile)) {
        echo 
    "Datei ist valide und wurde erfolgreich hochgeladen.\n";
    } else {
        echo 
    "Möglicherweise eine Dateiupload-Attacke!\n";
    }

    echo 
    'Weitere Debugging Informationen:';
    print_r($_FILES);

    print 
    "</pre>";

    ?>
    Ich hab es aus einem online-PHP-Tutorial kopiert und ein wenig angepasst. Ich erhalte jedoch die Ausgabe im Fehlerfall, also "Möglicherweise eine Dateiupload-Attacke!".
    Ich habe über http post den absoluten Pfad der Datei auf meinem System angegeben. Dieser wird korrekt an das Skript weitergegeben.

    Also meine Frage: Welche Ursachen kann es haben, dass diese Datei nicht hochgeladen wird und das Skript einen Fehler meldet? (Die Datei ist wenig 15 Bytes groß)

    Danke


  • #2
    Wenn filename keine gültige Datei ist, wird keine Aktion ausgeführt, und move_uploaded_file() gibt FALSE zurück.

    Wenn filename eine gültige Datei ist, jedoch aus irgendeinem Grund nicht verschoben werden kann, wird keine Aktion ausgeführt, und move_uploaded_file() gibt FALSE zurück.
    http://php.net/manual/de/function.mo...oaded-file.php

    Als möglichen Angriff zu werten, wenn deine If-Abfrage den Else-Zweig ausführt, ist demnach nicht korrekt.

    Zu deiner Frage: Überprüfe, nach ob das Form über die korrekten Attribute verfügt. (Sollte allerdings vermutlich bereits der Fall sein.)
    Code:
    <form action="..." method="post" enctype="multipart/form-data">
    Außerdem könnte ich mir vorstellen, dass der Pfad aus $uploadfile nicht gültig ist. Du solltest __DIR__ davor setzen und ihn dann ggf. anpassen:
    Code:
    $uploadfile = __DIR__ . $uploaddir . basename($_FILES[$filetoupload]['name']);

    EDIT:

    PHP-Code:
    $filetoupload $_POST['filetoupload']; 
    Das geht nicht. Die Datei-Infos befinden sich nicht im $_POST-Array sondern ausschlielich im $_FILES-Array. Mach es doch so wie in der Doku... $_FILES['filetoupload'] um auf den Upload des Form-Fields 'filetoupload' zuzugreifen.

    Kommentar


    • #3
      Ok, danke.

      Das mit der Dateiupload-Attacke habe ich hier her:
      http://php.net/manual/de/features.fi...ost-method.php

      Meine "Anfrageseite" ist ein Java-Programm:
      Code:
      	private void uploadFile(File f) {
      		DefaultHttpClient httpclient = new DefaultHttpClient();
      	    HttpPost httppost = new HttpPost("http://www.myhost.de/upload.php");
      	    try {
      	        // Add your data 
      	        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
      	        nameValuePairs.add(new BasicNameValuePair("username","A"));
      	        nameValuePairs.add(new BasicNameValuePair("passwort","B"));
      	        nameValuePairs.add(new BasicNameValuePair("filetoupload",f.getAbsolutePath()));
      
      	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
      
      	        // Execute HTTP Post Request
      	        HttpResponse response = httpclient.execute(httppost);
      	        ByteArrayOutputStream out = new ByteArrayOutputStream();
      	        response.getEntity().writeTo(out);
      	        out.close();
      
      		        String responseString = out.toString();
      		        System.out.println(responseString);
      	        
      	    } catch (ClientProtocolException e) {
      	    	e.printStackTrace();
      	    } catch (IOException e) {
      	        e.printStackTrace();
      	    } catch (IllegalStateException e) {
      	    	e.printStackTrace();
      	    }  
      	}
      EDIT: Hab den korrekten Java-Code gefunden:
      http://stackoverflow.com/questions/1...php-strange-pr

      Kommentar


      • #4
        Der Upload funktioniert nun fast immer. Bei manchen Dateien allerdings nicht, ich erhalte als Ausgabe:
        Code:
        Dateiname: 100_2751.jpg.enc<pre>Möglicherweise eine Dateiupload-Attacke!
        Weitere Debugging Informationen:Array
        (
            [file] => Array
                (
                    [name] => 100_2751.jpg.enc
                    [type] => 
                    [tmp_name] => 
                    [error] => 1
                    [size] => 0
                )
        
        )
        Sagt mir das was ? Und woran kann es liegen? (Die Datei ist kleiner als 3MB.) Ich nutze nun folgendes Uploadskript:
        PHP-Code:
        <?php
        $uploaddir 
        'Uploads/Test/';
        $uploadfile $uploaddir basename($_FILES['file']['name']);

        echo 
        $filetoupload;
        echo 
        "\nDateiname: ".$_FILES['file']['name']."\n";

        if(
        $_FILES['file']['size'] < 3000000) {
            echo 
        '<pre>';
            if (
        move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
                 echo 
        "Datei ist valide und wurde erfolgreich hochgeladen.\n";
            } else {
                 echo 
        "Möglicherweise eine Dateiupload-Attacke!\n";
            }

            echo 
        'Weitere Debugging Informationen:';
            
        print_r($_FILES);

            print 
        "</pre>";
        } else {
            echo 
        'Datei ist zu groß! (>= 3 MB)';
        }
        ?>
        Danke!

        Kommentar


        • #5
          Gut, man sollte erst das Manual lesen und dann posten. Sorry .

          EDIT: Doch nicht erledigt .
          Denn meine php.ini-Einstellungen sagen, dass "upload_max_filesize = 40M" ist.

          Kommentar


          • #6
            So, nach ein wenig rumklicken auf der Weboberfläche meines Serveranbieters hat sich herausgestellt, dass ich dem tollen Interface zum Opfer gefallen bin, das diesen Wert von 40M ausgab. Tatsächlich war in der php.ini gar nichts dazu eingetragen.

            Kommentar


            • #7
              Uhm gibt es aktuell eine Frage/Problem oder so?
              Relax, you're doing fine.
              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

              Kommentar


              • #8
                Ja, deine.

                Kommentar

                Lädt...
                X