Tesla – AC/DC

El 10 de julio se “celebro” el natalicio de Nicola Tesla.

IMG-20160908-WA0003

Esta imagen emblema su lucha mas significativa(vs Edison).

Actualmente la compañía Tesla Motors tiene fuerte rivalidad VS Apple Computers, de la cual yo le apuesto a Tesla Motors ya que desde mi punto de vista es la que realmente se esta enfocando en desarrollar tecnologías nuevas en estos Autos que se conducen solos.

Pero tú ¿que opinas?.

Humor – pro Java

IMG-20170331-WA0001

Un poco de humor pro-java, en ocasiones defendemos a capa y espera determinado lenguaje, en lo personal considero que: el lenguaje no hace al programador(su calidad) pero si afecta directamente el producto final(el software), sin embargo también considero que los lenguajes cada vez van tendiendo a ser mas ergonómicos respecto la mente humana, no hace falta recordar la opinión que tenia Dijkstra respecto a la estructura GOTO.

WiFi-Manager Beta – un wrapper netsh wlan

wifi-manager-beta

MS Windows cuenta con una herramienta netsh en su espacio wlan, podemos obtener información y configurar parametros para redes inalambricas.

A partir de esta herramienta me puse a diseñar una aplicación(tipo wrapper) que permita administrar redes inalambricas, por lo cual he denominado a la herramienta wifi-manager, aunque de momento es una versión Beta creo que se pueden hacer cosas interesantes:

Aplicación:  https://sourceforge.net/projects/wifi-manager/

Código fuente: https://github.com/mundoSICA/wifi-manager

En este post voy agregar algunos comandos básicos de netsh wlan de los cuales me basare para desarrollar las siguientes versiones de wifi-manager.

netsh herramienta para Windows

Un poco de la teoria de fondo que se se esta usando para la herramienta e ideas para implementar a futuro para Wifi-Manager.

Todos los comandos a continuación los puede ejecutar desde el cmd de Windows.

Viendo las interfaces inalambricas existentes en nuestro equipo:

	netsh wlan show interfaces

Controladores disponibles:

	netsh wlan show drivers

Redes disponibles:

	netsh wlan show networks

Redes disponibles viendo la potencia en la señal:

	netsh wlan show networks mode=bssid

Viendo los perfiles guardados:

	netsh wlan show profiles

Viendo los datos detallados del perfil “red_x”

	netsh wlan show profile name='red_x' key=clear

Donde red_x es el SSID de la red.

Conectarse a un perfil ya existente

	netsh wlan connect name=red_x

Exportando la configuración de redes inalambricas

Podemos exportar todas las configuraciones en archivos **xml** con la siguiente instruccion:

	netsh wlan export profile folder=. key=clear

Importando deternmianda configuración

	netsh wlan add profile filename="F:\Wi-Fi-Router.xml" user=all

Red Inalambrica hospedada

El concepto de redes inalámbricas hospedadas se introdujo en MS Windows 7. Usando esta funcionalidad, podemos crear una conexión para hospedar clientes, algo parecido a un hotspot.

Nota para la red hospedada se requiere de privilegios de Administrador.

	# Creando la red modem con password 123456789
	netsh wlan set hostednetwork mode=allow ssid=modem key=123456789
	# Iniciando el servicio
	netsh wlan start hostednetwork
	# Mostrando información de la red (p.e. # de clientes)
	netsh wlan show hostednetwork
	# Mostrando la contraseña de la red
	netsh wlan show hostednetwork security
	# Deteniendo el servicio
	netsh wlan stop hostednetwork

Conclusiones:

Como podemos ver, la herramienta netsh es bastante útil,de la cual podría agregar varias funcionalidades,pero… me gustaría saber ¿cual de los comandos vistos previamente te gustaría que incorpore en la siguiente versión de wifi-manager?,se me ocurre agregar el soporte para crear algo como un hotspot, pero dejen sus comentarios =).

Inyecciones SQL, (como prevenir)

sql_injection_vulnerable
Es común encontrarnos con aplicaciones vulnerables a inyecciones SQL, estos ataques se deben a que los desarrolladores omiten la tarea de validar los datos introducidos por los usuarios, veamos un ejemplo de una aplicación vulnerable y luego veamos como prevenir inyecciones, usted puede descargar el código fuente desde:
https://gist.github.com/fitorec/9b8312d83a2b4aa902b38aee4a067962

La aplicación consta de la siguiente estructura:

src/
`-- inyeccionsql
    |-- BD.java
    |-- InyeccionSQL.java
    |-- LoginVista.fxml
    |-- LoginVistaController.java
    |-- base_datos.sql
    `-- style.css

El archivo de base_datos.sql contiene el esquema la cual contiene una sola tabla con nombre usuarios:

CREATE TABLE `usuarios` (
	`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`username` VARCHAR(15) NOT NULL UNIQUE KEY,
	`password` CHAR(32) NOT NULL ,
	`fecha_nacimiento` DATE NOT NULL
) ENGINE = InnoDB;

-- Agregando dos usuarios

INSERT INTO `usuarios`
	(`id`, `username`, `password`, `fecha_nacimiento`) VALUES
	(NULL, 'fitorec', 'ABC123456...', NOW()),
	(NULL, 'pepe_grillo', 'ABC123456...', NOW());

BD.java Es una clase singletón que se encarga de la conexión a la base de datos, mientras que InyeccionSQL.java es la clase principal y solo se encarga de iniciar la aplicación, mandando abrir una escena con el contenido de LoginVista.fxml de la cual su controlador es LoginVistaController.java  esta tiene el método accionLogin encargado de validar el login como podemos ver en el siguiente código:

    @FXML
    private TextField username;
    @FXML
    private PasswordField password;
    @FXML
    private void accionLogin(ActionEvent event) {
        try {
            String sql = "SELECT * FROM usuarios "
                + "WHERE username='"+username.getText() + "'"
                + " AND password='"+password.getText()+"'";
            PreparedStatement ps = BD.getConexion().prepareStatement(sql);
            ResultSet r =  ps.executeQuery();
            if (r.next()) {
                String uname = r.getString("username");
                label.setText("Bienvenido: " + uname);
            } else {
                label.setText("Login invalido");
            }
        } catch(Exception e){
            label.setText("Error SQL");
        }
    }

En el ejemplo podemos ver como concatenamos literalmente el contenido de los inputs username y password, ¿pero que pasa si un usuario mal intencionado agrega los siguientes datos, para el username x y para el password x' OR 1='1?, esto nos genera la consulta:

SELECT * FROM usuarios
       WHERE username='x' AND password='x' OR 1='1';

login_correcto

Dicha consulta es conocida como “siempre cierta” y nos dará un acceso correcto al sistema,incluso podríamos concatenar la consulta con un DROP o TRUNCATE, como se muestra en la siguiente imagen =).
exploits_of_a_mom.png

Pero.. como evitar esto

private void accionLogin(ActionEvent event) {
        try {
            String sql = "SELECT * FROM usuarios "
                + "WHERE username=?"
                + " AND password=?;";
            PreparedStatement ps = BD.getConexion().prepareStatement(sql);
            ps.setString(1, username.getText());
            ps.setString(2, password.getText());
            ResultSet r =  ps.executeQuery();
            if (r.next()) {
                String uname = r.getString("username");
                label.setText("Bienvenido: " + uname);
            } else {
                label.setText("Login invalido");
            }
        } catch(Exception e){
            label.setText("Error SQL");
        }
    }

Del código previo podemos ver como creamos la consulta dejando el valor de los parámetros username y password como argumentos que posteriormente pasaremos(ver ? en las lineas 4,5) luego posteriormente en las lineas 7 y 8 pasamos los valores por medio de los métodos setText este metodo realiza los escapes adecuados y si agregamos como password el valor x' OR 1='1 al realizar los escapes se convertirá en algo como :

SELECT * FROM usuarios
      WHERE username='x' AND password='x\' OR 1=\'1';

Como conclusión en general debemos de limpiar todos los datos introducidos por el usuario ya que este es el medio por el cual las aplicaciones suelen fallar.

cmdchallenge.com Desafios en el CLI BASH

Hace un tiempo  un amigo @root_w33d me aviso que existia un proyecto conocido como “cmd challenge” (reto en comandos):

Cuando vi el mensaje me puse a revisar el proyecto el cual se me hizo muy interesante, tras una larga noche de bastante café, complete los desafíos:

cmdchallenger
https://cmdchallenge.com

Como no es mi intensión spoolear las respuestas, solo voy a poner las que considere interesantes, cabe mencionar que si revisas el repositorio del proyecto en github puedes ver las respuestas de cada desafió en la URL:

https://github.com/jarv/cmdchallenge/blob/master/challenges.yaml

remove_duplicate_lines

Description:

Print the file faces.txt, but only print the first instance of each
duplicate line, even if the duplicates don't appear next to each other.
Note that order matters so don't sort the lines before removing duplicates.

Consiste en imprimir las lineas de un archivo faces.txt(de 31 lineas) sin imprimir las lineas repetidas manteniendo el orden.

Fue entonces que de inmediato pensé en el comando uniq el cual en teoría elimina las lineas repetidas sin embargo, creo que no funciona del todo correcto cuando existen caracteres especiales, de tal forma que el resultado de:

uniq faces.txt

Nos devuelve 28 lineas lo cual me indicaba que eliminaba 3 lineas.

Cabe mencionar que el resultado esperado consta de 24 lineas, por un momento pensé que quizás el problema es que como las lineas repetidas no estaban continuas pues por eso el uniq no funcionaba bien, asi que pensé en ordenar y luego eliminar los elementos repetidos para ver que pasaba:

sort faces.txt | uniq

lo cual ya me genera las 24 lineas el problema ahora es que al ordenar, se pierde la secuencia, así que opte por ejecutar:

cat -n faces.txt | sort -k2 -u | sort | cut  -f2- 

el cual realiza el siguiente procedimiento:

  • cat -n faces.txt imprime las lineas agregando el numero de linea (algo similar a ejecutar nl faces.txt)
  • sort -k2 -uOrdena eliminando las lineas repetidas(-u) a partir del 2do parametro(-k2)
  • sortSimplemente ordena, regresando el orden del archivo.
  • cut -f2-Corta la salida a partir del parámetro 2.

Cabe mencionar que la respuesta oficial del repositorio es awk '!x[$0]++' faces.txt pero como todos sabemos en bash podemos hacer las cosas de muchas maneras 😉

Por otra parte hoy que escribí el post me doy cuenta que hay nuevos desafíos, así que asta aquí los dejo, ya que me pondré a jugar un ratito, esperando posteriormente escribir nuevas soluciones que me parecieron interesante =).

Ejemplo Modulo joomla con control de calendario

En ocasiones requerimos en nuestros sitios datos insertados por los usuarios, afortunadamente Joomla! cuenta con una serie de elementos que hacen mas amena esta tarea, el día de hoy quiero explicar como insertar el calendario de Joomla! tal y como lo vemos en la parte administrativa en las opciones de publicación al editar un articulo.

calendario joomla

calendario joomla

Este articulo ha sido movido a:
http://www.mundosica.com/blog/2013/agregando-el-calendario-de-joomla-a-nuestras-campos-de-formularios/