2016-06-25 10 views
3

Ich versuche derzeit, die cURL-Programmdatei zu verwenden, um mp4-Dateien mithilfe der POST-Methode in ein PHP-Skript hochzuladen. In der PHP-Datei überprüfe ich das Dateiformat und all diese Sachen. Hier ist die PHP-Datei:cURL Hochladen von Datei nach PHP

<?php 

$allowedExts = array("jpg", "jpeg", "gif", "png", "mp3", "mp4", "wma"); 
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); 

if (($_FILES["file"]["type"] == "video/mp4") && ($_FILES["file"]["size"] < 2000000) && in_array($extension, $allowedExts)) { 
    if ($_FILES["file"]["error"] > 0) { 
     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } else { 
     echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
     echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
     echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 

     if (file_exists("upload/" . $_FILES["file"]["name"])) { 
      echo $_FILES["file"]["name"] . " already exists. "; 
     } else { 
      move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
     } 
    } 
} else { 
    echo "Invalid file"; 
} 
?> 

Wenn ich Dateien laden ein normaler HTML-Formular es richtig funktioniert. Dies ist das HTML-Formular i verwendet:

<!DOCTYPE html> 

<head> 
    <title></title> 
</head> 

<body> 

    <form action="upload_file.php" method="post" enctype="multipart/form-data" name="uploadedfile"> 
     <label for="file"><span>Filename:</span></label> 
     <input type="file" name="file" id="file" /> 
     <br /> 
     <input type="submit" name="submit" value="Submit" /> 
    </form> 
</body> 
</html> 

Aber wenn ich es jetzt versuchen, den cURL-Client mit diesem Befehl:

"-F [email protected] http://localhost:1337/upload_file.php curl"

Es zeigt mir in der Konsole "Ungültige Datei" an, die normalerweise angezeigt wird, wenn die Datei nicht mit den Attributen übereinstimmt, die PHP überprüft (zum Beispiel passt sie nicht zum Dateityp).

Ich hoffe ihr versteht mein Problem und könnt mir helfen! :)

Greets Steven

+1

Also ... haben Sie Debugging durchgeführt? Welche der Bedingungen in 'if (($ _FILES [" Datei "] [" Typ "] ==" video/mp4 ") && ($ _FILES [" Datei "] [" Größe "] <2000000) && in_array ($ Erweiterung, $ allowedExts)) 'scheitert? – melpomene

+0

Nun, das ist der Punkt, in der Regel sollte keiner von ihnen fehlschlagen, seit wenn ich die gleiche Datei über das HTML-Formular hochladen, funktioniert es richtig. – GeeHopper

Antwort

1

Ihre $_FILES["file"]["type"] Prüfung fehlschlägt, weil cURL keine Vermutungen der Art machen und wird nicht automatisch in der POST-Anforderung senden.

Dies ist leicht gefälscht, so ist es sowieso kein großer Scheck.

Aber Ihr Beispiel funktioniert, versuchen Sie den Inhaltstyp mit dem Datei Parameter angeben:

curl -F [email protected];type=video/mp4 http://localhost:1337/upload_file.php 
+0

Es hat funktioniert, vielen Dank! :) Darf ich fragen, was Sie mit "leicht gefälscht" meinen? Bedeutet das, dass Leute immer noch keine MP4-Dateien auf den Server hochladen können, während sie dieses Skript benutzen? – GeeHopper

+1

Da es keine Überprüfung des tatsächlichen Dateiinhalts gibt, könnte ich PHP in eine .mp4-Datei einfügen, den Inhaltstyp (wie wir es in der cURL-Anfrage oben getan haben) vortäuschen und es zum Hochladen bringen. Es ist jedoch immer noch nicht möglich, die Datei aufgrund der Erweiterung als PHP-Code auszuführen. 'curl -F Datei [email protected]; type = was auch immer/ich-will ...' = leicht verarscht – drew010

+0

Oh, jetzt verstehe ich vielen Dank für den Tipp! :) – GeeHopper

1

Weitere, was drew010 schrieb (Ich habe einen Kommentar schreiben würde, aber nicht über den Ruf noch) nicht, Das Vertrauen in diese Werte kann ein Sicherheitsrisiko darstellen und wurde verwendet, um Websites in der Vergangenheit zu hacken, seien Sie also vorsichtig.

+0

Danke für den Tipp, aber was meinst du damit? Bedeutet das, dass Leute immer noch keine mp4-Dateien auf den Server hochladen können? – GeeHopper

+1

Nun, Sie überprüfen die Erweiterung, die auch hilft, aber es hängt alles davon ab, wie das Betriebssystem oder andere Software die Dateien auch behandelt. Ich glaube, ich habe gehört, PHP als Bild/PNG hochgeladen (wo Bild/* war erlaubt) und der Server wurde auch so konfiguriert, dass das Bild Upload-Verzeichnis PHP-Skripte (nicht ungewöhnlich) haben könnte. –

+1

Aber um Ihre Frage zu beantworten, ja, die Leute werden in der Lage sein, Nicht-MP4-Dateien auf den Server zu laden, so dass Sie das Risiko einschätzen wollen. –