domingo, 23 de enero de 2011

file_get_contents vs curl

A más de uno os habrá pasado que su servidor emite un warning al usar file_get_contents("URL_EXTERNA"), y es que esta función interna de PHP, expone una vulnerabilidad a la seguridad de tu aplicación web, en PHP 5 no es posible cambiar el valor de esta a on en .htaccess, tendrías que tener acceso al php.ini del servidor.
La vulnerabilidad trabaja de la siguiente manera:
_ Al usar esta función para recuperar datos desde ubicaciones remotas como un servidor FTP o sitio web y no hacer el filtro apropiado al pasar los datos, dejas abierta tu aplicación a una muy posible inyección de código.

Recomendaciones

Usted debe desactivar allow_url_fopen en el archivo php.ini:

Deshabilitar allow_url_fopen por razones de seguridad
allow_url_fopen = 'off'

Esta configuración tambien debe ser deshabilitada en apache httpd.conf

# Deshabilitar allow_url_fopen por razones de seguridad
php_flag allow_url_fopen off php_flag allow_url_fopen off


Te quedan 2 cosas por hacer:
1) O habilitas file_get_contents en el servidor con su consiguiente vulnerabilidad.
2) O usas CURL o HTTP, para acceder a contenidos de URL externa.

Recomiendo usar CURL por estas razones:
1) Es un promedio de 39% más rapido como se ve aqui.

2) Es seguro por que viene integrado con metodos internos de seguridad.

Ahora que tal vez hayas decidido decidido usar CURL te preguntaras ¿como lo hago?, ¿qué es eso?:
Acerca de CURL puedes Googlear y encontrarás mucha info de él.
Ahora vamos a usarlo.

Primero tu servidor debe de tener el módulo CURL instalado, la mayoría de servidores Apache vienen con CURL activado, si usas IIS verifica que lo tengas instalado.

Luego usarlo en tu código de esta manera:
//Puedes usarlo en una clase Helper o en una función como en el ejemplo
 
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }

//Modo de uso:

$result=file_get_contents_curl("http://www.example.com");
if ($result === false)
{
    // treat error
} else {
    // handle good case
} 

Saludos.

1 comentarios: