Your SlideShare is downloading. ×
0
Seguridad en Programación vladimir  dot  calderon at gmail dot com (16 – mayo – 2009)
Programa <ul><li>SQL Injection </li></ul><ul><ul><li>Presentación </li></ul></ul><ul><ul><li>Formas de evitarlo </li></ul>...
SQL INJECTION
SQL Injection <ul><li>Un usuario solicita datos al gestor de la base de datos, generalmente indicando un criterio de selec...
SQL : Tipos de comandos Comandos DCL (Data Control Language Statements) Cláusulas Comandos DML (Data Manipulation Language...
SQL : Comandos Básicos Comandos DDL (Data Definition Language Statements) CREATE Utilizado para crear nuevas tablas, campo...
SQL : Comandos Básicos Comandos DML (Data Manipulation Language Statements) SELECT Utilizado para consultar registros de u...
SQL Injection <ul><li>SQL Injection es cuando se pueden introducir consultas SQL en los formularios de una aplicación en u...
Por qué hablar de SQL Injection? <ul><li>Porque a pesar de que la técnica original tiene un par de años, aún hoy sigue sie...
Esquema simplificado Web Server Firewall Database Server Usuario/Intruso Usuario/Intruso Internet App.Web App.Web App.Web ...
Típica página web sql = “SELECT * FROM users WHERE username = '&quot; + usuario + &quot;' AND userpass = '&quot; + clave +...
Comilla Simple : Single Quote <ul><li>Si logramos que la consulta interprete un texto con solamente una comilla simple, te...
Objetivos SQL Injection <ul><li>Identificar componentes dinámicos en el sitio web </li></ul><ul><li>Intentar formarse una ...
Pasando la autenticación <ul><li>En las páginas de autentificación trataremos de: </li></ul><ul><ul><li>Ingresar a zonas r...
Evadiendo la autenticación <ul><li>Por qué las opciones indicadas deberían funcionar? </li></ul>SELECT * FROM users WHERE ...
Evitando SQL Injection <ul><li>Lo más importante de conocer un ataque es poder evitarlo. </li></ul><ul><li>Dependiendo del...
SQL Injection .vs. PHP <ul><li>Para leer datos numéricos o de un tipo definido (no para STRINGs) </li></ul><?php settype($...
SQL Injection .vs. PHP <ul><li>Para incluir las variables en consultas SQL estándar (select, update, insert, etc) </li></u...
SQL Injection .vs. ASP.NET <ul><li>ASP.NET maneja esto de manera más transparente y haciendo uso de los objetos adecuados ...
SQL Injection .vs. JAVA <ul><li>Similar a ASP.NET (más bien ASP.NET similar a JAVA): </li></ul>String query =  &quot;Selec...
CODE EXPLOITS
Qué es un exploit? <ul><li>Un exploit es explotar una vulnerabilidad en un programa. </li></ul><ul><li>Por cada 1000 línea...
Tipos de vulnerabilidades <ul><li>Buffer Overflow </li></ul><ul><ul><li>Stack </li></ul></ul><ul><li>Integer Overflow </li...
Algo de terminología <ul><li>ASR: Address Space Randomisation </li></ul><ul><ul><li>Es cuando el sistema operativo está pr...
Un poco más de terminología <ul><li>Shellcode </li></ul><ul><ul><li>Son simplemente comandos Assembler. Típicamente, se cr...
Llamado a una función en C <ul><li>Ejemplo del assembler producido por un código vulnerable </li></ul>Int main(int argc,  ...
Llamado a una función en C <ul><li>La continuación </li></ul>strcpy(buffer, argv[1]); return 0; }
Overflow y Memoria <ul><li>Cuando ocurre un Overflow, datos pasan a sobre escribir lugares donde hay código, por lo tanto ...
Cómo se %$&! la memoria
Qué puede ocurrir? <ul><li>En el Shellcode que coloquemos podemos hacerle hacer lo que querramos </li></ul><ul><li>Los esp...
En la práctica <ul><li>Tenemos un programa que tiene un problema potencial: </li></ul>void trucho (void) {  char small[30]...
Mostrando la vulnerabilidad <ul><li>Se puede observar cómo surge la vulnerabilidad </li></ul><ul><li>Los hackers buscan po...
Busquemos las direcciones (GDB) <ul><li>Dirección de retorno interesante 0x08048418 (esto está originalmente en EBP) </li>...
La función trucho() <ul><li>Aumenta en 0x28 = 40 el stack. Esto viene de que nuestro char[] es de 30 + padding mod 16 = 32...
Cómo vemos el overflow? <ul><li>Se puede ver cómo justamente en el lugar donde se produce el overflow se va rellenando con...
Modificando la dirección <ul><li>Se debe encontrar la dirección donde queremos ir: </li></ul>main() {  int i=0;  char buf[...
Viendo el resultado <ul><li>Observe que también se debe tener cierto conocimiento para pasar el texto que queremos </li></...
Shellcode <ul><li>Es un código assembler que va en el espacio donde existe la vulnerabilidad. </li></ul><ul><li>Se debe pr...
Finalmente <ul><li>Se debe escribir un programa que: </li></ul><ul><ul><li>Explote la vulnerabilidad enviando el Shellcode...
Programación Defensiva
Por qué? <ul><li>Según SANS, la primera de las 10 peores vulnerabilidades que hay es: </li></ul><ul><li>ISO 27001 </li></u...
Políticas de programación <ul><li>La primera cosa que se debe hacer es redactar una política de programación, que contenga...
Logging <ul><li>Aproximadamente un 4% del código debe estar destinado a operaciones de logging (McConnell) </li></ul><ul><...
Ejemplo Logging (log4net) protected void Logon_Click(object sender, EventArgs e) { log.Info (&quot;Trata de autenticarse: ...
Revisión de Pares <ul><li>SUMAMENTE difícil de implementar, sin embargo </li></ul><ul><li>De los 8 a 10 errores posibles e...
Try / catch <ul><li>Se debe utilizar este patrón en todo lugar donde sea necesario, las veces que sea necesario, es import...
Beneficios en producción <ul><li>Una vez se toman todos (al menos varios) de los recaudos en el tema de seguridad </li></u...
Generadores de código Una pequeña aplicación con una DAO
Objetivo <ul><li>Las necesidades para el ejercicio son: </li></ul><ul><ul><li>Crear una librería de acceso a datos profesi...
Modelo base <ul><li>Patrón de diseño J2EE DAO </li></ul><ul><li>http://java.sun.com/blueprints/corej2eepatterns/Patterns/D...
Modelo base – Abstract Factory
Resultado esperado <ul><li>Agregando un singleton a nivel del Factory se puede tener un patrón para consultas: </li></ul><...
Modelo extensible Objeto
Modelo extensible DAO
Generando…
Et voilà!! FactoryDAO factory = FactoryDAO.Instancia; PersonaDAO dao = factory.newPersonaDAO(); Persona dto = dao.nuevo();...
MUCHAS GRACIAS
Upcoming SlideShare
Loading in...5
×

Seguridad En Programación

4,265

Published on

Una pequeña presentación sobre lo que se debería tomar en cuenta par ala programación en torno a la seguridad + bonus code exploit en fácil.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,265
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
155
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Seguridad En Programación"

  1. 1. Seguridad en Programación vladimir dot calderon at gmail dot com (16 – mayo – 2009)
  2. 2. Programa <ul><li>SQL Injection </li></ul><ul><ul><li>Presentación </li></ul></ul><ul><ul><li>Formas de evitarlo </li></ul></ul><ul><li>Code Exploits </li></ul><ul><ul><li>Formas de evitarlo </li></ul></ul><ul><li>El menospreciado try-catch </li></ul><ul><ul><li>Error más común </li></ul></ul><ul><li>Un ejemplo de todo el ensamblado en una CAD </li></ul><ul><li>Generación de código </li></ul>
  3. 3. SQL INJECTION
  4. 4. SQL Injection <ul><li>Un usuario solicita datos al gestor de la base de datos, generalmente indicando un criterio de selección </li></ul><ul><li>Los datos son devueltos al usuario de acuerdo al criterio de selección colocado en la consulta </li></ul>Gestor de Base de Datos Cliente/Usuario
  5. 5. SQL : Tipos de comandos Comandos DCL (Data Control Language Statements) Cláusulas Comandos DML (Data Manipulation Language Statements) Comandos DDL (Data Definition Language Statements) Operadores de Comparación
  6. 6. SQL : Comandos Básicos Comandos DDL (Data Definition Language Statements) CREATE Utilizado para crear nuevas tablas, campos e índices. DROP Empleado para eliminar tablas e índices. ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos. Comandos DCL (Data Control Language Statements) GRANT Utilizado para otorgar permisos. REVOKE Utilizado para revocar permisos. DENY Utilizado para denegar acceso.
  7. 7. SQL : Comandos Básicos Comandos DML (Data Manipulation Language Statements) SELECT Utilizado para consultar registros de una base de datos que satisfagan un criterio determinado. INSERT Utilizado para cargar lotes de datos en la base de datos en una única posición. UPDATE Utilizado para modificar los valores de los campos y registros específicos. DELETE Utilizado para eliminar registros de una tabla de base de datos.
  8. 8. SQL Injection <ul><li>SQL Injection es cuando se pueden introducir consultas SQL en los formularios de una aplicación en una consulta previamente establecida. </li></ul><ul><li>Mediante SQL Injection se logra manipular la manera en que el programa responde normalmente. </li></ul>
  9. 9. Por qué hablar de SQL Injection? <ul><li>Porque a pesar de que la técnica original tiene un par de años, aún hoy sigue siendo efectiva </li></ul><ul><li>Porque el presente y parte del futuro de la seguridad informática se encuentra de una u otra forma relacionada con las aplicaciones web y los almacenes de datos. </li></ul><ul><li>Porque en esencia es una técnica de intrusión sumamente sencilla, aspecto que la hace sumamente peligrosa. </li></ul>
  10. 10. Esquema simplificado Web Server Firewall Database Server Usuario/Intruso Usuario/Intruso Internet App.Web App.Web App.Web App.Web
  11. 11. Típica página web sql = “SELECT * FROM users WHERE username = '&quot; + usuario + &quot;' AND userpass = '&quot; + clave + &quot;' &quot;
  12. 12. Comilla Simple : Single Quote <ul><li>Si logramos que la consulta interprete un texto con solamente una comilla simple, tendremos: </li></ul><ul><li>Lo cual concluye en un error de sintáxis SQL! </li></ul>SELECT * FROM users WHERE username = ‘ ‘ ' AND userpass = ‘xx123'
  13. 13. Objetivos SQL Injection <ul><li>Identificar componentes dinámicos en el sitio web </li></ul><ul><li>Intentar formarse una idea de la estructura de la aplicación </li></ul><ul><li>Dónde encontramos posibles vulnerabilidades? </li></ul><ul><ul><li>Páginas de Identificación y Autenticación de usuarios </li></ul></ul><ul><ul><li>Formularios de ingreso de datos </li></ul></ul><ul><ul><li>URIs / URLs en donde se lean valores / Variables </li></ul></ul><ul><li>En general es susceptible de ataque cualquier input del usuario </li></ul>
  14. 14. Pasando la autenticación <ul><li>En las páginas de autentificación trataremos de: </li></ul><ul><ul><li>Ingresar a zonas restringidas </li></ul></ul><ul><ul><li>Falsear un usuario estándar </li></ul></ul><ul><ul><li>Identificar a un posible administrador y utilizarlo </li></ul></ul><ul><li>Algunas opciones: </li></ul>' or 1=1-- admin ' -- ' OR '' = '' --
  15. 15. Evadiendo la autenticación <ul><li>Por qué las opciones indicadas deberían funcionar? </li></ul>SELECT * FROM users WHERE username = '' OR '' = ''-- AND userpass = '' SELECT * FROM users WHERE username = ' admin ' -- AND userpass = '' <ul><ul><li>' OR '' = '' -- </li></ul></ul><ul><ul><li>admin ' -- </li></ul></ul>SELECT * FROM users WHERE username = '' or 1=1-- ' AND userpass = '' <ul><ul><li>' or 1=1-- </li></ul></ul>
  16. 16. Evitando SQL Injection <ul><li>Lo más importante de conocer un ataque es poder evitarlo. </li></ul><ul><li>Dependiendo del lenguaje de programación utilizado se deben aplicar las técnicas correspondientes. </li></ul><ul><li>En reglas generales, </li></ul><ul><ul><li>Se DEBEN utilizar los métodos nativos del lenguaje para la asignación de parámetros a consultas SQL </li></ul></ul><ul><ul><li>Se ACONSEJA utilizar procedimientos almacenados para todas las consultas y manejo de la base de datos </li></ul></ul>
  17. 17. SQL Injection .vs. PHP <ul><li>Para leer datos numéricos o de un tipo definido (no para STRINGs) </li></ul><?php settype($offset, 'integer'); $consulta = &quot;SELECT id, nombre FROM productos &quot; ; $consulta .= &quot;LIMIT 20 OFFSET %d;&quot;; // note el simbolo %d en la cadena de formato // usar %s no tendría sentido $consulta = sprintf($consulta, $offset); ?>
  18. 18. SQL Injection .vs. PHP <ul><li>Para incluir las variables en consultas SQL estándar (select, update, insert, etc) </li></ul><?php $query = &quot;INSERT INTO usuarios(nombre,contr) VALUES('%s','%s');“; $consulta = sprintf($query, pg _escape_string($nombre_usuario), md5($contrasenya)); $resultado = pg _query($conexion, $consulta); $query = &quot;SELECT 1 FROM usuarios WHERE nombre='%s' AND contr='%s';“; $consulta = sprintf($query, pg _escape_string($nombre_usuario), md5($contrasenya)); $resultado = pg _query($conexion, $consulta); ?>
  19. 19. SQL Injection .vs. ASP.NET <ul><li>ASP.NET maneja esto de manera más transparente y haciendo uso de los objetos adecuados no debería tener problemas </li></ul>string query= &quot;select * from Customers where city = @City“; SqlCommand cmd = new SqlCommand(query, conn); SqlParameter param = new SqlParameter(); param.ParameterName = &quot;@City&quot;; param.Value = inputCity; cmd.Parameters.Add(param); SqlDataReader reader = cmd.ExecuteReader();
  20. 20. SQL Injection .vs. JAVA <ul><li>Similar a ASP.NET (más bien ASP.NET similar a JAVA): </li></ul>String query = &quot;Select favorita from comida where gato = ?“; PreparedStatement preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, “mufasa&quot;); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { System.out.println(“La comida favorita de mufasa &quot; + resultSet.getString(1)); }
  21. 21. CODE EXPLOITS
  22. 22. Qué es un exploit? <ul><li>Un exploit es explotar una vulnerabilidad en un programa. </li></ul><ul><li>Por cada 1000 líneas de código es probable que existan entre 6 a 8 errores. (peer review) </li></ul><ul><li>Siempre se podrán encontrar fallas en los programas de cualquier índole: Windows, Linux, Mac, etc. </li></ul><ul><li>No depende del lenguaje tampoco. </li></ul><ul><li>Quiénes? </li></ul><ul><ul><li>Hackers, crackers, especialistas en seguridad informática </li></ul></ul>
  23. 23. Tipos de vulnerabilidades <ul><li>Buffer Overflow </li></ul><ul><ul><li>Stack </li></ul></ul><ul><li>Integer Overflow </li></ul><ul><li>Format String </li></ul><ul><li>Cadenas sin terminación </li></ul><ul><li>SQL Injection </li></ul><ul><li>Cross Site Scripting </li></ul><ul><li>Manipulación de variables </li></ul>
  24. 24. Algo de terminología <ul><li>ASR: Address Space Randomisation </li></ul><ul><ul><li>Es cuando el sistema operativo está preparado para que las funciones cargadas en el mismo se encuentren en direcciones de memoria que muy probablemente cambian cada vez que se reinicia la máquina </li></ul></ul><ul><li>Registros de CPU </li></ul><ul><ul><li>Son los registros de la máquina que se utilizan para ejecutar los procesos y mantener el estado del proceso en ejecución: próxima línea a ejecutar, dirección de retorno de la función, etc </li></ul></ul>
  25. 25. Un poco más de terminología <ul><li>Shellcode </li></ul><ul><ul><li>Son simplemente comandos Assembler. Típicamente, se crean programas que abran un shell o que ejecuten algún comando en particular. </li></ul></ul><ul><li>GDB </li></ul><ul><ul><li>El debogueador de Linux, muy poderoso para encontrar exactamente las direcciones de memoria en cualquier llamado </li></ul></ul><ul><li>GCC </li></ul><ul><ul><li>Compilador de C/C++ que también compila assembler y otros </li></ul></ul>
  26. 26. Llamado a una función en C <ul><li>Ejemplo del assembler producido por un código vulnerable </li></ul>Int main(int argc, char* argv[]) { char buffer[256]; if (argc != 2) exit(1);
  27. 27. Llamado a una función en C <ul><li>La continuación </li></ul>strcpy(buffer, argv[1]); return 0; }
  28. 28. Overflow y Memoria <ul><li>Cuando ocurre un Overflow, datos pasan a sobre escribir lugares donde hay código, por lo tanto se vuelven ejecutables. Para ver cómo ocurre esto hay que entender cómo funciona la memoria: </li></ul><ul><li>Una página es una parte de la memoria con direccionamiento propio. El kernel asigna un espacio (páginas) de memoria para el proceso, esta memoria consta de 3 partes: </li></ul><ul><ul><li>Segmento de Código: instrucciones assembler que el CPU ejecuta. EIP es el registro que tiene la próxima línea a ejecutarse </li></ul></ul><ul><ul><li>Segmento de Datos: Para variables y bufferes dinámicos </li></ul></ul><ul><ul><li>Segmento de Pila: utilizado para pasar argumentos a las funciones. ESP es el registro que apunta a la punta del Stack </li></ul></ul>
  29. 29. Cómo se %$&! la memoria
  30. 30. Qué puede ocurrir? <ul><li>En el Shellcode que coloquemos podemos hacerle hacer lo que querramos </li></ul><ul><li>Los espacios se llenan con NOPs o INCs </li></ul><ul><li>Hay generadores de Shellcode http://www.metasploit.com </li></ul>
  31. 31. En la práctica <ul><li>Tenemos un programa que tiene un problema potencial: </li></ul>void trucho (void) { char small[30]; gets (small); printf(&quot;%s &quot;, small); } int main() { trucho (); return 0; }
  32. 32. Mostrando la vulnerabilidad <ul><li>Se puede observar cómo surge la vulnerabilidad </li></ul><ul><li>Los hackers buscan por todos los medios este comportamiento en una aplicación </li></ul>
  33. 33. Busquemos las direcciones (GDB) <ul><li>Dirección de retorno interesante 0x08048418 (esto está originalmente en EBP) </li></ul>
  34. 34. La función trucho() <ul><li>Aumenta en 0x28 = 40 el stack. Esto viene de que nuestro char[] es de 30 + padding mod 16 = 32 + 8 (para las direcciones del EBP) = 40. </li></ul>
  35. 35. Cómo vemos el overflow? <ul><li>Se puede ver cómo justamente en el lugar donde se produce el overflow se va rellenando con los valores de datos el lugar del EBP (note que se llena en sentido contrario) </li></ul>
  36. 36. Modificando la dirección <ul><li>Se debe encontrar la dirección donde queremos ir: </li></ul>main() { int i=0; char buf[44]; for (i=0;i<=40;i+=4) *(long *) &buf[i] = 0x84130804 ; puts(buf); }
  37. 37. Viendo el resultado <ul><li>Observe que también se debe tener cierto conocimiento para pasar el texto que queremos </li></ul><ul><li>Salta el error y vuelve a ejecutarse la función trucho() </li></ul>
  38. 38. Shellcode <ul><li>Es un código assembler que va en el espacio donde existe la vulnerabilidad. </li></ul><ul><li>Se debe programar un shellcode con tamaños diferentes (dependiendo del tamaño del buffer) </li></ul><ul><li>Luego se convierte el shellcode a un hex char. De manera que tenemos algo así: </li></ul>static char shellcode[]= &quot;xebx17x5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0bx89xf3x8d&quot; &quot;x4ex08x31xd2xcdx80xe8xe4xffxffxffx2fx62x69x6ex2fx73x68x58&quot;;
  39. 39. Finalmente <ul><li>Se debe escribir un programa que: </li></ul><ul><ul><li>Explote la vulnerabilidad enviando el Shellcode al lugar de la memoria que corresponda </li></ul></ul><ul><ul><li>El shellcode generalmente puede ser una llamada a /bin/sh </li></ul></ul><ul><li>El resultado es que, cuando ejecutamos nuestro exploit, obtenemos un shell. </li></ul><ul><li>El exploit puede ser a un programa, a un servicio (DNS, web, etc) </li></ul>
  40. 40. Programación Defensiva
  41. 41. Por qué? <ul><li>Según SANS, la primera de las 10 peores vulnerabilidades que hay es: </li></ul><ul><li>ISO 27001 </li></ul>NO VERIFICACION de los parámetros de ENTRADA y SALIDA de las funciones de nuestros programas 12.2.1: El insumo de data en las aplicaciones debe ser validado para asegurar que esta data sea correcta y apropiada. 12.2.2, 12.2.3 y 12.2.4: Que no hayan errores, integridad y validar output.
  42. 42. Políticas de programación <ul><li>La primera cosa que se debe hacer es redactar una política de programación, que contenga: </li></ul><ul><ul><li>Las cosas que NO se deben hacer </li></ul></ul><ul><ul><li>La existencia de patrones </li></ul></ul><ul><ul><li>El know-how de la empresa o grupo de desarrolladores </li></ul></ul><ul><ul><li>Explícitamente indicar la suma importancia del seguimiento de las reglas </li></ul></ul><ul><ul><li>Complejidad ciclomática </li></ul></ul><ul><li>Técnicamente, se puede cumplir con estas reglas </li></ul><ul><ul><li>Logging (log4net, log4j) </li></ul></ul><ul><ul><li>Peer review (revisión de pares) </li></ul></ul><ul><ul><li>Try / catch </li></ul></ul>
  43. 43. Logging <ul><li>Aproximadamente un 4% del código debe estar destinado a operaciones de logging (McConnell) </li></ul><ul><li>Muy difícil enseñar a hacer buen logging, tiempo de aprendizaje aprox. 1 año. </li></ul><ul><li>Mejor herramienta de logging: log4j / log4net: http://logging.apache.org </li></ul><ul><li>Cada vez que ocurre una falla en el programa, podemos estar enterados por correo!! </li></ul>
  44. 44. Ejemplo Logging (log4net) protected void Logon_Click(object sender, EventArgs e) { log.Info (&quot;Trata de autenticarse: &quot; + UserEmail.Text + &quot;/********&quot;); if (verificar(UserEmail.Text, UserPass.Text)) { log.Info (&quot;Usuario autenticado&quot;); … // redirección o a Inicio } else { log.Error (&quot;Usuario &quot; + UserEmail.Text + &quot;/&quot; + UserPass.Text + &quot; incorrectos&quot;); Msg.Text = &quot;Nombre o Clave de Usuario son inválidos, o el usuario ha sido dado de baja&quot;; } }
  45. 45. Revisión de Pares <ul><li>SUMAMENTE difícil de implementar, sin embargo </li></ul><ul><li>De los 8 a 10 errores posibles en 1000 líneas de código, 9 se resuelven / detectan con revisión de pares ANTES de la compilación o testeo </li></ul><ul><li>En qué consiste? </li></ul><ul><ul><li>REVISION sesuda del código por un tercero </li></ul></ul><ul><li>Consejo para la implementación </li></ul><ul><ul><li>Bob realiza el código a ser aprobado por TOM </li></ul></ul><ul><ul><li>Alice presenta el código a ser aprobado a TOM </li></ul></ul><ul><ul><li>Si TOM descubre algún error, Alice es castigada </li></ul></ul>
  46. 46. Try / catch <ul><li>Se debe utilizar este patrón en todo lugar donde sea necesario, las veces que sea necesario, es importante el uso de programación defensiva en este sentido. </li></ul>try { File f = new File(“algo.txt”); FileReader fr = new FileReader(f); } catch { log.error(“Algo pasó”); } File f = null; FileReader fr = null; try { f = new File(“algo.txt”); } catch(Exception e) { log.error(“error”, e); } try { fr = new FileReader(f); } catch(Exception e) { log.error(“error”, e); }
  47. 47. Beneficios en producción <ul><li>Una vez se toman todos (al menos varios) de los recaudos en el tema de seguridad </li></ul><ul><li>Una vez que se tienen los patrones en la empresa y se los aplica y la gente los conoce se pueden crear: </li></ul><ul><ul><li>Herramientas de generación de código </li></ul></ul><ul><ul><li>Revisiones más ligeras aumentando la velocidad de desarrollo </li></ul></ul><ul><ul><li>Actualizar el software de manera más sencilla </li></ul></ul><ul><ul><li>No dependencia en los programadores </li></ul></ul>
  48. 48. Generadores de código Una pequeña aplicación con una DAO
  49. 49. Objetivo <ul><li>Las necesidades para el ejercicio son: </li></ul><ul><ul><li>Crear una librería de acceso a datos profesional </li></ul></ul><ul><ul><li>Manejando concurrencia </li></ul></ul><ul><ul><li>ABM de registros vistos como objetos </li></ul></ul><ul><ul><li>Posible migración a otra base de datos o archivos no debe ser un problema </li></ul></ul>
  50. 50. Modelo base <ul><li>Patrón de diseño J2EE DAO </li></ul><ul><li>http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html </li></ul>
  51. 51. Modelo base – Abstract Factory
  52. 52. Resultado esperado <ul><li>Agregando un singleton a nivel del Factory se puede tener un patrón para consultas: </li></ul><ul><li>Este patrón </li></ul><ul><ul><li>No depende de la base de datos y no es necesario conocer la manera en que el DAO ha sido implementado </li></ul></ul>Factory factory = Factory.getOrCreate(); PersonaDAO dao = factory.nuevoPersonaDAO(); Persona dto = dao.seleccionar(4); dto.Nombre = “pedro”; dao.actualizar();
  53. 53. Modelo extensible Objeto
  54. 54. Modelo extensible DAO
  55. 55. Generando…
  56. 56. Et voilà!! FactoryDAO factory = FactoryDAO.Instancia; PersonaDAO dao = factory.newPersonaDAO(); Persona dto = dao.nuevo(); dto.Nombre = txtNombre.Text; dto.Numero = Convert.ToInt32(txtNumero.Text); dto.Salario = Convert.ToDouble(txtSalario.Text); dao.actualizar();
  57. 57. MUCHAS GRACIAS
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×