Habilitar la protección contra la falsificación de petición Cross-Site en Struts

La falsificación de petición Cross-Site (CSRF) es un tipo de intrusión malintencionada que engaña al usuario para que envíe peticiones no intencionadas. Por ejemplo, un intruso puede engañar a un usuario autenticado para que Pulse un enlace y actualice su información personal. HCL Commerce acepta esta solicitud como válida, ya que existen cookies de sesión adecuadas como parte de la solicitud.

Cuando se habilite la protección contra falsificación de solicitudes entre sitios, se requiere un parámetro de URL designado denominado authToken para que se incluya como parte de la solicitud. HCL Commerce genera el valor del parámetro y lo transfiere a la página en un atributo de solicitud con el mismo nombre.

Nota: El parámetro authToken solo está disponible en las páginas SSL protegidas porque este token no puede ser aparente. Sólo se necesita esta protección para los URL vulnerables que utilizan SSL. La protección CSRF en HCL Commerce está pensada para proteger un usuario después de haberse autenticado completamente, no en un estado parcialmente autenticado (recordado).

Procedimiento

  1. Identifique la acción que desea proteger.
    Por ejemplo, UserRegistrationUpdate.
  2. Abra el archivo de configuración Struts donde se define la acción. Añada una propiedad a la acción. Asigne un nombre a la propiedad, csrfProtected. Por ejemplo:
    En versiones 9.0.0.x de HCL Commerce:
    <action
      parameter="com.ibm.commerce.usermanagement.commands.UserRegistrationUpdateCmd"
      path="/UserRegistrationUpdate" type="com.ibm.commerce.struts.BaseAction">
      <set-property property="https" value="0:1"/>
      <set-property property="authenticate" value="0:0"/>
      <set-property property="csrfProtected" value="10101:1"/>
    </action>
    
    Notes:
    • El atributo de valor del elemento set-property es una lista separada por comas de <storeId>:<property value>. La petición está protegida por la protección CSRF cuando tiene un valor de propiedad de 1.
    • HCL Commerce EnterpriseEn un modelo de tienda de sitios ampliados, debe establecer acciones individuales para cada tienda de sitios ampliados.
    <action class="com.ibm.commerce.struts.v2.BaseAction" name="UserRegistrationUpdate">
       <param name="parameter">com.ibm.commerce.usermanagement.commands.UserRegistrationUpdateCmd</param>
       <param name="authenticate">0:0</param>
       <param name="csrfProtected">10101:1</param>
       <param name="https">0:1</param>
    </action> 
    
    Notes:
    • El atributo value del parámetro csrfProtected es una lista separada por comas de <storeId>:<property value>. La petición está protegida por la protección CSRF cuando tiene un valor de propiedad de 1.
    • HCL Commerce EnterpriseEn un modelo de tienda de sitios ampliados, debe establecer acciones individuales para cada tienda de sitios ampliados.
  3. Edite el archivo JSP que invoca esta acción para incluir el parámetro de URL authToken.
    Por ejemplo:
    
    <input type="hidden" name="authToken" value="${authToken}" id="WC_UserRegistrationUpdateForm_FormInput_authToken_In_Register_1"/>
    
    Nota: Si el archivo JSP se almacena en la memoria caché, la parte de la página que especifica el authToken se incluye en un fragmento de JSP que no se almacene en la memoria caché.
    Nota: Puede añadir protección CSRF para un mandato dentro de una herramienta de usuario de negocio, como por ejemplo HCL Commerce Accelerator. Para añadir la protección, modifique el archivo JSP asociado y modifique el método savePanelData() para añadir authToken. El código modificado puede parecerse al siguiente código:
    parent.addURLParameter("authToken", "${authToken}");
  4. Actualice el componente de registro StrutsConfigRegistry.

Resultados

Nota: Cuando se ha detectado una violación de la falsificación de petición de Cross-Site Scripting, la petición se modifica para ir a la vista CrossSiteRequestForgeryErrorView. Es decir, la vista aparece cuando las peticiones que están configuradas para estar protegidas no incluyen el parámetro authToken.