Supervisar directorios con PHP

septiembre 14th, 2011 by admin

Si tenemos una web que permite a los visitantes subir archivos, debemos controlar que no se suba nada inadecuado.

Lo primero sería programar la web de forma segura, intentando que sea “imposible” que un usuario malintencionado suba ficheros maliciosos.

Si hemos realizado lo anterior correctamente es muy probable que no tengamos ningún problema, pero si deseamos un poco mas de seguridad (o control) podemos supervisar el directorio donde esta la web. De esta forma si detectamos cambios en ficheros o ficheros nuevos podemos saber cuales son y actuar en consecuencia.

En el caso de que la web permita subir imágenes, quizás debamos modificar este código para filtrar las imágenes, de lo contrario, cada imagen que se suba nos generará una alerta.

<?php
date_default_timezone_set('Europe/Madrid');
//Timezone soportados: http://www.php.net/manual/es/timezones.php
 
class FileLog
{
	private $_baseDir = ""; //Directorio que se controla
	private $_numSubDir = 0; //Número de subdirectorios
	private $_numFiles = 0; //Número de ficheros
	private $_fileMod = 0; //Número de archivos modificados
	private $_time = ""; //Fecha base desde la que se registran cambios
	private $_badFiles = array(); //Ficheros nuevos o modificados desde la fecha base
 
	public function __construct($dir)
	{
		$this->_baseDir = $dir;
	}
 
	/**
	 * Leer todos los ficheros de un directorio de forma recursiva.
	 * @param String $dir directorio base
	 * @param boolean $review indica si se estan buscando ficheros nuevos/modificados
	 */
	public function readDir($dir, $review = false) {
 
		$openDir = opendir($dir);
 
		while($file = readdir($openDir))
		{
			if($file == "." || $file == ".." || $file == "fileLog.txt") {continue; }			
 
			if(is_dir($dir . "/" . $file)) {
 
				if($review) {
					$this->readDir($dir . "/" . $file . "/", true);	
				} else {
					$this->readDir($dir . "/" . $file . "/");
					$this->_numSubDir++;
				}					
 
			} else { 
 
				if($review) {
					clearstatcache();
 
					$ftime = filemtime($dir . "/" . $file);				
 
					if($ftime > $this->_time) {
						$this->_badFiles[] = date("d/m/Y H:i:s", $this->_time) . " - " . date("d/m/Y H:i:s", $ftime) . " | " . $dir . "/" . $file;
						$this->_fileMod++;
					}
				} else {				
					$this->_numFiles++;
				}
 
			}
		}
	}
 
	/**
	 * 
	 * Crea un archivo (si no existe) y guarda la información de el directorio
	 * que se esta supervisando. La información se guarda con este formato:
	 * fecha&dir&file
	 * 
	 * fecha en formato unix
	 * dir el número de subdirectorios dentro de el directorio supervisado
	 * file el número de ficheros dentro del directorio supervisado
	 * 
	 * @return boolean
	 */
	private function _writeFile()
	{
		$path = dirname(__FILE__) . "/fileLog.txt";
		$data = time() .'&'. $this->_numSubDir .'&'. $this->_numFiles;
 
		$fopen = fopen($path, "w");
 
		if($fopen) {
			if(fwrite($fopen, $data)) {
				return true;
			} else {
				return false;
			}
		} else {
			return true;
		}
	}
 
	/** 
	 * Genera los avisos cuando hay nuevos ficheros o ficheros modificados
	 * @param int $dir número de directorios en el registro base
	 * @param int $files número de ficheros en el registro base
	 */
	private function _alert($dir, $files)
	{
		$log = "";
		$msg = "";
 
		//Avisar de los nuevos ficheros
		$msg = "Hay directorios o ficheros nuevos.\r\n";
		$msg .= "Directorios nuevos: " . ($this->_numSubDir - $dir) . "\r\n";
		$msg .= "Ficheros nuevos: " . ($this->_numFiles - $files);	
		$msg .= "\r\n";	
		$msg .= "En breve recibirá un email con los cambios en los ficheros";	
		$this->_send($msg);
 
		//Buscar fichero nuevos
		$this->readDir($this->_baseDir, true);
 
		//Avisar de los ficheros nuevos y modificados
		foreach($this->_badFiles as $file)
		{
			$log .= $file . "\r\n";
		}
 
		$msg = "Informe de cambios en ficheros\r\n";
		$msg .= "Directorios nuevos: " . ($this->_numSubDir - $dir) . "\r\n";
		$msg .= "Ficheros nuevos: " . ($this->_numFiles - $files) . "\r\n";
		$msg .= "Archivos modificados: " . ($this->_fileMod - ($this->_numFiles - $files)) . "\r\n";
		$this->_send($msg . $log);
	}
 
	/**
	 * Procesa los mensajes generados. En este ejemplo los muestra en pantalla.
	 * Pero si este fichero es ejecutado por un cron la mejor opción sería enviar
	 * estos mensajes por email on crear un archivo log.
	 * @param String $msg
	 */
	private function _send($msg)
	{
		echo nl2br($msg);
		echo "<hr>";
	}
 
	public function __destruct()
	{
		$pathFileLog = dirname(__FILE__) . "/fileLog.txt";
 
		if(file_exists($pathFileLog)) {
 
			$data = file_get_contents($pathFileLog);
			$data = explode("&", $data);
 
			$this->_time = intval(trim($data[0]));
			$dir = $data[1];
			$files = $data[2];
 
			if($this->_numSubDir > $dir || $this->_numFiles > $files) {
				$this->_alert($dir, $files);
			}
 
		} else {
			$this->_writeFile();
		}
	}
}
 
//Exec
$read = new FileLog(dirname(__FILE__));
$read->readDir(dirname(__FILE__));

Etiquetas: ,

Ejecutar archivos PHP desde consola (windows)

septiembre 13th, 2011 by admin

Primero tenemos que localizar el archivo php.exe, su localización depende de cada instalación. Cuando lo tengamos localizado abrimos una consola.

Inicio – Ejecutar – cmd

Ahora vamos al directorio donde esta el archivo php.exe. Cuando estemos en el mismo directorio podremos ejecutar los archivos php.

>php.exe -f “Ruta al fichero php”

Ejemplo:

 >php.exe -f “c:\hola_mundo.php

Nos puede ocurrir que un fichero php que funciona correctamente ejecutado desde un navegador, no funcione desde consola. Esto puede ser debido a que el fichero utilice funciones de alguna extensión (MySQL, cUrl, SimpleXML, …) que se estén cargando como modulo de apache.

Para saber que extensiones (módulos) esta cargando php y no apache podemos ejecutar el comando:

>php.exe -m

Para terminar, indicaros el comando necesario para acceder a la ayuda de php.exe.

>php.exe -h

Enlaces interesantes:

Instalación de Apache, PHP y MySQL por separado

http://www.clubdesarrolladores.com/articulos/mostrar/27-como-instalar-y-configurar-apache-php-y-mysql-en-windows

Ayuda para el CLI de php

http://www.php.net/manual/en/features.commandline.options.php

Etiquetas: , ,

Ver la televisión TDT en linux (Mandriva 2010 y Fedora 12) con VLC

febrero 6th, 2010 by admin

1.- Instalar la tarjeta TDT en linux.

En mi caso utilizo “avermedia volarx”. Un TDT parecido a una memoria USB.
Web oficial: http://www.avermedia.com/avertv/product/productdetail.aspx?id=39

Primero me voy a www.linuxtv.org para buscar mi tarjeta y saber si esta
reconocida por linux.

En linuxtv.org vamos a dispositivos TDT por USB.
http://www.linuxtv.org/wiki/index.php/DVB-T_USB_Devices

Buscamos “avermedia Volar X” y la encontramos. Vamos a la página de la tarjeta:
http://www.linuxtv.org/wiki/index.php/AVerMedia_AVerTV_Digi_Volar_X_%28A815%29

Ahora ejecutamos un comando para comprobar si nuestra tarjeta esta reconocida por
nuestra distribución, tal y como nos dicen en la página.

Comando:
#lsusb

Y obtengo:
Bus 001 Device 003: ID 07ca:a815 AVerMedia Technologies, Inc.

Tal y como indican en la página de linuxtv.org.

Seguimos leyendo y nos indican que tenemos que añadir el firmware de la tarjeta.
Por lo tanto, realizamos lo que nos indican.

- Bajar firmware.
- Copiar firmware a /lib/firmware

Comando (Teniendo en cuenta que estamos en la carpeta donde esta el firmware):
#cp dvb-usb-af9015.fw /lib/firmware/

2.- Reniciar

Reiniciamos el ordenador.

3.- Creamos un archivo con los canales del TDT utilizando w_scan

- Descargar w_scan
http://wirbel.htpc-forum.de/w_scan/index2.html

- Descomprimir
Comando (Estamos en el mismo directorio que w_scan):
$tar -xjf w_scan-20091230.tar.bz2.bz

- Entramos en el directorio que se acaba de crear de w_scan
Comando (Estamos en el mismo directorio que w_scan):
$cd w_scan-20091230

- Realizamos una busqueda de canales. Los datos de la busqueda de canales
se guardara en un fichero llamado “canalesTDT.conf”.
Comando (Estamos dentro de la carpeta creada al descomprimir w_scan):
$./w_scan -c ES -X >> /home/felipe/canalesTDT.conf

OJO! la opciones son: -c en minúscula y -X en mayúscula.

4.- Instalamos VLC

Este paso dependera muchos de nuestra distribución. En mi caso es Mandriva 2010 Free.
Esta distribución utiliza paquetes *.RPM.

Para instalar VLC en esta distribución utilizo el comando:
#urpmi vlc

Despues de ejecutarlo me indica que es necesario instalar paquetes dependientes y me
pregunta si realmente quiero instalarlo, contestamos que sí.

5.- Distrutar de la televisión TDT con VLC.

Ahora abrimos VLC, vamos a “Medio”, “Abrir archivo”. Seleccionamos “Todos los archivos” para ver
el archivo “canalesTDT.conf” y lo seleccionamos.

Para ver la lista de canales, vamos a “view”, “playlist” y ya veremos todos los canales de TDT que
w_scan detecto.

Etiquetas: , , , ,

Obtener el día de la semana correspondiente a una fecha especificada con php (mktime y date).

diciembre 11th, 2009 by Webmaster

A continuación dejo una simple función que permite realizar lo ya indicado en el titulo. Es algo realmente simple, pero cuando yo necesite este dato, tuve que buscar durante unos minutos en la documentación de php y después preparar la función.

Como es un trozo muy pequeño de código, es posible que este se pierda. Para evitar que esto ocurra y para aquellos usuarios que lo necesiten expongo el código.

<?php
/**
 * Obtener el día de la semana para una fecha concreta.
 */
function diaSemana($ano,$mes,$dia)
{
	// 0->domingo	 | 6->sabado
	$dia= date("w",mktime(0, 0, 0, $mes, $dia, $ano));
		return $dia;
}
 
/**
 * Ejemplo de uso
 */
$diaSemana = diaSemana("2009", "12", "10");
echo $diaSemana;
 
/**
 * Imprime:
 * 4 | El cuatro corresponde a Jueves
 */
?>

Etiquetas: ,

Buscar enlaces en una cadena y convertirlos en enlaces HTML con php (preg_replace_callback).

diciembre 10th, 2009 by Webmaster

Actualmente casi todos los sitios webs tiene algún método para reconocer enlaces. Da igual donde dejemos un comentario. Puede ser un foro, un chat, un blog, etc. Seguro que cuando enviemos un mensaje, si este contiene algún enlace, una vez publicado podremos pinchar sobre él.

Yo como usuario, lo encuentro bastante útil y cómodo. Por un lado, si soy un visitante, es algo incomodo copiar y pegar el enlace en la barra de direcciones. Es mucho mas fácil hacer “click” sobre el enlace.

Por otro lado, si soy el autor de un comentario y quiero dejar un enlace, solo tengo que escribirlo, no tengo que preocuparme de hacer que sea pinchable.

Por ese motivo, dejo a vuestra disposición una clase en php para leer un texto y convertir en etiquetas HTML todos los enlaces que contenga el texto.

Actualmente solo reconoce los enlaces que comienzan por “http://” pero puede mejorarse para que detecte mas enlaces o realice mas operaciones, esto ya depende de las necesidades de cada uno.

A continuación el código y un ejemplo de uso.

<?php
/**
 * Con esta clase podemos convertir los enlaces de un texto.
 * Por ejemplo si escribirmos:
 * http://www.ejemplo.com
 * se convertirá automáticamente en:
 * <a href="http://www.ejemplo.com">http://www.ejemplo.com</a>
 */
class Enlaces
{
    private $_texto;
    private $_logs;
    private $_debug = false;
    private $_existen = false;
 
    public function __construct($texto = false, $debug = false)
    {
        //Saber si hay que mostar los mensajes de debug por pantalla o no.
        if($debug) {
            $this->_debug = true;
        }
 
        //Verificar que se indicó un texto a parsear
        if(!$texto || empty($texto)) {
            $this->_logs = "Error! Usted no indico la cadena a parsear. rn";
        } else {
            $this->_texto = $texto;
        }
 
        //Parsear texto
        if(!$this->parsear()) {
            $this->_logs .= "Error! El texto indicado no se puede parsear o no
        tiene enlaces. rn";
        } else {
            $this->_logs .= "Texto parseado correctamente";
        }
    }
 
/*
 * Parsear el texto buscando enlaces. Se buscan las cadenas que comienzan por:
 * "http://" sin comillas.
 *
 * Retorna: true si se parsea correctamente, false si no se parsea o
 * si no existen enlaces en el texto.
 */
    private function parsear()
    {
        $this->_texto = preg_replace_callback("/(http://[w/*?*&*=*.*]+)/",
                             "Enlaces::enlacesDetectados", $this->_texto);
 
        if($this->_texto == "NULL" || $this->_existen == false) {
            return false;
        } else {
            return true;
        }
    }
 
/**
 * Convierte los enlaces en enlaces HTML. Si queremos añadir atributos a los enlaces generados, debemos
 * hacerlo aquí.
 */
    private function enlacesDetectados($coincidencias)
     {
         foreach($coincidencias as $enlace)
         {
             $this->_existen = true;
             $enlace = "<a href='" . $enlace . "'>" . $enlace . "</a>";
                return $enlace;
         }
     }
 
/**
 * Devuelve el texto con los enlaces convertidos.
 */
    public function getTexto()
    {
        return $this->_texto;
    }
 
/**
 * Devuelve el logs generado durante la ejecución. Solo devuelve el logs si se indico previamente.
 */
    public function getLogs()
    {
        if($this->_debug) {
            return $this->_logs;
        }
    }
}
 
/**
 * EJEMPLO DE USO
 */
 $texto = " Este es un texto de prueba. Con un enlace a http://www.google.es y
otro enlace a http://google.com, &iquest; Que te parece ?";
 
$enlaces = new Enlaces($texto);
echo $enlaces->getTexto();
 
/**
 * Se imprime:
 *
Este es un texto de prueba. Con un enlace a <a href='http://www.google.es'>http://www.google.es</a> y
otro enlace a <a href='http://google.com'>http://google.com</a>, &iquest; Que te parece ?
 
 */
?>

Etiquetas: , ,

Las “chuletas” (cheat sheet) todas en un mismo sitio

diciembre 9th, 2009 by Webmaster

El otro día durante el trabajo, necesite realizar una función para sumar y restar fechas. En ese momento no recordaba el orden de los parámetros de la función “mktime()”, por lo tanto, abrí firefox, teclee www.php.net y utilizando el buscador, encontré la documentación de “mktime()”.

Mientras realizaba todo esto pensé, si tuviera a mano ahora una “chuleta” (cheat sheet) con un simple vistazo habría resuelto mi duda. Entonces en ese mismo instante me cree una nota para buscar al final del día una “chuleta” en php.

Cuando me puse a buscarla me encontré con una grata sorpresa. Existe un sitio llamado http://www.cheat-sheets.org/ que ofrece chuletas de todo tipo.

Personalmente me descargue las chuletas de php, javascript y mysql. A continuación dejo los enlaces directos:

PHP: http://www.cheat-sheets.org/#PHP
JavaScript: http://www.cheat-sheets.org/#JavaScript
Mysql: http://www.cheat-sheets.org/#MySQL

Etiquetas: , ,

Notificador de correo electrónico para windows “DynAdvance Notifier”

noviembre 24th, 2009 by Webmaster

Hace algunos días decidí buscar un programa simple pero eficaz para estar atento a los correos electrónicos.

Tenía la costumbre de mantener el programa de correo o el navegador abierto continuamente para revisar el correo de forma continua.

Al cabo del día esto supone una cantidad de tiempo perdido considerable, por este motivo, decidí utilizar un programa que me avisará de la llegada de correo. Así solo lo revisaría cuando fuera necesario. Además no solo lo revisaré cuando llegue, si no, cuando lo que ha llegado me interesa.

Gracias a “DynAdvance Notifier” puedo saber cuando tengo correo nuevo y si me interesa, ya que este programa me indica el asunto de los nuevos emails recibidos.

El programa permite la configuración de varias cuentas y que cada X tiempo estas sean revisadas en busca de nuevos emails.

Yo por ejemplo tengo configuradas varias cuentas, una de ellas gmail y funciona de maravilla.

Para terminar, deciros, que entre las opciones del programa podemos añadir un archivo *.wav, para que se reproduzca en el momento que recibimos nuevos correos.

Descargar DynAdvance Notifier

Etiquetas: , ,

Creación de un widgets para buscar palabras en la RAE (Real Academia Española )

septiembre 25th, 2009 by Webmaster

En igoogle podemos utilizar un widgets llamado “Buscón R.A.E” que permite buscar palabras en la R.A.E ( Real Academia Española ).

Este widgets me pareció útil y decidí crear uno para poder utilizarlo en mis proyectos. A continuación os dejo un ejemplo real funcionando, para que podáis ver como es.

Ejemplo real

Esta realizado con javascript y utiliza un iframe para mostrar los resultados. Estos resultados son simplemente una página que devuelve la R.A.E con el significado de la palabra deseada.

El iframe se crea con un ancho del 100% para que se adapte a cualquier lugar donde se inserte. Evidentemente, cada uno puede cambiar las propiedades del iframe, para adaptarlas a sus necesidades.

La única propiedad que no debemos modificar es SRC, porque si cambiamos esta, no obtendremos resultados de búsqueda.

Para terminar dejo el código de este widgets para que podáis insertarlo en vuestra web, blog, …

JavaScript:

 /**
             * Esta funcion busca una palabra en la RAE (www.rae.es)
             *
             * @palabra: la palabra que deseamos buscar.
             * @div: elemento div del documento html donde queremos crear
             * el ifram con el resultado de la busqueda.
             */
            function buscar(palabra, div)
            {
                //codificar la palabra por si lleva acentos
                palabra = encodeURI(palabra);
 
                //Generar url a la que debemos llamar para obtener
                //el resultado de buscar dicha palabra en la RAE
                var url;
 
                    url = "http://buscon.rae.es/draeI/SrvltGUIBusUsual?";
                    url = url + "LEMA=" + palabra + "&origen=RAE&TIPO_BUS=3";
 
               //Generar iframe con la página de la RAE
               var iframe;
 
                    iframe = document.createElement("iframe");
 
                    //Añadir atributos al iframe creado
                    iframe.setAttribute("scroll", "auto");
                    iframe.setAttribute("frameborder", "0");
                    iframe.setAttribute("width", "100%");
                    iframe.setAttribute("height", "300px");
                    iframe.setAttribute("src", url);
 
               //Limpiar el contenido de result
              limpiarDiv(div);
 
               //Guardar el iframe creado dentro del div indicado
               var result;
 
                       result = document.getElementById(div);              
 
                    //Añadir al div el iframe con los resultados
                    result.appendChild(iframe);
            }
 
            /**
             * Limpiar (eliminar) todos los elementos que contenga
             * el div.
             *
             * @id: identificador del elemento div.
             */
            function limpiarDiv(id)
            {
                var div;
 
                    div = document.getElementById(id);
 
                    while(div.hasChildNodes())
                    {
                        div.removeChild(div.lastChild);
                    }
            }

Html:

<!--
            Buscar con Javascript en la web de la RAE
            www.rae.es
        -->
        <p>
            Buscar: &nbsp;
            <input type="text" id="palabra" /> &nbsp;
                <a href="#"
                   onclick="buscar(document.getElementById('palabra').value,
                                   'resultado');"> buscar </a>
        </p>
        <p>
            <div id="resultado"></div>
        </p>

Etiquetas: , , ,

Utilizar memorias USB para instalar distribuciones gnu/linux

septiembre 20th, 2009 by Webmaster

Vuelvo a “mascodigo” después de un tiempo ausente. Las vacaciones, el trabajo y otros menesteres de la vida diaria me han mantenido alejado.

Desde hace ya algunos años tengo instalado en mi portátil gnu/linux. Por desgracia, no he dedicado mucho tiempo a ver como funciona y como se utiliza, por ello, me considero un usuario novel en este sistema.

Recuerdo hoy la primera vez que instale gnu/linux, fue ubuntu 5.04, un sistema que de primeras me gusto mucho y que se ha convertido en mi distribución preferida.

Desde aquella primera instalación de ubuntu hasta hoy, he descargado e instalado en mi portatil muchas distribuciones, algunas de ellas son: debian, (K)ubuntu, (X)ubuntu, suse, madriva, fedora, centOS, linuxMint, Lin-X.

La mayoría de las distribuciones también las instale en versiones distintas.

Después de lo dicho, queda muy claro, que he utilizado muchos CDs/DVDs que hoy día por ejemplo ya no me ofrecen ninguna utilidad y están cogiendo polvo.

Es por eso, que creo esta entrada, para comentaros como se puede instalar un archivo ISO en una memoria USB y utilizar esta para instalar una distribución, ahorrando CDs/DVDs.

El proceso es bastante sencillo, antes de comenzar necesitamos lo siguiente:

- Memoria USB con el tamaño con un tamaño apropiado.

- Que nuestro ordenador permite arranque por USB.

Si cumplimos los dos requisitos anteriores, podemos continuar. Ahora toca bajar un software llamado “liveusb-creator“, este podemos descargarlo de aquí.

Cuando se haya descargado, lo ejecutamos y tenemos las siguientes opciones:

- Descargar e instalar una distribución fedora.
- Utilizar un archivo ISO ya descargado.

Después solo debemos indicar en que memoria USB queremos instalar la distribución y esperar unos minutos.

Cuando el proceso de instalación haya concluido, solo tendremos que reiniciar el PC con la memoria conectada ( y la BIOS configurar para arranque por USB ) y comenzar la instalación como si estuviera grabada en un CD/DVD.

Etiquetas: ,

Borrar y rellenar el contenido de un div con DOM

agosto 6th, 2009 by Webmaster

Cuando utilizamos javascript para modificar contenido en una página, tenemos varias opciones. Una de ellas es innerHTML.

Esta opción seria maravillosa, porque permite añadir contenido a un div de forma muy simple, ademas permite añadir código html que sera interpretado como tal.

El inconveniente de innerHTML es que no es una función estándar, es decir, esta no se especifica en el estándar de javascript (ECMA-262).

La otra opción es utilizar DOM, de esta forma respetamos el estándar. Por desgracia utilizar DOM es algo mas complicado que innerHTML.

Para solucionar el problema mencionado al principio, manejar contenido con javascript, he creado varias funciones que nos facilitan este trabajo.

Una de ellas se encarga de eliminar todo el contenido de un div y la otra de escribir un texto ( sin código HTML ).

Podéis ver un ejemplo real aquí.

Funciones:

        //Eliminar el contenido de un div
        function limpiarDiv(id)
        {
            var div;
 
                div = document.getElementById(id);
 
                while(div.hasChildNodes())
                {
                    div.removeChild(div.lastChild);
                }
        }
 
        //Escribir en un div
        function rellenarDiv(id, texto)
        {
            var div;
            var nodoTexto;
 
              div = document.getElementById(id);
 
              nodoTexto = document.createTextNode(texto);
 
              //Llamamos a la función limpiarDiv para eliminar el contenido
              //actual del div.
              limpiarDiv(id);
 
              div.appendChild(nodoTexto);
        }

Etiquetas: , , ,

Página siguiente »