Seguridad de la infraestructura de interfaz de usuario web: protección contra los ataques CSRF

Utilice este procedimiento en la infraestructura de interfaz de usuario web para protegerse de ataques CSRF.

Procedimiento

  1. Abra el archivo web.xml.
  2. Para validar la señal (token) que se utiliza como protección contra ataques CSRF, cree un validador de solicitud que se registrará en la aplicación (si el validador no está ya presente en el archivo web.xml).

    Ejemplo:

    <context-param>
      <param-name>scui-request-validator-10</param-name>
      <param-value>
    com.sterlingcommerce.ui.web.platform.security.SCUICSRFTokenValidator
      </param-value>
    </context-param>
  3. Configure las modalidades en las que puede operar el validador:
    • ALL: las solicitudes POST y GET serán validadas para la señal CSRF.
    • POST (valor predeterminado): sólo las solicitudes POST serán validadas para la señal CSRF.
    • NONE: el validador no validará ninguna solicitud para la señal CSRF.

    Puede especificar la modalidad del validador en el parámetro de contexto del archivo config.xml o del archivo web.xml (si la modalidad del validador no está ya presente en el archivo web.xml).

    La modalidad toma el valor predeterminado POST si no se ha especificado ninguna modalidad o si el parámetro de contexto no se ha especificado para la modalidad de validación. IBM® recomienda utilizar la modalidad POST para validar solicitudes.

    Ejemplo:

    <context-param>
       <param-name>scui-csrf-validator-request-method</param-name>
       <param-value>ALL</param-value>
    </context-param>
  4. Si es necesario, configure listas de inclusión y exclusión de URI (indicador de recursos universal) para el validador; para ello, siga estas directrices:
    • Si un URI está en la lista de exclusión, no se validará para la señal CSRF.
    • Si un URI está en la lista de inclusión y no en la de exclusión, se validará para la señal CSRF.
    Utilice los siguientes parámetros de contexto del archivo web.xml para crear listas de inclusión y exclusión. Se puede proporcionar cualquier número de parámetros.
    • csrf-include-uri

      Cualquier solicitud con un URI que sea igual que el valor se valida para la señal CSRF.

      Ejemplo (para web.xml):

      <context-param>
         <param-name>csrf.include.uri.endswith.stk.1</param-name>
         <param-value>.do</param-value>
      </context-param>
    • csrf-include-uri-endswith

      Cualquier solicitud con un URI que finaliza con el valor se valida para la señal CSRF.

      Ejemplo (para web.xml):

      <context-param>
        <param-name>csrf.include.uri.endswith.stk.2</param-name>
        <param-value>.xml</param-value>
      </context-param>
    • csrf-include-uri-regex

      Cualquier solicitud con un URI que coincida con regex (proporcionado como valor para el parámetro) se valida para la señal CSRF.

      Ejemplo (para web.xml):

      <context-param>
        <param-name>csrf.include.uri.stk.1</param-name>
        <param-value>/stk/home.jsp</param-value>
      </context-param>
    • csrf-bypass-uri

      Cualquier solicitud con un URI que coincida con el valor se pasa por alto y no se comprueba para la señal CSRF.

      Ejemplo (para web.xml):

      <context-param>
        <param-name>csrf.bypass.uri.stk.1</param-name>
        <param-value>/console/login.jsp</param-value>
      </context-param>
    • csrf-bypass-uri-endswith

      Cualquier solicitud con un URI que finaliza con el valor se pasa por alto.

      Ejemplo (para web.xml):

      <context-param>
         <param-name>csrf.bypass.uri.endswith.stk.1</param-name>
         <param-value>.js</param-value>
      </context-param>
    • csrf-bypass-uri-regex

      Una solicitud con un URI que coincida con regex (proporcionado como valor para el parámetro) no se comprueba para la señal CSRF.

      Ejemplo (para web.xml):

      <context-param>
         <param-name>csrf.bypass.uri.regex.stk.1</param-name>
         <param-value>[a-zA-Z0-0]*servlet/param-value> 
      </context-param>

    De manera predeterminada, todos los URI están en la lista de inclusión, incluso si no se proporciona un parámetro csrf-include. Debe especificar explícitamente que un URI está en la lista de exclusión. Si no se proporciona ninguna lista de inclusión, de forma predeterminada todos los URI se consideran que están en la lista de inclusión. La aplicación puede añadir URI específicos a una lista de inclusión para impedir que se validen todos los URI para la señal CSRF.

    De forma predeterminada, la infraestructura ofrece una lista de exclusión para pasar por alto la validación CSRF para solicitudes de archivos de tipo gif, png, css o js.

  5. La mayoría de los ataques CSRF replican las solicitudes POST y las convierten en sus GET equivalentes. Puesto que la mayoría de las aplicaciones no distingue entre las solicitudes POST y GET, los ataques normalmente funcionan. Para distinguir las solicitudes GET de las solicitudes POST, en las definiciones de acciones de Struts, configure las modalidades en las que puede funcionar el validador, utilizando el parámetro requestMethodSupported de la acción:
    • POST: (valor predeterminado) sólo se permiten solicitudes POST.

      Si no se ha establecido requestMethodSupported o es un valor desconocido, toma el valor predeterminado de POST.

    • ALL: se permiten las solicitudes GET y POST.

    Ejemplo:

    <action name="accountTransfer" class="com.AccountTransfer">
      <param name="requestMethodSupported">POST</param>
      <param name="resourceId">AccountTransfer_Action002</param>
    </action>