elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  AYUDA VALIDACION
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA VALIDACION  (Leído 2,901 veces)
taos19

Desconectado Desconectado

Mensajes: 8


Ver Perfil
AYUDA VALIDACION
« en: 20 Marzo 2014, 22:27 pm »

Buen Dia Amigos

Tengo este metodo que verifica despues de un tiempo si el usuario puede seguir teniendo acceso al programa.

Este compara dos campos de una base de datos para ver si se puede ingresar al programa o no.

Alguien me podria explicar su funcionamiento y como puedo personalizar el tiempo.

Código
  1. public boolean validarlicencia()
  2. throws Exception
  3.   {
  4.     String sql = "SELECT ID1, ID2 FROM TB_CIV_TMP WHERE ID1 = ?";
  5.     List<Map> obj = findMapBySQLParam(sql, new String[] { "id1", "id2" }, new Object[] { "202cb962ac59075b964b07152d234b70" });
  6.     if ((null == obj) || (obj.size() <= 0)) {
  7.       return false;
  8.     }
  9.     Object id2 = ((Map)obj.get(0)).get("id2");
  10.     if (null == id2)
  11.     {
  12.       Calendar cal = Calendar.getInstance();
  13.       cal.add(5, 80);
  14.       Long var1 = Long.valueOf(cal.getTime().getTime());
  15.       sql = "UPDATE TB_CIV_TMP SET ID2 = ?";
  16.       executeUpdateSQLParam(sql, new Object[] { var1 });
  17.       return true;
  18.     }
  19.     Calendar cal = Calendar.getInstance();
  20.     Long var1 = Long.valueOf(Long.parseLong("" + id2));
  21.     Long var2 = Long.valueOf(cal.getTime().getTime());
  22.     if (var2.longValue() > var1.longValue())
  23.     {
  24.       sql = "DELETE FROM TB_CIV_TMP";
  25.       executeUpdateSQL(sql);
  26.       return false;
  27.     }
  28.     return true;
  29.   }

Gracias de antemano


En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: AYUDA VALIDACION
« Respuesta #1 en: 21 Marzo 2014, 07:23 am »

Hola, vamos a hacer un análisis de este algoritmo que a simple vista no entiendo nada xD

Esta línea obtiene los campos ID1, ID2 de la tabla TB_CIV_TEMP cuando el ID1 es desconocido, es decir luego se seteará el parámetro de condición.
Código
  1. String sql = "SELECT ID1, ID2 FROM TB_CIV_TMP WHERE ID1 = ?";
  2.  

Luego hace uso de un método del cual no podemos ver nada pero al parecer devuelve fechas en milisegundos (para poder compararse luego). Este método recibe 3 parámetros: La query, un array String y un array Object.

Dado que no puedo ver el código de éste método, creo que no hace falta decirte que no entiendo ni un carajo para qué sirve xD

Código
  1. List<Map> obj = findMapBySQLParam(sql, new String[] { "id1", "id2" }, new Object[] { "202cb962ac59075b964b07152d234b70" });
  2.  

Ahora, podemos deducir que el método findMapBySQLParam() concatenerá algún valor (alguna fecha en milisegundos quizás) con la query y hará la consulta. Por otro lado, si no se puede realizar la consulta o no hay coincidencias con la consulta, la lista puede ser nula (si no se ha podido realizar la consulta) o vacía (si no hay coincidencias). Si ésto llegara a pasar, devuelve false y termina el método.

Crea un objeto Object y le asigna el valor de la llave "id2" del primer Map de la lista recibida.

Código
  1. // obj.get(0) -> obtiene el primer elemento de la lista. En este caso el primer Map
  2. // .get("id2") -> obtiene el valor asociado a la llave "id2"
  3. Object id2 = (Map) obj.get(0).get("id2");
  4.  

Si el valor es nulo, es decir no hay una llave con ese identificador lo crea:

Código
  1. Calendar cal = Calendar.getInstance(); // obtiene una instancia Calendar
  2. // el primer parametro debe ser una constante. 5 equivale a Calendar.DAY
  3. // el segundo parametro le suma 80 al tipo de dato de la constante. Ej.,
  4. // si es Calendar.DAY y hoy estamos 20, adelanta la fecha en 80 dias.
  5. call.add(5,80);
  6. // Obtiene la fecha avanzada en milisegundos
  7. Long var1 = Long.valueOf(cal.getTime().getTime());
  8. // actualiza el campo ID2 con la fecha avanzada en milisegundos (al parecer)
  9. sql = "UPDATE TB_CIV_TMP SET ID2 = ?";
  10. executeUpdateSQLParam(sql, new Object[] { var1 });
  11. return true; // devuelve true y termina el metodo

En caso el valor no sea nulo, es decir, si el primer Map de la lista si tiene un valor asociado a la llave "id2", obtiene el "id2" en milisegundos (al parecer es una fecha) y la fecha actual también en milisegundos. Luego los compara: Si la fecha en milisegundos de hoy es mayor que id2 en milisegundos, se elimina el usuario de la tabla.

Código
  1. Calendar cal = Calendar.getInstance();
  2. // Fecha ID2 (avanzada) en milisegundos en la base de datos
  3. Long var1 = Long.valueOf(Long.parseLong("" + id2));
  4. // Fecha actual en milisegundos
  5. Long var2 = Long.valueOf(cal.getTime().getTime());
  6. // si la actual es mayor que la avanzada: FIN DE LICENCIA!
  7. if (var2.longValue() > var1.longValue()) {
  8. sql = "DELETE FROM TB_CIV_TMP"; // elimina al user de la DB
  9. executeUpdateSQL(sql); // ejecuta la sentencia sql
  10. return false; // fin del metodo y devuelve false
  11. }
  12.  

De lo anterior podemos resumir que:

Hace una consulta a la base de datos para obtener los campos ID1 e ID2 que al parecer son un fechas, de acuerdo a un valor para ID1.

Calculamos la fecha en milisegundos que está en la base de datos (id2) con la fecha en milisegundos actual. Si la actual es mayor, se elimina el usuario de la base de datos.

Si ID2 no tiene un campo establecido en la base de datos, se obtiene la fecha 80 días en adelante en milisegundos y se guarda en la base de datos.


Conclusión:

Al parecer éste algoritmo trata sobre verificación de licencias de usuario de algún software.


PD: Creo que no es necesario que te diga dónde tienes que manejar las fechas (ya lo he explicado en el análisis). Salu2.


« Última modificación: 21 Marzo 2014, 07:40 am por Mitsu » En línea

taos19

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: AYUDA VALIDACION
« Respuesta #2 en: 21 Marzo 2014, 13:46 pm »

Hola, vamos a hacer un análisis de este algoritmo que a simple vista no entiendo nada xD

Esta línea obtiene los campos ID1, ID2 de la tabla TB_CIV_TEMP cuando el ID1 es desconocido, es decir luego se seteará el parámetro de condición.
Código
  1. String sql = "SELECT ID1, ID2 FROM TB_CIV_TMP WHERE ID1 = ?";
  2.  

Luego hace uso de un método del cual no podemos ver nada pero al parecer devuelve fechas en milisegundos (para poder compararse luego). Este método recibe 3 parámetros: La query, un array String y un array Object.

Dado que no puedo ver el código de éste método, creo que no hace falta decirte que no entiendo ni un carajo para qué sirve xD

Código
  1. List<Map> obj = findMapBySQLParam(sql, new String[] { "id1", "id2" }, new Object[] { "202cb962ac59075b964b07152d234b70" });
  2.  

Ahora, podemos deducir que el método findMapBySQLParam() concatenerá algún valor (alguna fecha en milisegundos quizás) con la query y hará la consulta. Por otro lado, si no se puede realizar la consulta o no hay coincidencias con la consulta, la lista puede ser nula (si no se ha podido realizar la consulta) o vacía (si no hay coincidencias). Si ésto llegara a pasar, devuelve false y termina el método.

Crea un objeto Object y le asigna el valor de la llave "id2" del primer Map de la lista recibida.

Código
  1. // obj.get(0) -> obtiene el primer elemento de la lista. En este caso el primer Map
  2. // .get("id2") -> obtiene el valor asociado a la llave "id2"
  3. Object id2 = (Map) obj.get(0).get("id2");
  4.  

Si el valor es nulo, es decir no hay una llave con ese identificador lo crea:

Código
  1. Calendar cal = Calendar.getInstance(); // obtiene una instancia Calendar
  2. // el primer parametro debe ser una constante. 5 equivale a Calendar.DAY
  3. // el segundo parametro le suma 80 al tipo de dato de la constante. Ej.,
  4. // si es Calendar.DAY y hoy estamos 20, adelanta la fecha en 80 dias.
  5. call.add(5,80);
  6. // Obtiene la fecha avanzada en milisegundos
  7. Long var1 = Long.valueOf(cal.getTime().getTime());
  8. // actualiza el campo ID2 con la fecha avanzada en milisegundos (al parecer)
  9. sql = "UPDATE TB_CIV_TMP SET ID2 = ?";
  10. executeUpdateSQLParam(sql, new Object[] { var1 });
  11. return true; // devuelve true y termina el metodo

En caso el valor no sea nulo, es decir, si el primer Map de la lista si tiene un valor asociado a la llave "id2", obtiene el "id2" en milisegundos (al parecer es una fecha) y la fecha actual también en milisegundos. Luego los compara: Si la fecha en milisegundos de hoy es mayor que id2 en milisegundos, se elimina el usuario de la tabla.

Código
  1. Calendar cal = Calendar.getInstance();
  2. // Fecha ID2 (avanzada) en milisegundos en la base de datos
  3. Long var1 = Long.valueOf(Long.parseLong("" + id2));
  4. // Fecha actual en milisegundos
  5. Long var2 = Long.valueOf(cal.getTime().getTime());
  6. // si la actual es mayor que la avanzada: FIN DE LICENCIA!
  7. if (var2.longValue() > var1.longValue()) {
  8. sql = "DELETE FROM TB_CIV_TMP"; // elimina al user de la DB
  9. executeUpdateSQL(sql); // ejecuta la sentencia sql
  10. return false; // fin del metodo y devuelve false
  11. }
  12.  

De lo anterior podemos resumir que:

Hace una consulta a la base de datos para obtener los campos ID1 e ID2 que al parecer son un fechas, de acuerdo a un valor para ID1.

Calculamos la fecha en milisegundos que está en la base de datos (id2) con la fecha en milisegundos actual. Si la actual es mayor, se elimina el usuario de la base de datos.

Si ID2 no tiene un campo establecido en la base de datos, se obtiene la fecha 80 días en adelante en milisegundos y se guarda en la base de datos.


Conclusión:

Al parecer éste algoritmo trata sobre verificación de licencias de usuario de algún software.


PD: Creo que no es necesario que te diga dónde tienes que manejar las fechas (ya lo he explicado en el análisis). Salu2.

Impresionante respuesta. Muchas gracias por el tiempo y la explicacion.

Otra pregunta... quisiera saber como seria la forma de verificar con otra fecha almacenada en otra base de datos y ahi si evitar el ingreso del usuario despues de 15 dias por ejemplo
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: AYUDA VALIDACION
« Respuesta #3 en: 21 Marzo 2014, 14:20 pm »

Muchas gracias y ante cualquier duda, ya sabes que tienes que elegir ElHacker ;)

Respecto a tu pregunta, yo haría lo siguiente:

  • Asociar las fechas a un ID_USUARIO que será la PK.

Así sería muy fácil. Primero obtenemos los registros por el ID_USUARIO. Una vez que tengamos los registros (las fechas) podremos trabajar fácilmente.

Sería algo así, aclaro que no lo he probado y quizás debe tener algunos errores, de eso ya te encargas tú. Espero hayas aprendido a cómo realizarlo.

Código
  1. public boolean validarLicencia(long id) throws SQLException {
  2.      try {
  3. String sentencia = "SELECT ID1, ID2 FROM TUTABLA WHERE ID_USUARIO = ?";
  4. Map mapaUsuario = obtenerMapaPorUserID(sentencia, id);
  5.  
  6. Long id2 = (Long) mapaUsuario.get(0).get("id2"); // obtiene el valor asociado a la llave 'id2' del Map 'mapaUsuario'
  7.  
  8. if(mapaUsuario = null && mapaUsuario.size() == 0) { return false; }
  9.  
  10. if (id2 == null)  { // si el campo id2 es null en la tabla
  11. Calendar calendario = Calendar.getInstance();
  12. calendario.add(5,15) // la fecha de vencimiento es en 15 dias
  13. Long fechaHoyMiliseg = cal.getTime().getTime(); // obtiene fecha en milisegunos
  14. String sentencia = "UPDATE TUTABLA SET ID2 = ?";
  15. ejecutarSentenciaPorUserId(sentencia, fechaHoyMiliseg);
  16. return true; // informa que la licencia es valida
  17. }
  18.  
  19. // Si existe el campo ID2
  20. Calendar calendario = Calendar.getInstance();
  21. Long fechaLimiteMiliseg = id2; // le asigna el valor de id2 recuperado del usuario
  22. Long fechaHoyMiliseg = calendario.getTime().getTime();
  23. if (fechaHoyMiliseg > fechaMiliteMiliseg) { // YA SE VENCIO LICENCIA!
  24. String sentencia = "DELE FROM TUTABLA WHERE ID_USUARIO = ?";
  25. ejecutarSentenciaPorUserId(sentencia, id);
  26. return false; // informa que la licencia ya vencio
  27. }
  28.       } catch (SQLException ex) { throw ex; }
  29.     finally { /* cierras flujos*/ }
  30.  
  31.     return true; // solo para que no de error ya que se debe de colocar el retorno
  32. }

Método que obtiene un Map por id de usuario:
Código
  1. public Map obtenerMapaPorUserID(String sql, id) throws SQLException {
  2.       try {
  3. // obtienes tu conexion y declaras previamente un preparedStatement
  4. estatuto = conexion.preparedStatement(sql);
  5. estatuto.setLong(1,user); // asigna el id a la consulta
  6. ResultSet rs = estatuto.executeQuery();
  7. Map<String llave, Long valor) mapaUsuario = new HashMap<>();
  8. while(rs.next()) {
  9. mapaUsuario.put("id1",rs.getLong("ID1"));
  10. mapaUsuario.put("id2",rs.getLong("ID2"));
  11. }
  12.      } catch (SQLException ex) { throw ex; }
  13.      finally { /* cierras flujos*/ }
  14. return mapaUsuario; // en caso no haya coincidencias devolvera una lista vacia (mapaUsuario.size() == 0)
  15. }

Método que ejecuta una sentencia por id de usuario:

Código
  1. public void ejecutarSentenciaPorUserId(String sentencia, long id) throws SQLException {
  2.        try {
  3.       // obtienes tu conexion y haces un executeUpdate();
  4.        } catch (SQLException ex) { throw ex; }
  5.        finally { /* cierras flujos*/ }
  6. }
« Última modificación: 21 Marzo 2014, 16:16 pm por Mitsu » En línea

taos19

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: AYUDA VALIDACION
« Respuesta #4 en: 21 Marzo 2014, 16:06 pm »

Muchas gracias y ante cualquier duda, ya sabes que tienes que elegir ElHacker ;)

Respecto a tu pregunta, yo haría lo siguiente:

  • Asociar las fechas a un ID_USUARIO que será la PK.

Así sería muy fácil. Primero obtenemos los registros por el ID_USUARIO. Una vez que tengamos los registros (las fechas) podremos trabajar fácilmente.

Sería algo así, aclaro que no lo he probado y quizás debe tener algunos errores, de eso ya te encargas tú. Espero hayas aprendido a cómo realizarlo.

Código
  1. public boolean validarLicencia(long id) throws SQLException {
  2.      try {
  3. String sentencia = "SELECT ID1, ID2 FROM TUTABLA WHERE ID_USUARIO = ?";
  4. Map mapaUsuario = obtenerMapaPorUserID(sentencia, id);
  5.      } catch (SQLException ex) { throw ex; }
  6.      finally { /* cierras flujos*/ }
  7.  
  8. Long id2 = (Long) mapaUsuario.get(0).get("id2"); // obtiene el valor asociado a la llave 'id2' del Map 'mapaUsuario'
  9.  
  10. if(mapaUsuario = null && mapaUsuario.size() == 0) { return false; }
  11.  
  12. if (id2 == null)  { // si el campo id2 es null en la tabla
  13. Calendar calendario = Calendar.getInstance();
  14. calendario.add(5,15) // la fecha de vencimiento es en 15 dias
  15. Long fechaHoyMiliseg = cal.getTime().getTime(); // obtiene fecha en milisegunos
  16. String sentencia = "UPDATE TUTABLA SET ID2 = ?";
  17. ejecutarSentenciaPorUserId(sentencia, fechaHoyMiliseg);
  18. return true; // informa que la licencia es valida
  19. }
  20.  
  21. // Si existe el campo ID2
  22. Calendar calendario = Calendar.getInstance();
  23. Long fechaLimiteMiliseg = id2; // le asigna el valor de id2 recuperado del usuario
  24. Long fechaHoyMiliseg = calendario.getTime().getTime();
  25. if (fechaHoyMiliseg > fechaMiliteMiliseg) { // YA SE VENCIO LICENCIA!
  26. String sentencia = "DELE FROM TUTABLA WHERE ID_USUARIO = ?";
  27. ejecutarSentenciaPorUserId(sentencia, id);
  28. return false; // informa que la licencia ya vencio
  29. }
  30.  
  31. return true; // solo para que no de error ya que se debe de colocar el retorno
  32. }

Método que obtiene un Map por id de usuario:
Código
  1. public Map obtenerMapaPorUserID(String sql, id) throws SQLException {
  2.       try {
  3. // obtienes tu conexion y declaras previamente un preparedStatement
  4. estatuto = conexion.preparedStatement(sql);
  5. estatuto.setLong(1,user); // asigna el id a la consulta
  6. ResultSet rs = estatuto.executeQuery();
  7. Map<String llave, Long valor) mapaUsuario = new HashMap<>();
  8. while(rs.next()) {
  9. mapaUsuario.put("id1",rs.getLong("ID1"));
  10. mapaUsuario.put("id2",rs.getLong("ID2"));
  11. }
  12.      } catch (SQLException ex) { throw ex; }
  13.      finally { /* cierras flujos*/ }
  14. return mapaUsuario; // en caso no haya coincidencias devolvera una lista vacia (mapaUsuario.size() == 0)
  15. }

Método que ejecuta una sentencia por id de usuario:

Código
  1. public void ejecutarSentenciaPorUserId(String sentencia, long id) throws SQLException {
  2.        try {
  3.       // obtienes tu conexion y haces un executeUpdate();
  4.        } catch (SQLException ex) { throw ex; }
  5.        finally { /* cierras flujos*/ }
  6. }

Estoy muy agradecido mitsu.  Voy a implementarlo y te cuento
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda en validacion
Programación C/C++
josue_tux 2 2,513 Último mensaje 25 Mayo 2010, 02:49 am
por nicolas_cof
Ayuda con validacion de formulario PHP « 1 2 »
PHP
oscarj24 10 6,170 Último mensaje 10 Junio 2010, 02:51 am
por oscarj24
ayuda en validacion de html5 con jquery
Desarrollo Web
geshiro 1 2,038 Último mensaje 14 Agosto 2015, 20:00 pm
por fdap91
Ayuda con validación porfavor
Programación C/C++
Giankaa 2 2,123 Último mensaje 31 Octubre 2016, 07:38 am
por engel lex
[Ayuda] Ideas para Validacion
PHP
danny920825 2 3,473 Último mensaje 19 Junio 2017, 21:48 pm
por danny920825
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines