gentoo linux, java, software libre y otras hierbas
ago, 02 2008 - 3:37 am

La mediocridad de los ingenieros (¿reir o llorar?)

Nota: este artículo te podría interesar si deseas saber cómo solucionar problemas de seguridad de manera “profesional“.

De pequeño siempre quise ser Ingeniero de Sistemas… ahora, con 19 años ya llevo 6 semestres (de 10 aquí en Colombia), aún cuando no he estudiado por 2 años falta de dinero, ya no se que quiero hacer.

Con algo que llevo de experiencia mezclándome con “ingenieros” me da algo de tristeza ver cómo de cada 20 hay 1 que vale la pena. Los demás son personas que no tienen puta idea de lo que hacen, estudiaron esto no por vocación sino porque piensan que se van a forrar en dinero, y además se creen Dioses que todo lo saben (aún cuando dedican la mayor parte de su tiempo laboral chateando con el MSN, volviéndose maestros en el uso del Facebook, o perdiendo el tiempo de cualquier otra manera).

La verdad es que hace tiempo quería escribir algo sobre esto, pero no lo hacía simplemente porque muy seguramente los lectores asiduos de este humilde blog no tienen nada de mediocres, y los ingenieros (a quienes iría dirigida la entrada) ni siquiera saben lo que es un puto lector de feeds, o me leerían usando IE 6.0 (no saben que existen “otros”) que a veces no carga bien esta página.

La historia… (aprende a solucionar problemas de seguridad)

Hace una semana entré a la página web del sistema de transportes colombiano Transmilenio, y descubrí que el sistema de búsquedas era vulnerable a ataques XSS y al famoso SQL Injection, por lo cual procedí (después de jugar un par de horas y descubrir ciertos datos interesantes) a avisar del fallo.

La cosa iba así para un XSS:

hola%' or title like '%hola> <script>alert(/POWNED/)</script><a

Y así para un SQL Injection:

hola%' UNION select * from NOMBRE_TABLA where 1=1 or 1 like '%1

Lo cierto es que esto es algo que se puede solucionar fácilmente, haciendo una limpieza a las variables antes de realizar una búsqueda en la base de datos, pero nuestros super ingenieros (que ni siquiera dieron las gracias) encontraron una mejor solución (la más óptima): deshabilitar las búsquedas.

Y aquí es donde no sé si reir o llorar. Poca vergüenza tiene esta gente, y lo peor es que los hay por montones. Muy triste…

También te podría interesar este artículo: Devolver el orgullo al nombre de “programador” para solucionar el déficit de programadores publicado en Punto de partida

Bonus…

P.d. esta es una entrada programada escrita el Viernes 1 de Agosto de 2008. Solo para dejar terminar la semana y ver si lo solucionan.

31 Comentarios | deja el tuyo

jul, 17 2008 - 4:05 pm

Enlaces recomendados

Algunos enlaces interesantes que me deje en el tintero gracias a mi anterior proveedor de hosting:

5 Comentarios | deja el tuyo

jul, 15 2008 - 2:56 am

Crear una conexión JDBC

Lo primero que necesitaremos son los drivers JDBC en formato jar, incluir este archivo jar en el CLASSPATH de nuestro proyecto y cargarlos en memoria:

Oracle: JDBC Download page Oracle

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

MySql: MySQL Connector J

Class.forName("com.mysql.jdbc.Driver").newInstance();

Para crear la conexión, necesitamos una url JDBC, la cual contiene toda la información necesaria para conectarse:

Oracle: necesitaremos saber el host (el nombre de la máquina o su IP), el puerto de escucha del listener de Oracle (1521 por ejemplo), el servicio o sid, el usuario y la clave. Diferentes formatos de la url JDBC pueden ser:

jdbc:oracle:thin:@host:puerto:sid
jdbc:oracle:thin:usuario/clave@host:puerto:sid
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))
jdbc:oracle:thin:usuario/clave@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=puerto)))(CONNECT_DATA=(SERVICE_NAME=servicio)(SERVER=SHARED)))

Más información en FAQ JDBC Oracle: Connections

MySql: host (nombre de la máquina o su IP), puerto de escucha (3306 por defecto), nombre de la base de datos, usuario y clave. El formato de la url es:

jdbc:mysql://host:puerto/database
jdbc:mysql://host:puerto/database?user=usuario&password=clave

(Más información en MySql JDBC Reference)

Una vez tengamos la url JDBC, podemos crear la conexión contra la base de datos:

Connection connection = DriverManager.getConnection(ulr, usuario, clave);

Si la URL ya contiene el usuario y la clave (hay formatos que ya la llevan):

Connection connection = DriverManager.getConnection(ulr);

Con el objeto connection ya podemos trabajar, sin olvidarnos de que una vez hemos acabado, hay que cerrar la conexión. Esto es muy importante hacerlo, ya que si se queda abierta, estamos desaprovechando recursos, creando lo que se llama connection leaks (conexiones perdidas) con la base de datos. La mejor forma de hacerlo es englobar todo el código en una estructura try/catch/finally y efectuando el cierre de la conexión en el finally. De esta manera nos aseguramos de que falle o no falle el código, se cerrará la conexión.

Connection connection;
try {
    // ...
    connection = DriverManager.getConnection(ulr);
    // ...
} finally {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
			      e.printStackTrace();
        }
    }
}

Veamos ahora un par de ejemplos completo. Para Oracle definimos una url que incluye el usuario y la clave, por lo que no necesitaremos pasarle esta información en el método getConnection():

import java.sql.*;

public class OracleConnection {
    public static void main(String args[]) {

        String usuario = "vil";
        String password = "secreta";

        String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
        String puerto = "1521";
        String sid = "prueba";

        String driver = "oracle.jdbc.driver.OracleDriver";

        String ulrjdbc = "jdbc:oracle:thin:" + usuario + "/" + password + "@" + host + ":" + puerto + ":" + sid;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc);

            // Ya tenemos el objeto connection creado

            ResultSet result = connection.createStatement().executeQuery("SELECT 'hola mundo' FROM DUAL");
            result.next();
            System.out.println(result.getString(1));

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}

Y para MySQL (usaremos una url sin usuario y clave, por lo que pasaremos esta información al método getConnection):

import java.sql.*;

public class MySQLConnection {
    public static void main(String args[]) {

        String usuario = "vil";
        String password = "secreta";

        String host = "localhost"; // tambien puede ser una ip como "192.168.1.14"
        String puerto = "3306";
        String database = "prueba";

        String driver = "com.mysql.jdbc.Driver";

        String ulrjdbc = "jdbc:mysql://" + host + ":" + puerto + "/" + database;

        Connection connection = null;
        try {
            Class.forName(driver).newInstance();
            connection = DriverManager.getConnection(ulrjdbc, usuario, password);

            // Ya tenemos el objeto connection creado

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                }
            }
        }
    }
}

Resumen para crear una conexión con cualquier base de datos:

  • Insertar en el CLASSPATH el jar con los drivers de nuestra base de datos (drivers Oracle, drivers MySQL o buscar en Google “drivers jdbc basededatos”)
  • Cargar los drivers con Class.forName(sdriver).newInstance();, siendo sdriver un String con la clase del driver.
  • Crear la conexión con DriverManager.getConnection(ulrjdbc, usuario, password);, siend urljdbc una url con el formato que define la propia base de datos (Oracle: jdbc:oracle:thin:@host:puerto:sid, MySQL: jdbc:mysql://host:puerto/database o buscar en Google “jdbc url basededatos”)
  • Cerrar siempre la conexión dentro del finally

Tomado de Yo, Programador, un blog de programación y tecnología escrito por Alberto Vilches.

Este artículo está licenciado con:

8 Comentarios | deja el tuyo

« Entradas anteriores