Athos99, PHP et développement WEB

Un site consacré au développement web en php

Upload de fichier en PHP avec curl

Date: 
12 sep 2015

Avec l'extension curl de php, il est possible de transmettre le contenu d'un fichier (upload) à un serveur ou service web, mais attention il peut y avoir un bug qui peut se reveler une faille de sécurité.

Pour réaliser un upload, on "simule" la transmission d'un formulaire html de type POST, en se basant sur le nom du champ contenu dans la balise html de type file.

Exemple de formulaire

<form action="http://php.athos99.com/upload.php" method="post" enctype="multipart/form-data">
File:
<input type="file" name="uploadfile" />
<input type="submit" value="Send" />
</form>

Dans notre cas, c'est "uploadfile"

Exemple d'envoi de fichier en utilisant curl

Si on veut uploader le fichier en se basant sur l'exemple du formulaire ci-dessus, on peut utiliser le simple exemple de code en php suivant.

 $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, 'http://php.athos99.com/upload.php');
    curl_setopt($ch, CURLOPT_POST, true);
    // same as <input type="file" name="uplaodfile" />
    $post = array(
        'uploadfile'=>'@c:/path/to/myfile.txt'
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $response = curl_exec($ch);

La variable de type tableau $post, contient comme clé "uploadfile" (nom du champ du formulaire) et comme valeur le nom complet du fichier à transmettre.

Bug

CURL du php fournit le chemin et le nom du fichier ce qui est différent d'un browser qui donne seulement le nom du fichier. Cela peut être une faille de sécurité (le serveur distant peut connaître la structure de vos répertoires) et provoquer des erreurs sur le serveur distant qui traitera mal le nom du fichier. Il est possible de corriger ce défaut en spécifiant un nom de fichier. Pour cela, il suffit d'ajouter l'indication filename=myfile.txt au nom du fichier comme suit.

 $post = array(
        'uploadfile'=>'@c:/path/to/myfile.txt;filename=myfile.txt'
    );

Il est aussi possible de préciser le type du contenu du fichier

 $post = array(
        'uploadfile'=>'@c:/path/to/myfile.txt;filename=myfile.txt;type=text/plain'
    );

 

Rubrique: 
PHP
Tags: 
curl
bug
sécurité
upload