Prześlij DOC lub PDF za pomocą PHP

Jestem w stanie załadować obrazy dobrze, ale kiedy zmieniam typy Z image / jpg, image / gif na application / msword I application / pdf, to nie działa. Oto Mój kod. Ten sam kod działa dla obrazów, ale w przypadku przesyłania dokumentów i pdf wyświetla " Nieprawidłowy plik."Co tu się dzieje? Mój plik ma tylko około 30kb i jest dobrze poniżej limitu rozmiaru pliku tutaj.

$allowedExts = array("pdf", "doc", "docx"); 
$extension = end(explode(".", $_FILES["file"]["name"]));

if ( ( ($_FILES["file"]["type"] == "application/msword") || ($_FILES["file"]["type"] == "text/pdf") ) 
&& ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
{      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
}
else
{
echo "Invalid file."
}
Author: user961627, 2012-07-22

6 answers

Nie używaj parametru ['type'] do walidacji przesyłanych plików. To pole jest dostarczane przez użytkownika i może być trywialnie sfałszowane, umożliwiając przesyłanie dowolnego typu pliku. To samo dotyczy parametru ['name'] - jest to nazwa pliku podana przez użytkownika. Jest to również trywialne, więc użytkownik wysyła nastyvirus.exe i nazywa go cutekittens.jpg.

Prawidłową metodą walidacji przesyłanych plików jest użycie określenia typu MIME po stronie serwera, np. poprzez fileinfo , plus odpowiednie udane przesyłanie sprawdzanie, czego nie:

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    die("Upload failed with error " . $_FILES['file']['error']);
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$ok = false;
switch ($mime) {
   case 'image/jpeg':
   case 'application/pdf'
   case etc....
        $ok = true;
   default:
       die("Unknown/not permitted file type");
}
move_uploaded_file(...);

Używasz również nazwy pliku podanej przez użytkownika jako części końcowego miejsca docelowego plików move_uploaded_files. jest również trywialne osadzanie danych ścieżek w nazwie pliku, które następnie ślepo używasz. Oznacza to, że złośliwy zdalny użytkownik może bazgrolić na dowolnym pliku na serwerze, do którego zna ścieżkę, a także instalować nowe pliki.

 34
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-22 15:17:17

Proszę dodać poprawne typy mime do kodu-przynajmniej te:

.jpeg -> image/jpeg
.gif  -> image/gif
.png  -> image/png

Listę typów mime można znaleźć tutaj .

Ponadto, uprość logikę kodu i zgłoś numer błędu, aby pomóc obsłudze pierwszego poziomu wytropić problemy:

$allowedExts = array(
  "pdf", 
  "doc", 
  "docx"
); 

$allowedMimeTypes = array( 
  'application/msword',
  'text/pdf',
  'image/gif',
  'image/jpeg',
  'image/png'
);

$extension = end(explode(".", $_FILES["file"]["name"]));

if ( 20000 < $_FILES["file"]["size"]  ) {
  die( 'Please provide a smaller file [E/1].' );
}

if ( ! ( in_array($extension, $allowedExts ) ) ) {
  die('Please provide another file type [E/2].');
}

if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) ) 
{      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
}
else
{
die('Please provide another file type [E/3].');
}
 7
Author: SteAp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-18 21:55:56
$folder = "Resume/";
$temp = explode(".", $_FILES["uploaded"]["name"]);
$newfilename = round(microtime(true)).'.'. end($temp);
$db_path ="$folder".$newfilename  ;
//remove the .
$listtype = array(
'.doc'=>'application/msword',
'.docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.rtf'=>'application/rtf',
'.pdf'=>'application/pdf'); 
if ( is_uploaded_file( $_FILES['uploaded']['tmp_name'] ) )
{
if($key = array_search($_FILES['uploaded']['type'],$listtype))
{if (move_uploaded_file($_FILES['uploaded']  ['tmp_name'],"$folder".$newfilename))
{
include('connection.php');
$sql ="INSERT INTO tb_upload
(filePath) VALUES ('$db_path')";
}
}
else    
{
echo "File Type Should Be .Docx or .Pdf or .Rtf Or .Doc";
}
 5
Author: Deepak Kr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 15:09:22

Jeden z twoich warunków zawodzi. Sprawdź wartość mime-type dla swoich plików.
Spróbuj użyć aplikacji / pdf, a nie tekstu / pdf. Zobacz właściwy typ nośnika MIME dla plików PDF

 2
Author: Anirudh Ramanathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:22

Możesz użyć

$_FILES['filename']['error'];

Jeśli wystąpi jakikolwiek typ błędu, to zwraca 'error' else 1,2,3,4 lub 1 jeśli zrobione

1: jeśli Rozmiar pliku przekracza limit .... Możesz znaleźć inne opcje przez googling

 1
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 01:43:16

Dla application / msword I application / vnd. ms-excel, kiedy usunąłem ograniczenie rozmiaru:

($_FILES["file"]["size"] < 20000)

...zadziałało ok.

 -1
Author: Turcko007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 16:00:42