[Parte 1] CURL en PHP
Instalacion Lo primero que debemos hacer para comenzar a utilizar cURL es instarlo, para ello puedes descargarlo desde: http://curl.haxx.se/ (http://curl.haxx.se/) La guia para la instalacion de cURL compilandolo esta aqui: http://curl.haxx.se/docs/install.html (http://curl.haxx.se/docs/install.html) En este caso no veremos en detalle esto ya que pues vienen los pasos muy detallados en la pagina de la documentacion de cURL, por lo cual veremos solamente como instarlo en la distribucion de ubuntu usando un solo comando: Instalar cURL con un solo comando desde la terminal: sudo apt-get install php5-curl Reiniciar el servidor apache para que funcione cURL: sudo /etc/init.d/apache2 restart Como ves es demasiado facil, y de hecho ya existen muchos paquetes que te incluyen un servidor apache,mysql,php tal como puede ser XAMPP, AppServ... los cuales pueden descagar desde su web oficial y son faciles de instalar y casi siempre ya traen soporte para cURL: XAMPP: https://www.apachefriends.org/es/index.html (https://www.apachefriends.org/es/index.html) AppServ: http://www.appservnetwork.com/?newlang=spanish (http://www.appservnetwork.com/?newlang=spanish) Para saber si nuestro servidor soporta cURL solamente creamos un archivo como el siguiente info.php: Entramos al archivo y veremos algo como lo siguiente: (http://3.bp.blogspot.com/-2hNiZFZIM58/U1IFoUmE4TI/AAAAAAAAB5U/cK2XxD-eaS4/s1600/supportcurl.png) (http://3.bp.blogspot.com/-2hNiZFZIM58/U1IFoUmE4TI/AAAAAAAAB5U/cK2XxD-eaS4/s1600/supportcurl.png)
¿Que es cURL? cURL es una herramienta para usar en un interprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, Telnet, DICT, FILE, y LDAP. cURL soporta certificados HTTPS,HTTP POST, HTTP PUT,Subidas FTP, Kerberos, Subidas mediante formulario HTTP, proxies, cookies, autenticacion mediante usuario+contraseña (Basic, Digest, NTLM y Negotiate para HTTP y Kerberos4 para FTP), continuacion de transferencia de archivos, tunneling de proxy http y muchas otras prestaciones. cURL es opensource/software libre distribuido bajo la licencia MIT. El proposito y uso para cURL es automatizar transferencia de archivos o secuencia de operaciones no supervisadas. Es por ejemplo una buena herramienta para simular las acciones de un usuario en un navegador web. Libcurl es la biblioteca/API correspondiente que los usuarios pueden incorporar en sus programas, cURL actua como un envoltorio (wrapper) aislado para la biblioteca libcurl. libcurl se usa para proveer capacidades de transferencia de URL a numerosas aplicaciones, tanto libres y open source como asi tambien privativas. La biblioteca "libcurl" se puede usar desde mas de 30 lenguajes distintos. HTTP Hypertext transfer protocol o http (en español protocolo de transferencia de hipertexto) es el protocolo usado en cada transaccion de la world wide web. Es un protocolo orientado a transacciones y sigue el esquema peticion-respuesta entre cliente y un servidor. Al cliente que efectua la peticion (un navegador o un spider) se conoce como "user-agent" (agente del usuario). A la informacion transmitida se le llama recurso y se la identifica mediante un localizador uniforme de recursos (URL). Los recursos pueden ser archivos, el resultado de la ejecucion de un programa, una consulta a una base de datos,la traduccion automatica de un documento, etc. HTTP es un protocolo sin estado, es decir, no guarda ninguna informacion sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener el estado. Para eso se usan las cookies, que es informacion que un servidor puede almacenar en el sistema cliente. Esto permite a las aplicaciones web instruir la nocion de "sesion", y tambien permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado. Uso simple de cURL La operacion mas comun es obtener una URL. Podriamos hacer referencia a una pagina, imagen o archivo. El cliente hace una peticion GET y recibe el documento que pidio. curl_init() - esta funcion inicializa una sesion cURL y retorna un manejador cURL. curl_exec($ch) - esta funcion deberia ser llamada despues de inicializar una sesion cURL y todas las opciones establecidas en la sesion. Su proposito es simple, ejecutar la sesion CURL predefinida, dada por $ch. curl_setopt($ch, opcion, valor) - establece una opcion para la sesion de CURL identificada por el parametro $ch, opcion especifica la opcion que se desea establecer, y valor especifica el valor dada la opcion. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1) - Retorna el contenido de la pagina. Si se establece en 0 no se retornara ninguna salida.
curl_setopt($ch,CURLOPT_URL, $url) - Pasa la url como parametro. Este el el sitio objetivo la direccion url. Esta es la url que vas a obtener desde internet. curl_exec($ch) - Graba la url y la pasa para la variable a mostrar. curl_close($ch) - cierra un recurso curl, libera los recursos del sistema. 03 | // Obtener una pagina simple |
05 | $url = "http://arthusu.com.mx/ (http://arthusu.com.mx/)"; |
07 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Retorna el contenido de la pagina |
08 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // sigue las redirecciones |
09 | curl_setopt($ch, CURLOPT_URL, $url); // Pasa la url como parametro |
10 | $resultado = curl_exec($ch); // graba la url y la pasa para una variable |
11 | curl_close($ch); // cierra el recurso y libera recursos para el sistema |
13 | echo $resultado; // Imprime el contenido de la pagina |
(http://4.bp.blogspot.com/-N6ICOKRvBTI/U1IQrVKANwI/AAAAAAAAB5k/bbg5bhQXVsc/s1600/curlexample.png) (http://4.bp.blogspot.com/-N6ICOKRvBTI/U1IQrVKANwI/AAAAAAAAB5k/bbg5bhQXVsc/s1600/curlexample.png)
[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: 03 | AnonScanner.com API sample PHP code. |
04 | You must edit the $uid, $api_key and $file variables to make this work. |
07 | $url = "https://anonscanner.com/api.php (https://anonscanner.com/api.php)"; |
08 | $uid = "YOUR_USER_ID"; //Your user id, from the home page. |
09 | $api_key = "YOUR_API_KEY"; //Your API key from the home page. |
10 | $file = $_FILES['file']; |
13 | curl_setopt($ch, CURLOPT_HEADER, 0); |
14 | curl_setopt($ch, CURLOPT_VERBOSE, 1); |
15 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
16 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |
17 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
18 | curl_setopt($ch, CURLOPT_URL, $url); |
19 | curl_setopt($ch, CURLOPT_POST, true); |
22 | "api_key" => $api_key, |
23 | "file" => "@".$_SERVER['DOCUMENT_ROOT']."/".$file, |
24 | "return" => "link" //"link", "image" or "all". Leave empty for default(all). |
26 | curl_setopt($ch, CURLOPT_POSTFIELDS, $post); |
27 | $response = curl_exec($ch); |
28 | $response = json_decode($response,true); |
30 | 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¶2=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. 03 | $url = "http://most-security.com/foro/image.php?u=138&dateline=1397283113 (http://most-security.com/foro/image.php?u=138&dateline=1397283113)"; |
05 | curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen |
06 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido |
07 | 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 |
08 | curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // retorna esta transferencia, como contenido binario |
09 | $data = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data |
10 | curl_close($ch); // cierra el recurso, y libera memoria del sistema |
11 | header("Content-type: image/jpeg"); // le indicamos en la cabecera lo que se muestra contiene imagenes |
12 | echo $data; // muestra el contenido |
(http://1.bp.blogspot.com/-XVUMICD9zL8/U1KX9d6emAI/AAAAAAAAB50/OL54lTMBVLY/s1600/imagenbinaria.png) (http://1.bp.blogspot.com/-XVUMICD9zL8/U1KX9d6emAI/AAAAAAAAB50/OL54lTMBVLY/s1600/imagenbinaria.png)
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: (http://1.bp.blogspot.com/-cV8-VMZjxqo/U1KpCGbkPBI/AAAAAAAAB6E/nqCUorkP4X8/s1600/autentificacion.png) (http://1.bp.blogspot.com/-cV8-VMZjxqo/U1KpCGbkPBI/AAAAAAAAB6E/nqCUorkP4X8/s1600/autentificacion.png)
03 | $url = "http://tuhost.com/sinacceso/ (http://tuhost.com/sinacceso/)"; |
04 | $post_fields = 'arthusu:test'; |
06 | curl_setopt($ch, CURLOPT_URL, $url); // URL para descargar la imagen |
07 | curl_setopt($ch, CURLOPT_USERPWD, $post_fields); // la caja de dialogo |
08 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido |
09 | $results = curl_exec($ch); // graba la imagen jpg y lo guarda en la variable $data |
10 | curl_close($ch); // cierra el recurso, y libera memoria del sistema |
(http://2.bp.blogspot.com/-ieD-GbZ4ctc/U1KqL4yghkI/AAAAAAAAB6Q/FhnlTy-_DvQ/s1600/documentoscurl.png) (http://2.bp.blogspot.com/-ieD-GbZ4ctc/U1KqL4yghkI/AAAAAAAAB6Q/FhnlTy-_DvQ/s1600/documentoscurl.png)
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'. 03 | $url = "http://tuhost.com/logsasd/ (http://tuhost.com/logsasd/)"; // URL |
04 | $referer = "http://www.mirasoyunsitiofalso.com/ (http://www.mirasoyunsitiofalso.com/)"; // Sitio referido |
06 | $ch = curl_init(); // inicia una sesion curl |
07 | curl_setopt($ch, CURLOPT_URL, $url); // pasa la url como parametro |
08 | curl_setopt($ch, CURLOPT_REFERER, $referer); // establece el sitio referido |
09 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina |
11 | $result = curl_exec($ch); // graba la url pasada y la mete en la variable result |
12 | curl_close($ch); // cierra la url, y libera recursos del sistema |
14 | echo $result; // muestra el contenido de la pagina |
(http://2.bp.blogspot.com/-dPpdQLPbBmA/U1K8PW8u1bI/AAAAAAAAB6g/s84xZgbc3l8/s1600/curlreferer.png) (http://2.bp.blogspot.com/-dPpdQLPbBmA/U1K8PW8u1bI/AAAAAAAAB6g/s84xZgbc3l8/s1600/curlreferer.png)
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 (http://most-security.com/foro/forum.php) 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. 03 | $url = "http://tuhost.com/logsasd/ (http://tuhost.com/logsasd/)"; // es la url que veremos |
04 | $agent = " Googlebot/2.1 (+http://www.google.com/bot.html (http://www.google.com/bot.html))"; // es el navegador que usaremos |
07 | curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl |
08 | curl_setopt($ch, CURLOPT_USERAGENT, $agent); // establece el navegador |
09 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina |
11 | $result = curl_exec($ch); // guarda el contenido de la pagina en $result |
12 | curl_close($ch); // cierra la sesion curl |
14 | echo $result; // muestra la pagina |
(http://1.bp.blogspot.com/-qE8XqdlE2-s/U1K_szkejPI/AAAAAAAAB6s/MHGq-Ym-TNM/s1600/useragentcurl.png) (http://1.bp.blogspot.com/-qE8XqdlE2-s/U1K_szkejPI/AAAAAAAAB6s/MHGq-Ym-TNM/s1600/useragentcurl.png)
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. (http://2.bp.blogspot.com/-owPrwBaeDc4/U1LCT5uN4nI/AAAAAAAAB64/Txxw7Qy1RSg/s1600/sinfollowlocationcurl.png) (http://2.bp.blogspot.com/-owPrwBaeDc4/U1LCT5uN4nI/AAAAAAAAB64/Txxw7Qy1RSg/s1600/sinfollowlocationcurl.png)
Esto nos pasa cuando no seguimos la cabecera Location en el caso de google y si lo activamos. (http://1.bp.blogspot.com/-nkyG5Cr5wGY/U1LC6dL1LvI/AAAAAAAAB7A/HL_laT5JksU/s1600/confollowlocationcurl.png) (http://1.bp.blogspot.com/-nkyG5Cr5wGY/U1LC6dL1LvI/AAAAAAAAB7A/HL_laT5JksU/s1600/confollowlocationcurl.png)
Siguiendo la cabecera Location. 03 | $url = "http://www.google.com (http://www.google.com)"; // es la url que veremos |
06 | curl_setopt($ch, CURLOPT_URL, $url); // inicia una sesion curl |
07 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // redirige a la pagina, en caso de un login te redirige a la pagina de entrada |
08 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devuelve el contenido de la pagina |
10 | $result = curl_exec($ch); // guarda el contenido de la pagina en $result |
11 | curl_close($ch); // cierra la sesion curl |
13 | echo $result; // muestra la pagina |
Hasta aqui terminamos la parte 2.
[Parte 3] CURL en PHP
Cookies El medio por el cual los navegadores web hacen "client side state control (control del estado del lado del cliente)" es por medio de cookies. Las cookies solo son nombres asociadas con contenido. Las cookies son enviadas desde el cliente al servidor. El servidor llama al cliente para saber que ruta y hostname quiere el cliente, devolviendoles asi una fecha de expiracion y unas propiedades mas. Cuando el cliente se comunica con el servidor con el nombre y ruta previamente especificado y recibido en la cookie, el cliente envia de regreso las cookies y su contenido para el servidor, a menos que claro estas hayan expirado. Muchas aplicaciones y servidores usan este metodo para conectar una serie de peticiones dentro de una sola sesion. Para ser capaces de usar curl en tales ocasiones, nosotros deberiamos ser capaces de guardar y enviar de regreso las cookies a la aplicacion web. Esto es muy importante para script en cURL para verificacion de inicios de sesion o paginas con una seccion segura en el sitio web. Estas son 3 cosas que requerimos implementar: 1.- La ruta del archivo para la cookie en tu servidor: 2 | $cookie_file_path = "C:/xampp/htdocs/cookie/cook"; // Este archivo debe tener permisos chmod 777 (leer / escribir) |
2.- Las funciones cURL: 2 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); // el nombre del archivo contiene los datos de la cookie. La cookie puede ser en formato netscape, o solo texto plano http-style con las cabeceras puestas dentro del archivo |
3 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); // el nombre del archivo guarda todas las cookies internas para cuando la conexion cierra. |
Por favor realice lo siguiente: 1.- Suba este archivo prueba.php a su servidor con el siguiente codigo: 2 | print realpath('prueba.php'); |
2.- Accede al archivo tuhost.com/prueba.php y copia la ruta que arroja, en este ejemplo: /home/a8131XXX/public_html/prueba.php 3.- Crea un archivo .txt y ponle de nombre cookie.txt y subelo a tu servidor 4- Dale permisos CHMOD 777. En windows no es necesario realizar esto. 5.- Ahora simplemente formas una cadena con lo que salio en el paso 2 y con el archivo del paso 3, quedando de la siguiente forma: /home/a8131XXX/public_html/cookie.txt (http://2.bp.blogspot.com/-7SqygJZ6z3U/U1Nd07szPiI/AAAAAAAAB7Q/x7Zk58lF9UI/s1600/logeado.png) (http://2.bp.blogspot.com/-7SqygJZ6z3U/U1Nd07szPiI/AAAAAAAAB7Q/x7Zk58lF9UI/s1600/logeado.png)
04 | $pass = "tucontraseña"; |
05 | $url = "https://www.facebook.com/login.php (https://www.facebook.com/login.php)"; |
06 | $post_fields = 'lsd=AVolpnen&email='.$user.'&pass='.$pass.'&default_persistent=0&timezone=360&lgnrnd=222458_oW23&lgnjs=1397971500&locale=es_LA'; |
07 | $referer = "https://www.facebook.com/login.php (https://www.facebook.com/login.php)"; |
08 | $agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0"; |
09 | $cookie_file_path = "C:/xampp/htdocs/cookie.txt"; |
12 | curl_setopt($ch, CURLOPT_URL, $url); |
13 | curl_setopt($ch, CURLOPT_USERAGENT, $agent); |
14 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); |
15 | curl_setopt($ch, CURLOPT_POST, 1); |
16 | curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); |
17 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
18 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); |
19 | curl_setopt($ch, CURLOPT_REFERER, $referer); |
20 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); |
21 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); |
23 | $result = curl_exec($ch); |
CURLOPT_COOKIEFILE - Nombre del fichero que contiene datos de las cookies. El fichero de las cookies puede estar en formato Netscape, o simplemente tipo HTTP plano dentro de un fichero. Si el nombre es una cadena vacia, no se cargaran cookies, aunque el manejo de cookies aun esta habilitado. CURLOPT_COOKIEJAR - Nombre del fichero donde guardar cookies internas cuando se cierra se cierra, por ejemplo: despues de llamar a curl_close(). HTTPS (SSL) Hay varias formas de realizar transferencias HTTP seguras. A lo lejos el protocolo mas comun que realiza esto es conocido como HTTPS, HTTP encima de SSL. SSL encripta todos los datos que son enviados y recibidos atraves de la red, asi hace mas dificil que los atacantes espien la informacion sensitiva. SSL (o TLS como la ultima version del estandar es llamada) ofrece un camino para caracteristicas avanzadas para permitir estas encriptaciones y claves de mecanismos de infraestructura para encriptar HTTP como es requerido. cURL soporta recuperaciones encriptadas gracias a las librerias OpenSSL. En el ejemplo anterior de la peticion con cURL a facebook, usamos esto que eran las opciones CURLOPT_SSL_VERIFYPEER y CURLOPT_SSL_VERIFYHOST. CURLOPT_SSL_VERIFYPEER - FALSE para que cURL no verifique el PEER del certificado. Para usar diferentes certificados para la verificacion se puede especificar con la opcion CURLOPT_CAINFO o se puede especificar el directorio donde se encuentra el certificado con la opcion CURLOPT_CAPATH. TRUE por omision desde cURL 7.10. Paquete instalado por defecto en la version de CURL 7.10. CURLOPT_SSL_VERIFYHOST - 1 para comprobar que existe un nombre comun en el peer del certificado SSL. 2 para comprobar que existe un nombre comun y tambien para verificar que el hostname coincide con el proporcionado. En entornos de produccion el valor de esta opcion debe de mantenerse en 2 (valor por omision). Depuracion Muchas veces cuando corremos curl en un sitio, tienes un aviso de que el sitio no se muestra, para responder de la misma forma las peticiones curl tu debes hacer como el navegador. Entonces tu necesitas empezar a crear tus peticiones mas similar a tus peticiones del navegador: - Estar seguro que checa las cookies cuando son necesarias - Establecer User-Agent de los navegadores mas actuales y populares - Establecer el Referer como esta establecido en el navegador - Si contiene datos POST, debes acomodarlos de la misma manera que lo hace el navegador. CURLOPT_HEADER - TRUE para incluir el header (encabezado) en la salida CURLOPT_VERBOSE - TRUE para mostrar informacion verbose. Escribe la salida en STDERR, o el fichero especificado usando CURLOPT_STDERR.
[Parte 4] CURL en PHP
Cabecera post personalizada a un host remoto Esto sucede cuando solo podemos ver ciertas partes de un sitio web, el sitio necesita unas cabeceras especiales, que tendriamos que olfatear con algun intermediario tal como puede ser: Live HTTP HEADERS, HTTPFox, Burp Suite, Tamper Data... (http://3.bp.blogspot.com/-umICKftr5Rk/U1SwfizE_BI/AAAAAAAAB7g/dkJaBbVKJgc/s1600/httpfoxsniffer.png) (http://3.bp.blogspot.com/-umICKftr5Rk/U1SwfizE_BI/AAAAAAAAB7g/dkJaBbVKJgc/s1600/httpfoxsniffer.png)
En este ejemplo estoy olfateando las cabeceras HTTP usando de intermediario HTTPFox (Complemento de firefox). En este caso nosotros usaremos la opcion CURLOPT_HTTPHEADER. CURLOPT_HTTPHEADER - Un array de campos a configurar para el Header HTTP, en el formato: array('Content-Type: text/plain','Content-length: 100'); CURLOPT_HEADER - TRUE para incluir el header en el OUTPUT. 03 | $url = "https://tuhost.com/ (https://tuhost.com/)"; |
04 | $referer = "https://tuhost.com (https://tuhost.com)"; |
06 | $ch = curl_init(); // iniciamos curl |
07 | curl_setopt($ch, CURLOPT_URL, $url); // establecemos la url |
08 | curl_setopt($ch, CURLOPT_VERBOSE, 1); // muestra como pasa todo |
09 | curl_setopt($ch, CURLOPT_HEADER, 1); // muestra las cabeceras que el servidor nos devuelve |
10 | curl_setopt($ch, CURLOPT_STDERR, fopen('log_curl.txt','a+')); // en este archivo se guarda lo de verbose |
11 | curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); //modificamos nuestra cabecera |
12 | curl_setopt($ch, CURLOPT_REFERER, $referer); // ponemos desde donde venimos |
13 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // devolvemos el contenido de la pagina |
14 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // quitamos la verificacion del certificado |
15 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // seguimos cualquier redireccion |
16 | curl_setopt($ch, CURLOPT_COOKIEFILE, fopen('cookies.txt','a+')); // le decimos donde van las cookies |
17 | curl_setopt($ch, CURLOPT_COOKIEJAR, fopen('cookies.txt','a+')); // le decimos que escriba las cookies aqui |
19 | $result = curl_exec($ch); // ejecutamos y guardamos |
21 | curl_close($ch); // cerramos curl, liberamos memoria |
23 | print $result; // mostramos el resultado |
Subir un archivo a un sitio remoto usando un formulario HTML Tu debes usar un formulario utilizando el metodo POST pero con algunos cambios. En este ejemplo, donde el formulario contiene enctype='multipart/form-data'. Usamos el array superglobal $_FILE para leer el archivo y pasarlo por los campos post con el signo @. Tal como lo siguiente: 1 | curl_setopt($ch, CURLOPT_POSTFIELDS, array("$field_name"=>"@".$_FILES['file']['tmp_name'])); |
En este ejemplo les muestro como subimos un archivo remotamente a la pagina xup.in: 03 | $url = "http://www0.xup.in/exec/xupload.php?uid=&key= (http://www0.xup.in/exec/xupload.php?uid=&key=)"; |
04 | $user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:28.0) Gecko/20100101 Firefox/28.0"; |
05 | $referer = "http://www.xup.in/ (http://www.xup.in/)"; |
06 | $directory=dirname(__FILE__).'\files/'; |
07 | if(isset($_FILES['f1'])){ |
08 | move_uploaded_file($_FILES['f1']['tmp_name'],"files/".$_FILES['f1']['name']); |
10 | curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); |
11 | curl_setopt($ch, CURLOPT_REFERER, $referer); |
12 | curl_setopt($ch, CURLOPT_URL, $url); |
13 | curl_setopt($ch, CURLOPT_POSTFIELDS, array("F1"=>"@".$directory.$_FILES['f1']['name'])); |
14 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
15 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); |
16 | $result = curl_exec($ch); |
19 | echo 'Curl error: ' . curl_error($ch); |
22 | unlink($directory.$_FILES['f1']['name']); |
24 | preg_match_all('/<input type="text" name="t1" size="90" class="inp" value="(.*?)" onclick="highlight\(this\);" \/>/', $result, $matches); |
25 | //echo '<p><img src="'.$matches[1][0].'" alt="img" /></p>'; |
26 | echo '<p><b>Link: <a href="'.$matches[1][0].'" target="_blank">Archive Link</a></p>'; |
30 | <form action="upload_curl.php" method="post" enctype="multipart/form-data"> |
31 | <label for="f1">Filename:</label> |
32 | <input type="file" name="f1" id="f1"> |
34 | <input type="submit" name="submit" value="Submit"> |
En este caso tenemos un uploader y una carpeta llamada files/ en la cual se sube el fihcero luego envia una peticion subiendo el fichero y por ultimo nos envia el enlace, una cosa importante aqui es que agregamos la funcion curl_error($ch) que nos muestra si ocurre un error en cURL. Con la funcion curl_errno($ch) nos arroja un numero el cual tiene un mensaje especifico de error. Nota: Recuerda que siempre que hago referencia a $ch es por que ahi se almacena la sesion de cURL. Subir un archivo por FTP Tu tienes la opcion en cURL de usar todos los comandos FTP. Por ejemplo, si quieres subir un archivo: 02 | if(isset($_POST['enviar'])){ |
03 | $ftp_user = "tuusuario"; |
04 | $ftp_pass = "tucontraseña"; |
05 | $url = "tuurloipdetuweb"; |
06 | $ftp_server = "ftp:// (ftp://ftp://)". $ftp_user . ":" . $ftp_pass . "@" . $url; |
07 | $archivo_a_subir = realpath($_FILES['userfile']['tmp_name']); |
08 | $tamaño_del_archivo = filesize($archivo_a_subir); |
09 | $fp = fopen($archivo_a_subir, 'rb'); |
11 | curl_setopt($ch, CURLOPT_URL, $ftp_server . $_FILES['userfile']['name']); |
12 | curl_setopt($ch, CURLOPT_VERBOSE, 1); |
13 | curl_setopt($ch, CURLOPT_UPLOAD, 1); |
14 | curl_setopt($ch, CURLOPT_INFILE, $fp); |
15 | curl_setopt($ch, CURLOPT_INFILESIZE, $tamaño_del_archivo); |
17 | echo "Ha ocurrido un error: " . curl_error($ch); |
19 | $result = curl_exec($ch); |
21 | echo "Archivo subido correctamente |
26 | <form action="" method="post" enctype="multipart/form-data"> |
27 | <p><input type="file" name="userfile" /></p> |
28 | <p><input type="submit" name="enviar" value="Subir!" /></p> |
CURLOPT_INFILE - El fichero que el proceso de transferencia debe leer a la hora de subir el archivo. CURLOPT_INFILESIZE - El tamaño esperado en bytes, del fichero cuando se esta subiendo un fichero al sitio remoto. Tenganse en cuenta que el uso de esta opcion no detendra a libcurl a la hora de enviar mas datos, exactamente lo que se envia depende de CURLOPT_READFUNCTION. Eliminar un archivo y mostrarlos por FTP Tu tienes la opcion de usar comandos FTP con cURL. Alguna lista de comandos puedes encontrarla en: http://en.wikipedia.org/wiki/List_of_FTP_commands (http://en.wikipedia.org/wiki/List_of_FTP_commands) Veamos un ejemplo de Eliminar un archivo y como mostrar los archivos tambien de una carpeta. 04 | <title>ELIMINAR ARCHIVOS FTP</title> |
08 | <h1>Eliminar archivo</h1> |
09 | <form action="" method="post"> |
10 | <p><b>Nombre de la carpeta: </b><input type="text" name="carpeta" placeholder="tucarpeta/" /><small>No es necesario especificarla</small></p> |
11 | <p><b>Nombre del archivo: </b><input type="text" name="archivo" placeholder="archivo.jpg" /></p> |
12 | <input type="submit" name="enviar" /> |
14 | <h1>Mostrar archivos de la carpeta</h1> |
15 | <form action="" method="post"> |
16 | <p><b>Nombre de la carpeta: </b><input type="text" name="directorio" placeholder="tucarpeta/" /><small>Es necesario especificarla para mostrar el contenido del directorio</small></p> |
17 | <input type="submit" name="enviar2" /> |
20 | /* Variables para el FTP */ |
21 | $ftp_user = "tuusuario"; |
22 | $ftp_pass = "tucontraseña"; |
25 | $ftp_server = "ftp:// (ftp://ftp://)". $ftp_user . ":" . $ftp_pass . "@" . $url; |
27 | /* Funcion para eliminar el archivo */ |
28 | if(isset($_POST['enviar'])){ |
29 | function delete($carpeta = null , $archivo){ |
30 | global $ftp_user, $ftp_pass, $url, $ftp_server; |
32 | $carpeta = "public_html/"; |
34 | $postfields[] = "CWD ". $carpeta; |
35 | $postfields[] = "DELE " . $archivo; |
38 | curl_setopt($ch, CURLOPT_URL, $ftp_server); |
39 | curl_setopt($ch, CURLOPT_POSTQUOTE, $postfields); |
40 | $result = curl_exec($ch); |
48 | $carpeta = $_POST['carpeta']; |
49 | $archivo = $_POST['archivo']; |
50 | delete($carpeta,$archivo); |
53 | /* Listar directorio */ |
54 | if(isset($_POST['enviar2'])){ |
55 | function listar_dir($directorio){ |
56 | global $ftp_user, $ftp_pass; |
57 | $url = "tuhost.com/".$directorio; |
58 | $ftp_server = "ftp:// (ftp://ftp://)". $ftp_user . ":" . $ftp_pass . "@" . $url; |
60 | curl_setopt($ch, CURLOPT_URL, $ftp_server); |
61 | curl_setopt($ch, CURLOPT_FTPLISTONLY, 1); |
62 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
63 | $output = curl_exec($ch); |
68 | $files = explode("\n", $output); |
71 | $directorio = $_POST['directorio']; |
72 | listar_dir($directorio); |
CURLOPT_POSTQUOTE - Un array de comandos FTP a ejecutar en el servidor despues de que se realice la peticion FTP. CURLOPT_FTPLISTONLY - TRUE para solo listar nombres de un directorio FTP. Opciones LibcURL Podemos ver una lista de opciones sobre la libreria cURL en: http://www.php.net/manual/es/function.curl-setopt.php (http://www.php.net/manual/es/function.curl-setopt.php) Rastrear peticiones Rastrear las peticiones o ver sus cabeceras, es una manera de saber si estamos haciendo bien algo en cURL, existen muchas herramientas las cuales podemos utilizar como intermediario para poder ver las peticiones, como vimos arriba usabamos HTTP FOX. Y como comentabamos esta disponible tambien Burp Suite, Live HTTP Headers, Tamper Data, etc. Hasta aqui la parte de este tutorial, nos vemos en la proxima parte que espero sea la ultima :).