PHP Unconference Europe 2015

Utilisation des fichiers à distance

Aussi longtemps que le support des gestionnaires d'URL ("URL fopen wrapper") est activé dans le php.ini, avec l'option allow_url_fopen , vous pouvez utiliser des URL (HTTP et FTP) avec la majorité des fonctions qui utilisent un nom de fichier comme paramètre. Cela inclut notamment include, include_once, require et require_once (depuis PHP 5.2.0, allow_url_include doit être actif pour les utiliser). Reportez-vous à Liste des protocoles et des gestionnaires supportés pour plus d'informations sur les protocoles supportés par PHP.

Par exemple, vous pouvez suivre l'exemple suivant pour ouvrir un fichier sur un serveur web distant, analyser les résultats pour extraire les informations dont vous avez besoin, et ensuite l'utiliser dans une requête de base de données, ou simplement éditer les informations dans le style de votre site.

Exemple #1 Connaître le titre d'une page distante

<?php
$file 
fopen ("http://www.example.com/""r");
if (!
$file) {
  echo 
"<p>Impossible de lire la page.\n";
  exit;
}
while (!
feof ($file)) {
    
$line fgets ($file1024);
    
/* Cela ne fonctionne que si les balises Title sont correctement utilisées */
    
if (preg_match ("@\<title\>(.*)\</title\>@i"$line$out)) {
        
$title $out[1];
        break;
    }
}
fclose($file);
?>

Vous pouvez aussi écrire des fichiers sur un serveur FTP aussi longtemps que vous êtes connecté avec un utilisateur ayant les bons droits d'accès, alors que le fichier n'existait pas encore.

Pour vous connecter avec un utilisateur autre qu'anonyme, vous devez spécifier un nom d'utilisateur (et certainement le mot de passe) dans l'URL, comme ftp://user:password@ftp.example.com/path/to/file. (Vous pouvez utiliser le même type de syntaxe pour accéder aux fichiers via HTTP lorsqu'ils nécessitent une identification simple).

Exemple #2 Stocker des données sur un serveur distant

<?php
$file 
fopen ("ftp://ftp.example.com/incoming/outputfile""w");
if (!
$file) {
  echo 
"<p>Impossible d'ouvrir le fichier distant pour écriture.\n";
  exit;
}
/* Ecriture des données. */
fputs ($file$_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>

Note:

Remarque : vous pouvez avoir l'idée, à partir de l'exemple ci-dessus, d'utiliser la même technique pour écrire sur un log distant, mais comme mentionné ci-dessus vous ne pouvez qu'écrire sur un nouveau fichier en utilisant les fonctions fopen() avec une URL. Pour faire des log distribués, nous vous conseillons de regarder la partie syslog().

add a note add a note

User Contributed Notes 2 notes

up
4
slva dot web dot sit at gmail dot com
11 months ago
If  allow_url_fopen is disabled in php.ini you can use CURL function for check file exist:

<?php
$ch
= curl_init("http://www.example.com/favicon.ico");

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);
?>
up
-13
heck at fas dot harvard dot edu
10 years ago
The previous post is part right, part wrong. It's part right because it's true that the php script will run on the remote server, if it's capable of interpreting php scripts. You can see this by creating this script on a remote machine:
<?php
echo system("hostname");
?>
Then include that in a php file on your local machine. When you view it in a browser, you'll see the hostname of the remote machine.

However, that does not mean there are no security worries here. Just try replacing the previous script with this one:
<?php
echo "<?php system(\"hostname\"); ?>";
?>
I'm guessing you can figure out what that's gonna do.

So yes, remote includes can be a major security problem.
To Top