在解析和理解com.adobe.granite.csrf.impl.CSRFFilter doFilter时需要帮助:提供的csrf令牌在AEM 6.1中无效

在解析和理解com.adobe.granite.csrf.impl.CSRFFilter doFilter时需要帮助:提供的csrf令牌在AEM 6.1中无效,aem,Aem,问题概述: 我们正在将系统从CQ5.4升级到AEM 6.1。 在现有代码中,我们提到了使用ajax的POST.jsp,在这里我们调用身份验证服务来对系统的外部用户进行身份验证。 当我们向resource post.jsp发送ajax帖子时,会出现以下错误。在error.log中。 com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的csrf令牌无效 我们尝试了什么: 为了解决这个问题,我们根据AEM 6.1文档尝试了解决方案。 但它不起作用 我们

问题概述:

我们正在将系统从CQ5.4升级到AEM 6.1。 在现有代码中,我们提到了使用ajax的POST.jsp,在这里我们调用身份验证服务来对系统的外部用户进行身份验证。 当我们向resource post.jsp发送ajax帖子时,会出现以下错误。在error.log中。 com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的csrf令牌无效

我们尝试了什么:

  • 为了解决这个问题,我们根据AEM 6.1文档尝试了解决方案。
    但它不起作用
  • 我们尝试从system/console/configMgr的Adobe Granite CSRF筛选器配置中的筛选器方法中删除POST。这是可行的,但这会影响我们系统的安全性,因为它允许 其他外部系统发布数据。(如果我在安全方面出错,请纠正我)
  • 我们尝试从system/console/configMgr在Adobe Granite CSRF筛选器配置的安全用户代理中添加google chrome浏览器用户代理。这是可行的,但该应用程序可以从各种其他用户代理中使用,我们无法在安全用户代理中保持白名单
  • 此外,我们还反编译了com.adobe.granite.csrf.impl.CSRFFilter,并找到了以下代码:

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain Chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        if ((request.getAuthType() != null) && (isFilteredMethod(request)) && (doFilterBasedOnUserAgent(request)) && (!isValidRequest(request))) {
            HttpServletResponse response = (HttpServletResponse)res;
    
            this.logger.info("doFilter: the provided CSRF token is invalid");
            response.sendError(403);
            return;
        }
        chain.doFilter(req, res);
    }
    
    在上述代码中, isFilteredMethod检查当前请求(POST)是否存在于Adobe Granite CSRF Filter的已配置过滤方法中。
    doFilterBasedOnUserAgent检查当前请求的用户代理是否不在配置的用户代理中。
    在我们的例子中,request.getAuthType是“FORM”。所以这不会导致(403)。

    isValidRequest获取请求参数:cq_csrf_令牌并检查 此参数值有效。(注意到这一点,在我们的案例中是有效的 并发送参数)


    那么过滤方法和用户代理的意义是什么呢?尽管所有CQ和AEM 5.x版本都支持这种发布请求的方式,但为什么CSRF会发送403 for POST.jsp呢?

    因此,您可以做几件事-

  • 将cq.jquery clientlib用于jquery,而不是手动创建并包含jquery库。aem提供的jquery具有处理csrf令牌的代码
  • 在代码中包括granite.csrf.standalone clientlib。它会帮你的
  • 您可以从/libs/granite/csrf/token.json手动获取令牌的值。将此值与CSRF令牌头中的每个请求一起发送

  • 或者,您可以在“Adobe Granite CSRF filter configuration”(Adobe Granite CSRF filter configuration)下过滤您自己的servlet,而不允许使用cq jquery进行所有POST请求或以上操作。

    如前所述,isValidRequest获取请求参数:cq_CSRF_令牌,并检查此参数值是否有效,因此我们正确获取令牌和有效值,通过将其值与/libs/granite/csrf/token.json进行比较进行交叉检查,您可以演示一个如何手动添加令牌的示例吗?您能告诉我您所做的修复吗?