A cada uno le pica la paja que se le mete por el culo, no el resto del pajar.
Gonzo, El Sentido De La Vida

Archivos en el mes de February del 2008

[Struts] – Comunicaciones seguras: SSL

Es posible que nuestra aplicación web requiera comunicaciones seguras. Para ello se utiliza https como protocolo de transporte en lugar del conocido http; es decir se cifran las comunicaciones a nivel de la capa de transporte mediante Secure Sockets Layer (SSL).

Como es lógico, cifrar las comunicaciones requiere más recursos (tiempo de cifrar / descifrar, mensajes más pesados…), y normalmente las aplicaciones no necesitan comunicaciones seguras más que en algunas acciones. Por tanto construir toda la aplicación bajo https no es tan eficiente como delimitar zonas no seguras (transporte http) y zonas seguras (transporte htpps) dentro de la misma aplicación.

Para ello utilizaremos un plug-in de código abierto, la extensión de Struts SSL Extension (SSLEXT).

  • La distribución, sslext.jar y sslext.tld, consiste en un clase para la inicialización, SecurePlugIn, una clase para el procesado de peticiones, SecureRequestProcessor, y una clase para los mapeos de actions, SecureActionMapping.
  • Necesita Java Secure Socket Extension (JSSE) que se distribuye con el JDK 1.4 o posteriores.
  • Lógicamente es necesario que el servidor de aplicaciones que estemos utilizando tenga habilitado SSL.

Paso a Paso

Para utilizar la extensión por tanto, debemos

  • incluir sslext.jar y sslext.tld en nuestra aplicación
  • [struts-config.xml] – Personalizar los mapeos de las clases actio

<action-mappings type="org.apache.struts.config.SecureActionConfig">

  • [struts-config.xml] – Personalizar el procesador de peticiones

<controller processorClass="org.apache.struts.action.SecureRequestProcessor" />

  • [struts-config.xml] – Declarar el plug-in

<plug-in className="org.apache.struts.action.SecurePlugIn">

    <set-property property="httpPort" value="80"/>

    <set-property property="httpsPort" value="443"/>     

    <set-property property="enable" value="true"/>     

    <set-property property="addSession" value="true"/>     

</plug-in>

  • [struts-config.xml] – Marcar las acciones seguras mediante la propiedad secure a TRUE

<action path="/inicio*" type="es.mec.accionesintegradas.control.actions.InicioAction" parameter="inicio{1}" >

    <!– Obligamos a esta acción a utilizar https : segura –>

    <set-property property="secure" value="true"/>

    <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • [struts-config.xml] – Marcamos las acciones no seguras mediante la propiedad secure a FALSE

<action path="/salir*" type="es.mec.accionesintegradas.control.actions.LogoutAction" parameter="logout{1}">

      <!– Obligamos a esta acción a utilizar http : NO segura –>

      <set-property property="secure" value="false"/>

      <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • Si queremos especificar que una página JSP sea segura (o no segura) :

<%@ taglib uri="http://www.ebuilt.com/taglib" prefix="sslext"%>

<sslext:pageScheme secure="true"/>

Crítico : Cambio http <-> https

Realizar un cambio de http a https y viceversa implica cambiar el protocolo de transporte y el puerto de comunicación (8080 a 8443 ó 443). Puede influir en los CortaFuegos de los sistemas de comunicaciones de la empresa (hay que habilitar esos puertos también!). Internamente es importante saber que internamente este cambio de protocolo implica realizar un redirect.

Finalmente cambiar de una comunicación segura a no segura puede exponer datos críticos seguros a un usuario malicioso que suplante la personalidad del usuario legítimo. Normalmente una vez que se establece una conexión segura no se debe voler a una no segura.

Más información

[tags]J2EE, Struts, SSL, SSLExt, seguridad[/tags]

[Struts] – Realizar una acción común en todos los action

Es posible que queramos realizar una misma acción común en un grupo de clases Action antes (o después) de realizar las acciones particulares de cada clase Action.

Ejemplos típicos como las validaciones o la autentificación del usuario que navega es posible realizarlas más eficientemente utilizando Struts Validator las primeras y la segunda con otras soluciones para implementar la política de seguridad requerida ya discutidas aquí. Otros ejemplos podría ser auditoria o validaciones cruzadas.

La manera de implementar la acción comun es implementar una clase Action que será el padre del resto, BaseAction. En el método execute (en general, porque según la arquitectura de la aplicación podremos implementar otras acciones como consultar, consultarTodos, editar, visualizar, validar, guardar…) implementamos la acción común. A continuación, ejecutamos un método abstracto, doExecute, que es el que implementará la acción particular de cada clase Action que extienda de BaseAction.

 

public abstract class BaseAction extends Action {

    public final ActionForward execute(

       ActionMapping mapping,

       ActionForm form,

       HttpServletRequest request,

       HttpServletResponse response)

    throws Exception {

        HttpSession session    = request.getSession();

        Usuario usuario        = (Usuario) session.getAttribute(Constantes.USER_KEY);

 

        // redirigimos a la entrada de la zona autenticada

        if (usuario == null) return (mapping.findForward("logon"));

 

        return doExecute(mapping, form, request, response, usuario);

    }

 

    public abstract ActionForward doExecute(

       ActionMapping mapping,

       ActionForm form,

       HttpServletRequest request,

       HttpServletResponse response,

       Usuario usuario) throws Exception;

}

[tags]J2EE, Struts, seguridad[/tags]

[Lecturas Recomendadas] – 20080222

elmundo.es

  • Patea al inmigrante!, enlaza con un sitio donde puedes patear inmigrantes (a Australia) y te muestra lo que Australia perdería con el inmigrante.

WebAppears

Vía : Set de iconos de Aplicaciones Web, [Trazos Web]

El Rincón del Programador 

Tira cómica JVM

Navegapolis

WebsitGrader

Vía : Hazte un completísimo analisis online (de tu blog), [aborregate.com]

Almendros en Flor

mec_cubos_cerezos.jpgDesde hace unos días vengo observando que… los almendros de Madrid están ya florecidos !!! 

Esta foto se tomó el 19/02/2008, a la puerta de mi trabajo. Muestra los almendros, totalmente florecidos, al igual que el resto que me encuentro de camino a casa, y en el parque del capricho este fin de semana.

Hasta ahora yo confundía cerezos y almendros por el parecido de su flor. Y me llamaba mucho la atención, porque sé que la floración del cerezo es por marzo. De hecho, en el valle del Jerte, se celebró el año pasado el 21 de marzo; este año se estima para el 28 de marzo.

Para más información consulta la página de turismo del Valle del Jerte, y de paso, es un espectáculo que merece la pena, te lo recomiendo plenamente.

Yo no he estado por ejemplo en Mallorca, pero esta foto de un campo de almendros merece la pena verla en vivo. 

[Struts] – Prevenir envíos de formularios duplicados

Los envíos múltiples de un formulario con la misma información (Double Submits), son producidos por el propio usuario de una aplicación web accidentalmente (pulsando varias veces un botón o refrescando la pantalla mientras una transacción se está realizando y tarda en completarse) o por ataques malintencionados.

Estos comportamientos rompen el correcto flujo de la aplicación, y pueden causar problemas leves, como realizar varias veces la misma consulta a base de datos, más graves, como sobrecargar un servidor ya sobrecargado con operaciones redundantes, y fatales, como cobrar dos veces la misma venta.

Una primera aproximación para evitar este problema suele ser implementar mecanismos de control en el lado del cliente (HTML, JSP, JavaScript). Personalmente no me gusta por los problemas de mantenimiento que implica y porque no soluciona todos los casos, como los ataques malintencionados. Por tanto, siempre deberíamos controlar el lado del servidor, y puntualmente el lado del cliente.

Para asegurar que nuestra aplicación sigue un flujo correcto, Struts nos ofrece un sencillo mecanismo : el manejo de "Tokens" en nuestras clases Action. Para implementarlo debemos:

  1. Identificar el formulario al que queremos proteger del doble envío.
  2. Identificar el action que carga los datos, y el action que guarda los datos (o realiza la transacción)
  3. Guardamos el token en el action de carga.
  4. En el action que guarda, comprobamos si el token que nos llega es el correcto antes de realizar las operaciones de negocio.
  5. Y finalmente, comprobamos que la solución funciona :) (a cuántos desarrolladores se le olvida este punto siempre ?)

flujo_struts_tokens.JPG

Para guardar un token en el action que carga, utilizamos primero el método resetToken (por si después de llegar a una página no queremos guardar sino cargar otra) y luego saveToken :

resetToken(request);

saveToken(request);

Para comprobar si es válido :

if (isTokenValid(request)) {

      //Invocamos los métodos de negocio necesarios

     

} else {

      //Generamos una excepción

     

}

Sorprendentemente fácil no?

Una solución elegante dentro de aplicaciones web reales, consiste en utilizar una clase Action padre de la que extiendan todos nuestros action. De esta forma podemos implementar este código únicamente en una clase (nuestro action padre) y disfrutarla en toda nuestra aplicación.

Enlaces externos

Fuente: 1×1

Fuente : lshimokawa.blogspot.com

Fuente: O'Reilly Safari, Books Online

[tags]Struts, Double Submits[/tags]

Comenta