Segurança do Web UI Framework - Proteção contra Ataques CSRF

Use esse procedimento no Web UI framework para proteção contra ataques CSRF.

Procedimento

  1. Abra o arquivo web.xml.
  2. Para validar o token que é utilizado para proteger contra ataques CSRF, crie um validador de solicitação que será registrado no aplicativo (se o validador ainda não estiver presente no arquivo web.xml).

    Exemplo:

    <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 os modos nos quais o validador pode operar:
    • ALL - Solicitações POST e GET serão validadas para o token CSRF.
    • POST (padrão) - Apenas as solicitações POST serão validadas para o token CSRF.
    • NONE - O validador não validará nenhuma solicitação para o token CSRF.

    É possível especificar o modo do validador no parâmetro de contexto do arquivo config.xml ou do arquivo web.xml (se o modo do validador ainda não estiver presente no arquivo web.xml).

    O modo é padronizado como POST caso não seja especificado ou caso não se especifique um parâmetro de contexto para o modo de validação. IBM® recomenda usar o modo POST para validar solicitações.

    Exemplo:

    <context-param>
       <param-name>scui-csrf-validator-request-method</param-name>
       <param-value>ALL</param-value>
    </context-param>
  4. Se necessário, configure a inclusão do URI (Universal Resource Indicator) e listas de exclusão para o validador, usando as seguintes diretrizes:
    • Se uma URI estiver na lista de exclusões, ela não será validada para o token CSRF.
    • Se um URI estiver na lista de inclusão, e não estiver na lista de exclusão, ele será validado para o token CSRF.
    Utilize os seguintes parâmetros de contexto no arquivo web.xml para criar listas de inclusão e exclusão. Qualquer número de parâmetro pode ser fornecido.
    • csrf-include-uri

      Qualquer solicitação com um URI que tiver o mesmo valor será validado para o token CSRF.

      Exemplo (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

      Qualquer solicitação com um URI que termine com o valor é validado para o token CSRF.

      Exemplo (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

      Qualquer solicitação com uma URI que corresponda ao regex (fornecido como o valor para o parâmetro) é validada para o token CSRF.

      Exemplo (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

      Qualquer solicitação com um URI que corresponder ao valor terá o bypass efetuado e não será verificado para o token CSRF.

      Exemplo (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

      Qualquer solicitação com um URI que termine com o valor passa por bypass

      Exemplo (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

      Qualquer solicitação com um URI que corresponder ao regex (fornecido como o valor do parâmetro) não será verificado para o token CSRF.

      Exemplo (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>

    Por padrão, todos os URIs estão na lista de inclusão, mesmo se um parâmetro csrf-include não for fornecido. Você deve especificar explicitamente que uma URI está na lista de exclusões. Se nenhuma lista de inclusão for fornecida, por padrão, todos os URIs serão considerados estarem na lista de inclusão. URIs específicos podem ser incluídos em uma lista de inclusão pelo aplicativo para evitar que todos os URIs sejam validados para o token CSRF.

    Por padrão, a estrutura fornece uma lista de exclusão para efetuar bypass da validação CSRF para solicitações de arquivos do tipo png, gif, css ou js.

  5. A maioria dos ataques de CSRF é feita apenas ao replicar solicitações POST em suas solicitações GET equivalentes. Como a maioria dos aplicativos não diferencia entre solicitações POST e GET, os ataques normalmente funcionam. Para diferenciar entre solicitações GET e POST, em suas definições de ações Struts, configure os modos como o validador pode operar usando o parâmetro requestMethodSupported da ação:
    • POST - (padrão) Apenas solicitações POST são permitidas.

      Se requestMethodSupported não estiver configurado ou for um valor desconhecido, ele será padronizado como POST.

    • ALL - Ambas as solicitações GET e POST são permitidas.

    Exemplo:

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