sábado, 19 de abril de 2014

[Parte 2] CURL en PHP

Formularios

Los formularios son generalmente presentados como campos donde el usuario puede meter datos, y al presionar Ok o Submit estos son enviados al servidor para ser procesados. El servidor procesa datos tipicamente como por ejemplo: una busqueda a la base de datos, un inicio de sesion, etc.

GET y POST

En el metodo GET todos los campos se ven mostrados en la URL. Esto generalmente suele ser una ventaja para sistemas de modulacion, pero una desventaja en si, ya que muchos atacantes lo primero que verifican es este tipo de URLs. El protocolo HTTP ofrecere otro metodo que es POST el cual envia los campos ocultos separados de la URL los cuales son enviados por las cabeceras HTTP.

Una buena practica seria enviar en una pagina donde los datos son enviados por el metodo POST y darle nuestros valores... En el metodo post se usa el content-type: application/x-www-form-urlencoded por lo cual es necesario encodear a urlencode nuestros datos que vamos a enviar, por ejemplo: si tiene un espacio pondriamos %20, pero para no hacerlo tan pesado podriamos hacer uso de la funcion urlencode().

Vamos a ver como ejemplo la API de anonscanner que me paso ZanGetsu:


 <?php
    /*
    AnonScanner.com API sample PHP code.
    You must edit the $uid, $api_key and $file variables to make this work.
    */
    
    $url     = "https://anonscanner.com/api.php";
    $uid     = "YOUR_USER_ID"; //Your user id, from the home page.
    $api_key = "YOUR_API_KEY"; //Your API key from the home page.
    $file    = $_FILES['file'];
    
    $ch      = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    $post    = array(
        "uid"     => $uid,
        "api_key" => $api_key,
        "file"    => "@".$_SERVER['DOCUMENT_ROOT']."/".$file,
        "return"  => "link" //"link", "image" or "all". Leave empty for default(all).
        );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    $response = curl_exec($ch);
    $response = json_decode($response,true);
    
    print_r($response); //JSON output
?>


En este caso esta pequeña API lo que hace es devolvernos los resultados de los antivirus, para ello envia un archivo por medio de POST, nuestro iud, nuestra api,y el modo en que devolveremos los resultados.


Lo unico nuevo y que voy a explicar aqui es CURLOPT_POST, CURLOPT_POSTFIELDS.

CURLOPT_POST - TRUE para hacer un HTTP POST normal. Este post del tipo application/x-www-form-urlencoded, el mas comun en los formularios HTML.

CURLOPT_POSTFIELDS - Todos los datos para enviar via HTTP "POST". Para enviar un fichero, prefija el nombre de fichero con @ y utiliza la ruta completa. Se puede especificar explicitamente el tipo de fichero añadiendo el tipo al nombre del fichero, en el formato ';type=mimetype'. Se puede enviar una cadena urlencoded como 'para1=val1&para2=val2&...' o tambien como un array con el nombre del campo como key y los datos como value. Si value es un array, el encabezado Content-Type sera definido como multipart/form-data. Apartir de PHP 5.2.0, value debe ser un array si los archivos son pasados a esta con la opcion con el prefijo @. Apartir de PHP 5.5.0, el prefijo @ esta obsoleto, por lo que los ficheros se pueden enviar usando CURLFile.

Nota: Para los campos ocultos de un formulario podemos usar lo mismo, solamente que como estos no se ven nosotros tendriamos que aplicarlos.


Descagar una imagen (Archivo Binario)

Tu puedes descargar archivos como imagenes, pdfs, psd, docs, zip usando curl. Google usa esta tecnica para mostrar sus imagenes.


 <?php
 // Ejemplo 3
 $url = "http://most-security.com/foro/image.php?u=138&dateline=1397283113";
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido
 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0"); // especificamos el navegador que usamos
 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // retorna esta transferencia, como contenido binario
 $data = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data
 curl_close($ch); // cierra el recurso, y libera memoria del sistema
 header("Content-type: image/jpeg"); // le indicamos en la cabecera lo que se muestra contiene imagenes 
 echo $data; // muestra el contenido
?>


Autentificacion

La autentificacion es capaz de verificar si tienes permiso a acceder a un recurso. La autentificacion basica usada en HTTP es basada en texto plano es decir usuario y contraseña ligeramente ofuscados, pero puede ser leido si te olfatean la red.

Para usar la autenticacion en una caja de dialogo, que nos pide usuario y contraseña:






 <?php
 // Ejemplo 4
 $url = "http://tuhost.com/sinacceso/";
 $post_fields = 'arthusu:test';
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen
 curl_setopt($ch, CURLOPT_USERPWD, $post_fields); // la caja de dialogo
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido
 $results = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data
 curl_close($ch); // cierra el recurso, y libera memoria del sistema
 
 echo $results;
?>





CURLOPT_USERPWD - Nombre de usuario y contraseña siguiendo el formato "[username]:[password]" para ser usado en la conexion.


Referer

Muchas paginas chequean desde donde llega el cliente, mas que nada que pagina anterior uso, para llegar a la suya, esto puede ser muy util para muchas cosas, pero esto se puede engañar facilmente modificando la cabecera 'referer'.



 <?php
 // ejemplo 5
 $url = "http://tuhost.com/logsasd/"; // URL
 $referer = "http://www.mirasoyunsitiofalso.com/"; // Sitio referido

 $ch = curl_init(); // inicia una sesion curl
 curl_setopt($ch, CURLOPT_URL, $url); // pasa la url como parametro
 curl_setopt($ch, CURLOPT_REFERER, $referer); // establece el sitio referido
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina

 $result = curl_exec($ch); // graba la url pasada y la mete en la variable result
 curl_close($ch); // cierra la url, y libera recursos del sistema

 echo $result; // muestra el contenido de la pagina
?>








User Agent

La cabecera User-Agent contiene datos importantes como son el navegador que esta usando el cliente y su sistema operativo, tambien indica si esta entrando desde un dispositivo Ipad, Iphone, etc.

Muchas paginas dejan entrar al Bot de google solo por que ven su cabecera, una buena practica que podriamos hacer es intentar entrar a varias paginas con acceso restringido en algunas zonas y ver como con el User-Agent de google tenemos mas privilegios.

O simplemente, si intentas hacer una peticion most-security por medio de cURL te arrojara cloudflare con un error detectando que estas usando cURL por lo cual puedes usar esta cabecera User-Agent evitando que te salga ese error.

 <?php
 // ejemplo 6
 $url = "http://tuhost.com/logsasd/"; // es la url que veremos
 $agent = " Googlebot/2.1 (+http://www.google.com/bot.html)"; // es el navegador que usaremos

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl
 curl_setopt($ch, CURLOPT_USERAGENT, $agent); // establece el navegador
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina

 $result = curl_exec($ch); // guarda el contenido de la pagina en $result
 curl_close($ch); // cierra la sesion curl

 echo $result; // muestra la pagina
?>






Redirecciones

Cuando pides una pagina web, muchas veces te envia un mensaje de error 301 el cual dice que el objeto se ha movido, esto pasa que cuando tu lo pides con cURL no sigue el objeto que se movio, entonces para poder retornar o ver la pagina necesitamos seguir ese recurso...
Este tipo de recursos se ven reflejados en la cabecera Location.

Esto nos pasa cuando no seguimos la cabecera Location en el caso de google y si lo activamos.





Siguiendo la cabecera Location.


 <?php
 // ejemplo 7
 $url = "http://www.google.com"; // es la url que veremos

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // redirige a la pagina, en caso de un login te redirige a la pagina de entrada
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina

 $result = curl_exec($ch); // guarda el contenido de la pagina en $result
 curl_close($ch); // cierra la sesion curl

 echo $result; // muestra la pagina
?>

Hasta aqui terminamos la parte 2.

No hay comentarios:

Publicar un comentario en la entrada