Fuente
http://jcaptcha.octo.com/confluence/display/general/Struts+integration
Autor
Jaime Carmona Loeches
Fecha
18 de Octubre de 2010
Configuración de jCaptcha en Struts
JCaptcha es un filtro utilizado en aplicaciones web, utilizado para
tener una mayor seguridad de que el visitante de una página web, residente en un servidor web,
es un “humano” y no un “robot”.
Esto tiene la siguiente explicación lógica: imagine que usted tiene una empresa de zapatos,
y existe otra empresa en la competencia.
A la empresa de la competencia, le puede interesar bloquear al servidor albergador de su página web,
impidiendo que sus potenciales clientes puedan operar en su tienda, y «obligándoles»
a ir a su tienda, robándoles mercado. Para ello, se utiliza la técnica de saturación de
peticiones «pesadas» a la aplicación: registro de usuarios, operaciones pesadas con bases de datos…
de manera automatizada
JCaptcha obliga al visitante de la página web a introducir textos personalizados,
tarea que es muy dificultosa de descifrar para una máquina, pues requiere un algoritmo más complejo y
más recursos para obtenerlo.
Por mi experiencia en informática y conocimientos matemáticos, veo que no hay ningún algoritmo imposible
de descifrar, generándose una lucha constante entre las medidas de seguridad y los trucos utilizados
para hackearlos.
Sin ir más lejos, el origen de Facebook nace de un ataque a la seguridad informática de las
universidades americanas, después de que, una novia dejara a su chico «colgado». Como contraataque,
el novio abandonado, robó las fotos de las chicas de las universidad de prestigio americanas, creando
su primera red social.
En los últimos meses, me ha llamado la atención los ataques cibernéticos
realizados contra el Dalai Lama y el régimen nucler iraní.
En mi opinión, es bastante probable que, en un futuro no muy lejano, empiece a primar más la seguridad
informática, y más en un mundo globalizado como el actual, donde estamos todos comunicados y escuchamos con
frecuencia vulneraciones de la seguridad informática. Ya existen Másters orientados a esta especialidad.
Volviendo a JCaptcha, me llamó la atención la siguiente noticia: existen empresas en India que
«dan servicio a bajo coste» para destinar personas a bajo coste a la tarea de introducir JCaptchas de manera manual y saturar así
las aplicaciones web.
Empezamos: jCaptcha en Struts
Para realizar este tutorial con éxito, es imprescindible tener conocimientos básicos de Struts 1.
Primera parte: configuración.
1) Descargar la aplicación “Struts Mail Reader”
2) Desde el directorio WEB-INF/lib, copiar los siguientes ficheros con extensión Jar en nuestra aplicación web.
El listado es:
1) Commons-collections.
2) Commons-logging.
3) ehCache-1.0.
4) JCaptcha-all-1.0-RC2.0.1.
5) Log4j-1.2.4.
3) Añadir la siguiente declaración de plugin en el fichero de configuración de struts-config.xml:
<plug-in className=»com.octo.captcha.module.struts.CaptchaServicePlugin»/>»
Segunda parte: implementación.
En nuestro ejemplo, vamos a introducir un JCaptcha a la acción «SaveRegistration».
Struts-Config.xml
1) La acción «SaveRegistration» está gestionada por la acción «VerifyCaptchaChallengeAction»,
y si se produce «success» (la identificación ha sido correcta), el flujo dirige a la acción comentada en el punto 2),
que ejecuta el salvado.
2) La acción «/jcaptchaRegistration» es la encargada de realizar el salvado de los datos.
3) La acción «/jcaptcha» es necesaria para la implementación de jcaptcha.
Vista
1) El formulario apunta a la acción “/SaveRegistration”.
2) La imagen se recoge de la acción de “jcaptcha.do”.
El flujo
1) El usuario, al enviar el formulario de salvado, llama a «VerifyChallengeAction», que comprueba si la imagen introducida
por el usuario es correcta. Si es el caso, retorna «success», que ejecuta la acción orientada al negocio
del aplicativo, en este caso, salvar el registro.
2) Si la imagen introducida es incorrecta, teóricamente se debería recargar la página actual, indicando el error
al usuario para poder darle posibilidad de realizarlo correctamente.
Tercera parte: pantallazos.
¡Espero que os haya gustado y lo hayáis entendido!
Interesante el articulo, hace ya mucho tiempo que vengo interesado en utilizar un captcha como medio de seguridad pero ahora que tengo tiempo para leer a detalle, me surge un problema
Primer problema: defines en un archivo struts-config.xml. El problema viene que no encuentro ese archivo o te refieres al strus.xml? si es asi, aca es donde se suscita el segundo problema
Segundo problema: al insertar entre las etiquetas
me marca un error, si lo pongo fuera de las etiquetas marca error, dentro de un action marca error.
Si tienes alguna idea de como solucionar este pequeño error que me aparece,
escribirme a: a_rkx@hotmail.com
De antemano, gracias
Buenos días,
Te recomiendo que vayas a la siguiente web: http://jcaptcha.octo.com/confluence/display/general/Simple+Servlet+Integration+documentation, donde puedes encontrar material para conseguir tu objetivo.
De cara al futuro, dos cosas: uno, si respondo a preguntas que estén en la web de adictosaltrabajo en tutorial, y dos, para responder a preguntas, debes ser más específico, no has comentado en tu duda en qué contexto trabajas, qué buscas ni cual es el pregunta. Por favor, de cara al futuro, sé más específico para que pueda entenderte mejor.
Seguro que así ganamos todos.
Suerte,
Jaime.
Buenos días,
Primero, agradecerte el artículo, me ha orientado mucho a la hora de integrar jcaptcha en un proyecto que llevo en Struts.
Todo va bien exceptuando que, en el .jsp que muestra el captcha (en mi caso login.jsp), no me muestra la imagen del captcha. Lo demás funciona correctamente, la pregunta, el input e incluso haciendo submit me sale el mensaje de error por no haber pasado la valicadión del captcha.
En la consola aparece la excepción:
\\\»java.lang.IncompatibleClassChangeError: Found class
com.sun.image.codec.jpeg.JPEGImageEncoder, but interface was expected
at com.octo.captcha.module.struts.image.RenderImageCaptchaAction.execute\\\»
Buscando por internet, dice que es debido a que he realizado algún cambio binario incompatible con la librería…
He optado por implementar la clase RenderImageCaptchaAction tal como viene en el .jar \\\»jcaptcha-all-1.0-RC2.0.1.jar\\\» (Mapeando el Action en Struts-Config.xml)
y en la línea:
\\\»JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);\\\»
jpegEncoder me devuelve \\\’null\\\’, por lo que en la siguiente línea:
\\\»jpegEncoder.encode(challenge);\\\»
salta un NullPointerException…
¿Hay algo que no he configurado bien?¿Me he pasado algo por encima?
Muchas gracias de antemano, y gracias a los miembros de la web por compartir vuestras experiencias.
Yo probaría otro JAR directamente…. http://sourceforge.net/projects/jcaptcha/files/jcaptcha/jcaptcha-1.0/jcaptcha-1.0-bin.zip/download.
Me cuentas si quieres y en ratos libres te echo una mano
Hola de nuevo y gracias por la rapidez de la respuesta.
He adjuntado el JAR que comentas:
http://sourceforge.net/projects/jcaptcha/files/jcaptcha/jcaptcha-1.0/jcaptcha-1.0-bin.zip/download.
Sigue dándome el mismo error… ¿puede ser que adjunte el JAR mal? Hasta ahora he estado usando maven, por lo que para adjuntar el JAR que me comentas he probado adjuntando el ZIP entero , también adjuntando el JAR jcaptcha-1.0-all que viene en su interior, pero sigue saltando la misma excepción.
Para añadir el JAR a mi proyecto (uso ECLIPSE GANYMEDE) lo hago de la manera tradicional, botón derecho, properties, build Path, add external JARs…
Gracias de nuevo.
Saludos.
Hola Manuel, peléate un poco y lo conseguirás. Si hace falta, empieza desde cero y comprueba bien las librerías.
Solucionado, se ha tenido que implementar el action \\\»RenderImageCaptchaAction\\\» y sustituir la llamada \\\»JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);\\\» por \\\»ImageIO.write((BufferedImage)challenge, \\\»jpg\\\», responseOutputStream);\\\».
Parece ser que en jdk5, JPEGImageEncoder era una clase y en jdk6 es una interfaz. De ahí la incompatibilidad.
Saludos.
Me alegro de que lo hayas resuelto Manuel, en ocasiones (especialmente en productos OpenSource) es necesario meter la cabeza hasta el fondo….