jueves, 18 de diciembre de 2008

Compilando en PHP

Aunque esto no sea novedad para algunos, en PHP también podemos "compilar" el código, gracias a una extensión de PEAR(PHP Extensión and Application Repository) llamada bcompiler; ¿el porqué coloco compilar entre comillas?: porque en realidad bcompiler no compila, sino que genera los "bytecodes" que php normalmente genera para ejecutar los scripts en memoria.

Para los que conocen JAVA sabemos que los bytecodes son un semi-lenguaje de máquina optimizado para una rápida lectura y ejecución por medio de las denominadas "Máquinas Virtuales" como lo es JAVA, y últimamente .NET Framework, entre otras.

En el manual sobre bcompiler (en inglés) se trata de la compresion del bytecode, y para configurarlo se requiere de muchas cosas que decidí omitir; lo que pasa es que el bytecode resultante del script puede ser incluso más del doble del tamaño (en bytes) que el archivo fuente original, ¿por qué?: simplemente porque en el bytecode se especifican muchos más datos, además del algoritmo en sí, de modo que la máquina virtual pueda traducirlo al lenguaje de máquina de la máquina (valga la redundancia) en donde se ésta ejecutando, como la mundialmente conocida arquitectura x86.

Instalación

Windows: En paquetes como WAMP y XAMMP (windows), ésta librería ya viene incluida, sólo basta instalar/configurar primero PEAR y luego incluir en el archivo de configuración php.ini la línea: extensión=php_bcompiler.dll en "dynamic extensions", PEAR no es realmente necesario, pero puede ser que necesiten de algunas funciones de PEAR.

GNU/Linux: aquí es otra Historia, pueden probar si el paquete XAMMP para linux trae la librería, pero no se los aseguro, además con PEAR lo puende instalar, de todos modos intente añadir al archivo de configuración php.ini: extensión=bcompiler.so y luego pruebe con phpinfo(); si la extensión bcompiler aparece (debe reiniciar apache).

Ubuntu 8 LTS: con el APACHE/PHP instalados por synaptic, instale los siguiente paquetes por
synaptic:

  • pear
  • php5-dev
  • bzip2
  • libbz2-1.0
  • libbz2-dev
  • libzip1
  • libzip1-dev
  • pbzip2
Una vez instalados abra el terminal (consola) y ejecute (le solicitará contraseña del administrador):

sudo pecl install bcompiler-0.8.tgz

Añada al archivo de configuración php.ini: extensión=bcompiler.so
Reinicie apache y compruebe que aparece la extensión bcompiler por phpinfo();

¡Manos a la Obra!

Para precompilar nuestro primer script necesitamos 3 archivos (origen.php, destino.php, compila.php); en origen.php estará el código fuente, a destino.php debe otorgarle PERMISOS DE ESCRITURA (GNU/Linux), y en compila.php coloque lo siguiente:

<?php
$fh = fopen("destino.php", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "origen.php");
bcompiler_write_footer($fh);
fclose($fh);
?>

Sólo basta ejecutar desde el explorador http://localhost/compila.php y si no aparecen errores está listo!: ejecute http://localhost/destino.php y aparecerá lo mismo que en origen.php, pero si revisa el código de destino.php notará que ya no es el mismo código, sino un conjunto de datos incomprensibles.

Puede incluso compilar todo tu sistema en php y puede utilizar ambos archivos: los bytecodes o los normales, bcompiler se encarga de todo, puede incluso hacer include y require a un archivo bytecode php de bcompiler, ambos pueden tener la extensión ".php".

Eso sí: se puede duplicar el tamaño en bytes del sistema, pero el rendimiento es el mismo: los no-compilados deben de interpretarse y luego compilarse en memoria antes de ser ejecutados; los precompilados "pesados" pasan a memoria inmediatamente, y si utiliza bytecodes comprimidos tienen que "descomprimirse" y ejecutarse. así que básicamente el rendimiento de su sistema no variará mucho.

El único detalle sería el comportamiento de __LINE__ y de los reportes de errores, como es una extensión experimiental puede ser que el valor retornado por éstas funciones no sea el mismo que cuando se ejecuta un script normal (no precompilado); por eso le recomiendo evaluar bien todo su código antes de precompilarlo.

lunes, 6 de octubre de 2008

Instalando... Postgres en Ubuntu GNU/Linux

Instalar Postgres en GNU/Linux no es tan sencillo como en windows, en este post sólo trataremos de instalarlo en Ubuntu 8.04 GNU/Linux que también aplica para el Debian 4 de donde deriva éste.

1) En aptitude o synaptic instala los siguientes paquetes:
  • postgresql (la última versión disponible 8.03)
  • postgresql-client (generalmente es requerido por el anterior y se instala al instalarse el postgres)
  • pgAdmin3 (última versión)
  • php5-pgsql (para conectarse desde PHP)
Te recomiendo synaptic, es más cómodo; luego de instalar los paquetes para utilizar postgres hay que cambiar la contraseña del usuario administrador en postgres y la del usuario postgres en ubuntu, es decir, son 2 usuarios: uno de la base de datos y uno del sistema operativo; en principio trata de elegir una contraseña simple si lo que quieres es desarrollar, cuando instales tu aplicación y la base de datos en el equipo donde se ejecutará elije una contraseña compleja, no lo olvides.

2) Cambiando la contraseña del usuario administrador de postgres (postgres): abrimos el terminal y tecleamos:

sudo su postgres -c psql template1 (te pedirá la contraseña del administrador del Sistema root)

ALTER USER postgres WITH PASSWORD `password´; (colocamos la contraseña)

\q

3) Ahora cambiamos la contraseña del usuario postgres del sistema operativo en la misma consola, puede que nos vuelva a solicitar la contraseña del root:

sudo passwd -d postgres

sudo su postgres -c password (omite este paso si el anterior te muestra: password changed o contraseña cambiada)

¡Y listo!, con esto podremos utilizar postgres y abrir pgadmin, puede que tengas que reiniciar el servicio del postgres desde la consola:
sudo /etc/init.d/postgresql-8.3 restart.

Ésta es la conflagración básica del postgres que SÓLO ADMITE CONEXIONES LOCALHOST lo que quiere decir que el servicio postgres ésta cerrado a conexiones remotas, lo que es muy útil cuando se utiliza con PHP ya que éste se conecta de modo local y evitamos que se conecten a nuestra base de datos de afuera, si quieres que el servicio postgres admita conexiones externas (remotas) puedes seguir los pasos de la siguiente guía omitiendo los anteriores que yo expuse aquí: Linuxsan- Instalando Postgres en Ubuntu

Y hasta aquí esta pequeña pero útil guía para comenzar con postgres.

domingo, 5 de octubre de 2008

Scareware, Una FALSA amenaza

ESTO ES FALSO, NO SE DEJE ENGAÑAR¡ATENCIÓN!, las nuevas formas de ataques informáticos cada día son de lo más impresionantes, una de éstas es la denominada "scareware" o "software de susto", que consiste en un falso mensaje de un sitio web en que se le notifica al usuario que su computador ésta infectado, y en el cual le recomienda instalar un programa para supuestamente desinfectarlo como en la imagen de éste post que parece convincente, tal cosa no existe, lo único que se le asemeja es el servicio en línea de panda labs para escanear el equipo, pero éste servicio no notifica hasta instalarse la presencia de algún virus, por lo que usted debe ignorar cualquier mensaje o popup que le muestre que su equipo está infectado.

Hablando en términos de programador Javascript no tiene el acceso suficiente al sistema de archivos para "realmente" verificar si el equipo ésta infectado (a menos que el Script Host esté activado y el script con VBScript, pero eso ya es historia), además ¿cuanto tiempo tarda su antivirus en analizar su disco o la memoria completa? mínimo minutos, no segundos e imagine cuanto tardará el supuesto script en descargar la lista de firmas de virus si mínimo la del panda que tengo hasta hoy ¡pesa 8 MB!, es decir, úse la lógica, ni firefox ni Microsoft IE ni algún otro navegador podrán avisarle que su equipo está infectado.

Así que pendiente, ignore todo aquello que supuestamente le recomiende descargar "falsas soluciones", los antivirus nunca le preguntarán por la descarga de un programa, ellos sólo actualizan su firma y motor de búsqueda, y en el caso del servicio de panda labs éste debe instalarse primero, NUNCA le avisará antes.

sábado, 4 de octubre de 2008

Seguridad en PHP: Inyecciones SQL

Como lo prometido es deuda, voy a segmentar el tema Seguridad PHP en varias partes, debido a que es un tema delicado y en que debo enfatizar en el porqué de cada medida de seguridad.

Entrega 1: Inyecciones SQL

¿que qué es una SQL Inyection?: es un método para alterar la cadena SQL y que el interprete de la base de datos ejecute otras acciones perjudiciales para el sistema; la más simple que voy a explicar aquí trata de vulnerar a la mayoría de los sistemas que INICIAN SESIÓN desde una tabla en su base de datos; debo aclarar que ésta técnica NO ES CORRECTA para empezar, pero como la mayoría lo ha echo así, no me queda más remedio que indicarles las providencias necesarias para resolver éste problema.

Supongamos que su sentencia para iniciar sesión sea esta:
$usuario=$_POST['usuario'];
$contra=$_POST['contra'];
$sql = "SELECT * FROM usuarios WHERE user='".$usuario."' AND password='".$contra."';";
if (mysql_fetch_array(mysql_query($sql,$coneccion))) {
//acceso al sistema
}

Como podemos ver ésta sentencia devuelve TRUE en el caso de que se encuentre el usuario y la contraseña correctos dándole acceso al sistema, pero en el caso de que sea un cracker el que envía un formulario falso en donde coloque en la variable del POST $usuario el siguiente valor: ' OR 1=1 #
Pues sencillamente el carácter de apóstrofo (') cerraría la cadena en SQL y con el OR 1=1 quedaría que user='' OR 1=1 que devuelve TRUE y para rematar el carácter numeral (#) que en la mayoría de las bases de datos es el de comenzar comentarios, lo que significaría que se ignoraría el resto de la consulta quedando así para el interprete SQL: SELECT * FROM usuarios WHERE user='' OR 1=1 y por ende el resultado sería TRUE, otorgándole acceso al sistema.

¿Cómo puede ser?, ¿hay manera de evitarlo?, Las Magic Quotes activadas en PHP en la MAYORÍA DE LOS CASOS lo resuelven, pero ésta no es la única forma de SQL Inyection que existe y las Magic Quotes no lo resuelven todo, consulten el manual de PHP (Tópico: Seguridad en bases de datos/Inyección SQL) y verán lo que es bueno...; en fin, les daré los consejos fundamentales para evitar un SQL Inyection:
  • Revisa que no existan cadenas ni caracteres como éstos: (OR, AND, ', -- y #) en las variables del POST.
  • Escapa las cadenas con mysql_real_escape_string o addslashes ¡es mejor que las magic quotes!
  • Si la variable es numérica, verifica que lo sea con is_numeric().
  • NUNCA utilices al usuario administrador de la base de datos, crea uno con el acceso y privilegios necesarios.
  • HASHEA las contraseñas ¡por favor!, si no sabes de que te hablo busca en google Hash o MD5 y con eso te digo todo.
  • No vuelvas a iniciar sesión así en tus futuros sistemas, de ser posible utiliza el sistema de privilegios de usuario y crearle un usuario de base de datos a cada usuario; ésta es la forma correcta de hacer las cosas, tarda mucho lo sé pero te da un sinfín de ventajas.
Y con esto doy por terminada la primera entrega de Seguridad en PHP ¡No apto para novatos!, espero que tu cerebro quede lo suficientemente aturdido como para seguir mis consejos, ¡hasta la proxima!.

viernes, 3 de octubre de 2008

Confirmado! resuelto el Problema del Path en JAVA con JAR's

Desde que me quedé con la espinita de lograr el App.Path en Java con un *.JAR en Ubuntu 8.04 por otros medios, investigué más y lo encontré, el problema es que NO FUNCIONA cuando ejecutas el proyecto en NetBeans porque él lo ejecuta desde memoria, pero SI FUNCIONA DESDE FUERA jajajaja, pruébalo y veraz, en windows también funcionó igual ejecutando el *.JAR fuera del NetBeans. Eres muy Afortunado, muy pocos lo han conseguido y en Google solo aparecen 2 link's en inglés que se acercan. Bueno, como lo prometido es deuda:

java.io.File arc = new java.io.File(System.getProperty("java.class.path"));
try{
this.jTextField2.setText(arc.getAbsolutePath().replace(arc.getName(), ""));
catch (Exception ex){}

a diferencia del System.getProperty("user.dir") el System.getProperty("java.class.path") le indica al JRE de Java que devuelva la identificación de la ruta en donde las clases se almacenan, que es por ende el directorio donde está nuestro *.JAR.

Recuerda que sólo funciona fuera del NetBeans, así que para depurar podrías utilizar una variable pasada como argumento y utilizar user.dir que dentro del NetBeans si devuelve el path del proyecto, asi que concatena con "/dist/turecurso.ext".

Funcionó perfectamente en Ubuntu 8.04 y Windows XP con cuentas limitadas. Hasta la próxima y corre la voz sin olvidar dar crédito a mis aportes.

Editando la Plantilla del Blogger

Desde que elegí esta plantilla en el blogger siempre me dio curiosidad el poder modificarla, se puede hacer claro, pero lo que yo quería era ensancharla un poco y lo logré, pero el detallito eran las imágenes de fondo, las tuve que descargar y modificarlas en el GIMP.

Probé creando una entrada borrador en el blogger y subiendo las imágenes pero no funcionaba, hasta que las cargué en el servicio gratuito http://www.imageshack.us/ que me permitió hacerlo, no me cobraron medio y espero que no me cancelen la subscripción; si quieren saber como le hice para averiguar rápidito el CSS de la plantilla EN LINEA utilicen Firefox3 e instalen el complemento Firebug, ¡es genial!.

jueves, 2 de octubre de 2008

Liberado MySQL 5.0 Actualizado

Desde el 1 de Agosto de este año 2008, está disponible la última actualización del Servidor de bases de datos MySQL Comunitario, todavía no están claros los términos de la licencia de la versión 6, desde que Sun adquiriera en el 2006 a MySQL AB por 1000 millones de dólares (poquito no XD); por no más decir que hay que registrarse para descargarlo desde el site: http://dev.mysql.com/downloads/mysql/5.0.html además que los mirrors de la comunidad de software libre tienen la versión anterior.

¿porque Sun no libera la 6.0 para la comunidad?, según porque están desarrollando un paquete LAMP (Linux, Apache, Mysql y PHP/Perl) junto con la comunidad de NetBeans aportándole las grandiosas funcionalidades de Java.

Mi experiencia con MySQL no fue del todo grata (con mi Tesis en la Universidad), tiene muchos errores en cuanto a los resultados con group by, por supuesto que es mejor que la "base de datos" de ustedes saben quien, la de las llavecitas (si a éso se le puede llamar base de datos); Yo personalmente abandoné el desarrollo con MySQL por el de Postgres, es más robusto, definido, potente, etc. A fin de cuentas MySQL debe su popularidad a la velocidad y facilidad de uso, pero cuando vean Postgres (conmigo por supuesto) van a entender porque tome esa decisión.

Día Internacional de la No Violencia, Octubre 2

Unamos este gran día para decir NO a la Violencia: http://pazfuerzayalegria.net/spip.php?article276

Este día fue decretado por la ONU en resolución el 15 de Junio de 2007, en homenaje al nacimiento del autor de éste movimiento Mahatma Gandhi

¿Cómo crear un JAR facilito en JAVA?, con un IDE porsupuesto

Primero debemos saber que es un *.JAR, simplemente es un “ejecutable” de nuestra aplicación en Java, pero en realidad, aunque ustedes no lo crean es un archivo contenedor que comprime todos los archivos *.class de nuestro programa; si no me crees intenta abrir uno con WinZip y verás. La tecnología Java se basa en el uso de la denominada “máquina virtual” que se encarga de procesar los byte-codes (archivos compilados en lenguaje intermedio de java o *.class) y llevarlos al código de máquina de la plataforma donde se instaló el VM de Java o JRE (Java Runtime Environment), es el mismo principio que ahora sigue el .NET Framework, pero Java como todos sabemos es más robusto y eficiente, además que funciona PERFECTAMENTE en Windows, Unix, Solaris, MacOS, GNU/Linux y en varias plataformas x86, AMD2, AS400, etc.

IDE's (Entorno de desarrollo integrado) hay muchos, eclipse, websphere, etc. pero el que está marcando la diferencia es el NetBeans, que va ya por su versión 6 y lo mejor que ofrece es su diseñador visual de Formularios Swing intuitivo y manejable; ¿que qué es Swing? Pues es una librería que hereda las funcionalidades básicas de awt (X windows toolkit) que ofrece controles para generar GUI's (Interfaces de usuario) dinámicas y extensibles; lo malo de Netbeans es que ésta disponible sólo en Inglés.

¿Donde consigo NetBeans?, para Ubuntu y Debian GNU/Linux es sencillo, puedes buscarlo por aptitude o synaptic, además se instala el Java2 SDK6.x porque el paquete de NetBeans lo marca como requerido, no creo que tengas problemas con GNU/Linux.

Para Windows, descarga PRIMERO el Java2 SDK6.x: https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u7-oth-JPR@CDS-CDS_Developer pesa aproximadamente 200 MB.
Ahora descarga el NetBeans 6.x: http://download.netbeans.org/netbeans/6.1/final/ selecciona el tipo de windows, y preferiblemente la ultima opción “all”, pesa aproximadamente 260 MB.

MANOS A LA OBRA

En NetBeans crear un *.JAR es sencillo: menu File/New project, eliges categoria “Java” de ésa “Java Desktop Application”, das clic en Next y elije el nombre, directorio, etc. después “Finish”.

El NetBeans te crea el dialogo principal y el código de arranque necesario para tu aplicación, solo basta crear la aplicación (algo papita XD jajaja) y para crear el *.JAR sólo basta: menú Build/Build main Proyect y listo, aparecerá el directorio “dist” en el directorio donde creaste tu proyecto, en él se encontrará el JAR de tu programa: nombreprograma.jar.

¿Como lo ejecuto fuera del NetBeans?, en windows el JRE lo configura automáticamente, solo basta darle doble click y listo, en Ubuntu.. es otra historia, hay que usar el comando: “java -cp . -jar rutaarchivo.jar” exactamente como ésta desde la consola, pero para hacerlo que funcione con doble clic como en windows, sigue los siguientes pasos:

1 – con el botón derecho has click en el archivo *.JAR de tu programa. Selecciona: “Abrir con otra aplicación” o “Abrir con
2 – en el dialogo “Abrir con” despliega la lista inferior “Usar un Comando Personalizado” y escribe exactamente: “java -cp . -jar CON UN ESPACIO AL FINAL INPRESCINDIBLE. (como en la imágen anterior)
3 – has clic en Abrir y listo!!!, automáticamente todos tus JAR se abrirán al doble clic como en windows.

Esto es todo por hoy, luego publicaré las primeras conchitas de mango con Swing como la de los formularios Modales, ¡hasta pronto!

miércoles, 1 de octubre de 2008

Los Cuentos de Beedle el Bardo en ESPAÑOL

Salamandra ha anunciado el lanzamiento mundial de los Cuentos de Beedle el Bardo en español para el 4 de diciembre de este año 2008; únete a mi grupo de facebook:
http://www.new.facebook.com/group.php?gid=90808340164&ref=share

para mayor info: http://bloghogwarts.com/2008/10/01/confirmado-beedle-el-bardo-en-espanol-el-04-de-diciembre/