J'ai actuellement un formulaire de téléchargement, qui envoie le fichier à Dropbox, via son API. Le .php qui reçoit le fichier après avoir effectué une cURL est le suivant:
$localFile = $_FILES["file_key"]['tmp_name']; $fp = fopen($localFile, 'r'); $ch = curl_init(); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_URL, 'https://content.dropboxapi.com/2/files/upload'); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "authorization: Bearer MY-TOKEN", "content-type: application/octet-stream", "dropbox-api-arg: {\"path\": \"/tmp/a.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}" )); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_NOPROGRESS, false); curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile)); curl_exec ($ch);
Cela fonctionne parfaitement, mais j'ai été troublé par le fopen
dans la deuxième ligne. Est-ce une mauvaise pratique? Même en mode "lecture seule", puis-je recevoir un fichier malveillant et avoir mon système en panne?
3 Réponses :
C'est parfaitement sûr. PHP les lit comme des données pures, il n'essaye pas de les exécuter. curl
le transmettra simplement à l'API DropBox. À ce stade, c'est le problème de DropBox (et il serait assez surprenant qu'ils exécutent du code que les utilisateurs téléchargent, à moins d'avoir une faille de sécurité sérieuse).
Oui, c'est sûr si vous utilisez le mode lecture seule, puisque le fichier n'est pas en cours d'exécution, le contenu est juste en cours de lecture.
c'est la bonne façon de le faire si vous êtes sous Linux ou MacOS * ou * BSD et que vous ne vous souciez pas de la compatibilité Windows, mais je veux quand même choisir votre code:
si vous en écrivez un code qui peut fonctionner sur Windows, prenez l'habitude d'utiliser le mode fopen rb
au lieu de r
, car le mode fopen r
sur Windows peut corrompre les données binaires (et en passant par votre en-tête octet-stream
, ce sont des données binaires) et linux / macos / * BSD traitent tous les modes r
et rb
de la même manière façon, alors faites-le
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "authorization: Bearer MY-TOKEN", "content-type: application/octet-stream", "dropbox-api-arg: " . json_encode(array( 'path' => '/tmp/a.txt', 'mode' => 'add', 'autorename' => true, 'mute' => false, 'strict_conflict' => false, )) ));
et cette ligne
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "authorization: Bearer MY-TOKEN", "content-type: application/octet-stream", "dropbox-api-arg: {\"path\": \"/tmp/a.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}" ));
devrait en fait lire
$fp = fopen($localFile, 'rb');