1
votes

Est-il sûr d'utiliser fopen pour effectuer une cURL avec le téléchargement de fichiers?

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?


0 commentaires

3 Réponses :


0
votes

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).


0 commentaires

0
votes

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.


0 commentaires

0
votes

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');


0 commentaires