¿Cómo aprender programación?

De vez en cuando algunas personas me hablan para pedirme consejo sobre donde empezar en temas de programación, en la mayoría de ocasiones me dicen "Oye Ángel, ¿Sabes de algún tutorial de X lenguaje de programación/librería?.

Parece una pregunta simple y de rápida contestación, pero lo cierto es que me cuesta bastante dar una solución a esta pregunta. ¿Como he aprendido yo a programar? Tampoco lo se con seguridad, lo que si estoy seguro es que no aprendí a programar a través de un tutorial, sino de muchos tutoriales, a parte de mucha práctica, experiencia y Universidad.

Por tanto cuando me hacen una pregunta de este tipo intento ser lo más concreto posible y remitir a un tutorial sobre el lenguaje de programación/librería que me han preguntado, a ser posible siempre de la página oficial del lenguaje de programación/librería.

Pero esto no es suficiente para aprender a programar, para mi hay 2 partes en una buena enseñanza de programación.

  • Los fundamentos o metodologías
  • Lenguajes de programación concretos

Si aprendes los fundamentos te será relativamente simple usar varios lenguajes de programación con un mínimo de adaptación, pero si empiezas aprendiendo un lenguaje de programación carecerás de una buena base, aunque con el tiempo y debido al uso de dicho lenguaje de programación acabarás dominando los fundamentos.

Para los fundamentos no puedo más que poner enlaces a 3 asignaturas que tuve en la carrera

  • Meotodologia y Tecnología de la Programación
  • Programación Orientada a Objetos
  • Tecnologías de Desarrollo de Software

Metodología y Tecnología de la Programación

Programación Orientada a Objetos

Tecnologías de Desarrollo de Software

A continuación listo algunas librerías y lenguajes de programación que he usado, tanto personalmente como profesionalmente (se me quedan algunas tecnologías en el tintero como puede ser ObjectPascal, Ensamblador o Visual Basic, pero no descarto actualizar esta entrada en un futuro), con uno o varios enlaces hacia la documentación o tutorial, que por lo general es la documentación que yo he consultado para dicha tecnología.

PHP

Python

Ruby

HTML y CSS

Javascript

Java

C#

C++

Bases de Datos SQL

Bases de Datos NoSQL

Laravel

Django

Ruby on Rails

Angularjs

Android

libGDX

Box2D

Ogre3D

GTK

Qt

Succinctly

Succinctly son una serie de libros gratuitos editados por la empresa SyncFusion que personalmente me gustan bastante

Jesús Conde

Jesús Conde es un profesor de secundaria que realiza videos en su canal de youtube sobre distintas tecnologías y aunque, a para mi gusto, son algo básicos y se limita a seguir la documentación hay gente a la que le pueden resultar útiles

Por supuesto, falta un recurso importantísimo a día de hoy que no podía faltar y que personalmente me ha resuelto bastantes problemas

StackOverflow

Para todo lo demás Google is your friend

Fortificación de un recurso al estilo ninja para Magento

Hace poco me llegó un trabajo peculiar. Debo proteger ciertos recursos de un servidor Apache pero sin tocar código existente ni añadir código a Magento (que es el gestor e-commerce que usa quien me hizo llegar este trabajo).

El tema se presenta de la siguiente forma

  • Servidor con Apache instalado.
  • Corriendo una versión de Magento al cual no le puedo tocar el código fuente.
  • Sistema sin autenticación de usuarios, por tanto no hay credenciales.
  • Es preferible que el sistema de contraseña no redirija a otra página distinta.
  • El trabajo debe estar listo lo antes posible (horas).

Con unos requisitos tan ajustados hay que echar mano de la imaginación para poder encontrar una solución que se ajuste a las necesidades de lo que me han pedido, así que me puse manos a la obra y aquí voy a comentar un poco por encima el proceso que seguí.

Algunos de los requisitos derivados de la lista superior son los siguientes:

  • No puedo usar ninguna librería javascript (como jQuery).
  • No puedo redirigir a otra página, por tanto he de usar AJAX.

Lo primero de todo es que si no puedo añadir (ni modificar) código a Magento debo ingeniármelas para poder inyectar código sin necesidad de modificar los ficheros fuente. La única forma que se me ocurrió para hacer esto es en el editor de texto que tiene Magento, cuando el usuario va a publicar una nueva entrada/producto. Vale, encontramos una manera de inyectar código "facilmente", a partir de ahora necesitamos crear un sencillo sistema de autenticación en base a contraseñas y proteger los links que enlazan a los recursos a proteger. Este sistema se tiene que llevar a cabo a través de AJAX para mantenernos en la misma página y no redirigir al cliente a otra distinta.

Para esto, a parte de inyectar código (html y javascript) en los enlaces mediante el editor de Magento necesito una comprobación por parte del servidor de que la contraseña es correcta, si la contraseña es correcta entonces el servidor devuelve la URL de descarga y mediante javascript se hace una redirección al recurso.

Aquí está el código que hay que inyectar en cada enlace del editor de Magento

Siento que el código aparezca en una sola línea pero así es como lo programé para que no diese fallos.

Aquí está el fichero php que comprueba que todo es correcto

Llegados a este punto podemos pensar que tenemos lo recursos protegidos.

  • Nos pide contraseña para los recursos.
  • Una vez se ha comprobado que la contraseña es correcta nos devuelve la URL.

La única forma de obtener los recursos sería saber cual es la URL que devuelve el fichero validate.php cuando se ha introducido una contraseña correctamente. Y llegados aquí no es tan difícil averiguar la URL del recurso, si accedemos a las herramientas de desarrollador de un navegador (en mi caso firefox) mediante Ctrl+Shift+C e intentamos acceder al recurso con una contraseña correcta nos encontraremos con lo siguiente:

URL del recurso

Nota: en la demostración de más abajo al ser ficheros txt y no tener ninguna directiva en mi servidor serán mostrados directamente en el navegador, así que para ver la URL de descarga no es necesario hacer lo que comento arriba.

Si pasamos esta URL a nuestros amigos serán capaces de acceder al recurso protegido. Para solucionar esto basta con añadir un fichero .htaccess a la carpeta Download (en mi caso la carpeta se llama así) con el siguiente contenido.

Lo que hacemos es prohibir todo acceso cuya página anterior sea nula o pertenezca a un dominio distinto del nuestro. Esto nos permitirá que si cogemos el enlace y lo pegamos directamente en la barra de direcciones del navegador la página anterior sea vacía y nos devuelva el siguiente texto:

Forbidden

You don't have permission to access /poc/mag/Download/Resource1.txt on this server.
Apache/2.4.9 (Ubuntu) Server at angelluis.zapto.org Port 80

Lo de "página anterior" tiene una explicación técnica y es que el navegador en cada petición envía la cabecera HTTP_REFERER indicando la página desde la cual se refiere.

Por supuesto este método se puede saltar fácilmente modificando la petición que se realiza y añadiendo la cabecera HTTP_REFERER correcta, en este caso el posible atacante se saltaría la medida de "seguridad" de .htaccess. Pero con el tiempo y las limitaciones que me han impuesto poco más se puede hacer. Otra forma distinta de haber configurado el .htaccess podría haber sido mediante mod_rewrite de Apache de la siguiente forma

Lo ideal sería haber hecho una validación completa por parte del servidor y que sea el servidor el que te entregue el recurso mediante la función readfile de php y no que el servidor te devuelva la URL del recurso. Quedaría algo parecido a lo siguiente

Nota: Esta opción no se ha llevado a cabo porque las peticiones por AJAX en principio solo admiten datos de texto plano y no datos binarios por tanto en principio no es posible descargar un fichero por AJAX.

Y ya puestos tener un poco más de tiempo para examinar como está programado Magento para modificarlo y poder usar algún widget más apropiado para la contraseña (con ocultación de caracteres cada vez que introduces un carácter) y otra reforma sería implementar un sistema de autenticación de usuarios y que la contraseña dependa tanto del usuario como del recurso que se quiere descargar.

Por supuesto, este sistema es válido para todo aquél sitio que permita introducir etiquetas HTML y javascript, y este blog es un ejemplo de ello.

Aquí dejo la demostración (contraseñas 1234 y 4321 respectivamente)