aem - 需要帮助解决和理解 com.adobe.granite.csrf.impl.CSRFFilter doFilter : the provided CSRF token is invalid in AEM 6. 1

标签 aem

问题概述:
我们正在将系统从 CQ5.4 升级到 AEM 6.1。
在现有代码中,我们使用 ajax 引用了 POST.jsp,我们在其中调用身份验证服务来向系统验证外部用户。
当我们对资源 POST.jsp 执行 ajax 发布时,我们收到以下错误。在错误日志中。
com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的 CSRF token 无效

我们尝试了什么:

  • 为了解决这个问题,我们按照 AEM 6.1 文档尝试了解决方案 https://docs.adobe.com/docs/en/aem/6-1/administer/security/security-checklist.html#par_title_1046104842 .
    但它没有奏效。
  • 我们尝试从 system/console/configMgr 中的 Adob​​e Granite CSRF 过滤器配置中的过滤器方法中删除 POST。这有效,但这会影响我们系统的安全性,因为它允许
    其他外部系统POST数据。 (如果我在安全方面错了,请纠正我)
  • 我们尝试在来自 system/console/configMgr 的 Adob​​e Granite CSRF 过滤器配置中的安全用户代理中添加谷歌浏览器用户代理。这有效,但该应用程序可以从各种其他用户代理中使用,我们无法在安全用户代理中继续列入白名单。

  • 我们还反编译了 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)是否存在于 Adob​​e Granite CSRF Filter 的配置过滤方法中。
    doFilterBasedOnUserAgent 检查当前请求的用户代理是否在配置的用户代理中不存在。
    request.getAuthType 在我们的例子中是“FORM”。所以这不会导致(403)。

    The isValidRequest gets the request param :cq_csrf_token and checks if this parameter value is valid. (Observed this and is valid in our case and sends the parameter)



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

    最佳答案

    所以你可以做几件事——

  • 将 cq.jquery clientlib 用于 jquery,而不是手动创建和包含 jquery 库。 aem 提供的 jquery 具有处理 csrf token 的代码。
  • 在您的代码中包含 granite.csrf.standalone clientlib。它会为你做这些事情。
  • 您可以从/libs/granite/csrf/token.json 手动获取 token 的值。在 CSRF-Token header 中的每个请求中发送此值。
  • 关于aem - 需要帮助解决和理解 com.adobe.granite.csrf.impl.CSRFFilter doFilter : the provided CSRF token is invalid in AEM 6. 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34063934/

    相关文章:

    java - 使用请求调度程序 JSP 发送 404

    maven - CQ5 如何在自定义插件中使用外部 jar

    java - 如何防止用户进入 'back' 但在 JSP 中注销后保留缓存?

    aem - 给定路径,在 Sightly 中获取对资源的引用

    java - Adobe CQ/AEM 文章/页面创建时指示灯显示为已发布,但未发布

    aem - 在 AEM 6.0 中启用拼写检查器

    javascript - 已迁移工作流模型和脚本以进行 6.3 到 6.5 AEM 升级,但未拾取脚本

    java - 需要帮助在 Adob​​e CQ 5.4 中创建带有监听器的组件

    javascript - 在经典对话框中选择的下拉值在触摸 UI 对话框中不会显示相同的值

    java - 无法通过 POST 使用 sling servlet 中的请求调度程序重定向到 AEM 中的另一个页面