PHP 5.6.0beta1 released

Usando archivos remotos

Siempre que allow_url_fopen este habilitado en php.ini, se pueden usar URLs HTTP y FTP con la mayoría de las funciones que toman un nombre de archivo como parámetro. Además, las URLs pueden ser usadas con las declaraciones include, include_once, require y require_once (desde PHP 5.2.0, allow_url_include debe ser habilitado para esto). Ver Protocolos y Envolturas soportados para más información de los protocolos soportados por PHP.

Nota:

En PHP 4.0.3 y anteriores, con el fin de usar capas de URL, se requirió de configurar PHP usando la opción de configuración --enable-url-fopen-wrapper .

Nota:

Las versiones Windows de PHP más nuevas a la PHP 4.3 no soportan acceso remoto a los archivos por las siguientes funciones: include, include_once, require, require_once, y las funciones imagecreatefromXXX en la extensión Funciones de GD e Imágenes

Por ejemplo, se puede usar esto para abrir un archivo en un web server remoto, analizar la salida de los datos que se quieren, y entonces usar esos datos en una consulta a la base de datos, o simplemente para mostrarlos en un estilo que coincida con el resto del sitio web.

Ejemplo #1 Obteniendo el titulo de una página remota

<?php
$file 
fopen ("http://www.example.com/""r");
if (!
$file) {
    echo 
"<p>Imposible abrir el archivo remoto.\n";
    exit;
}
while (!
feof ($file)) {
    
$line fgets ($file1024);
    
/* Esto solo trabaja si el titulo y sus tags estan en una línea */
    
if (preg_match ("@\<title\>(.*)\</title\>@i"$line$out)) {
        
$title $out[1];
        break;
    }
}
fclose($file);
?>

También se pueden escribir archivos en un servidor FTP (considerando que se esta conectado como un usuario con los permisos de acceso correctos). Se pueden crear únicamente archivos nuevos usando este método. Si se intenta sobreescribir un archivo que ya existe, la llamada a la función fopen() fallará.

Para conectarse como un usuario diferente a 'anonymous', se necesita especificar el usuario (y posiblemente el password) con la URL, tal como 'ftp://user:password@ftp.example.com/path/to/file'. (Se puede usar la misma sintaxis para accesar archivos vía HTTP cuando se requiere autenticación básica).

Ejemplo #2 Almacenando datos en un servidor remoto

<?php
$file 
fopen ("ftp://ftp.example.com/incoming/outputfile""w");
if (!
$file) {
    echo 
"<p>Imposible abrir el archivo remoto para escritura.\n";
    exit;
}
/* Escribir los datos aqui. */
fwrite ($file$_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>

Nota:

Se podría tener la idea del ejemplo anterior que se esta usando esta técnica para escribir un archivo de log remoto. Desafortunadamente esto no funcionaría porque la función fopen() llamada fallará si el archivo remoto ya existe. Para hacer logs distribuidos como ese, se debería dar un vistazo a syslog().

add a note add a note

User Contributed Notes 2 notes

up
4
slva dot web dot sit at gmail dot com
4 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
-8
heck at fas dot harvard dot edu
9 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