当前位置: 首页 > 知识库问答 >
问题:

在解决和理解com.adobe.granite.CSRF.impl.csrffilter dofilter方面需要帮助:提供的CSRF令牌在AEM 6.1中无效

唐骏祥
2023-03-14

问题概述:

我们正在将我们的系统从CQ5.4升级到AEM6.1。在现有代码中,我们引用了使用ajax的post.jsp,在这里,我们调用身份验证服务来对系统的外部用户进行身份验证。当我们对资源post.jsp执行ajax post时,会出现以下错误。在error.log中。com.adobe.granite.CSRF.impl.csrffilter dofilter:提供的CSRF令牌无效

    null

此外,我们还对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筛选器的已配置筛选方法中。
doFilterBasedOnUserAgent检查当前请求的用户代理是否存在于已配置的用户代理中。
在我们的示例中,request.GetAuthType为“Form”。因此这不会导致(403)。

isValidRequest获取请求参数:cq_csrf_token,并检查此参数值是否有效。(观察到这一点,在我们的情况下是有效的,并发送参数)

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

共有1个答案

苏高远
2023-03-14

所以你可以做几件事-

  1. 对jquery使用cq.jquery clientlib而不是手动创建和包含jquery库。aem提供的jquery具有处理csrf令牌的代码
  2. 在代码中包含granite.csrf.Standalone clientlib。它会帮你的。
  3. 您可以从/libs/granite/csrf/token.json手动获取令牌的值。将此值与CSRF-Token标头中的每个请求一起发送。
 类似资料:
  • 我正在尝试解决hackerrank中的一个“几乎已排序”的挑战。问题是: 给定一个包含元素的数组,可以只使用以下操作之一按升序对该数组进行排序吗? 交换两个元素。反转一个子段。 输入格式 第一行包含一个整数,指示数组的大小。 下一行包含以空格分隔的整数。 样本输入#1 2 4 2 示例输出 #1 是< br >交换1 2 示例输入 #2 3 3 1 2 样品输出#2 不 示例输入 #3 6 1 5

  • 编写一个方法writeChars,该方法接受整数参数n,并按如下方式输出n个字符。输出的中间字符应始终为星号(“*”)。如果要求您写出偶数个字符,则中间会有两个星号(“**”)。在星号之前,您应写出少于个字符(“ 我已经设法解决了这个问题,但不太明白一句话: 为什么是递归情况: n-2?而不是n-1?

  • 我正在重构前一段时间编写的一些代码,试图通过实现一些设计模式使其更加可靠。具体来说,我尝试使用构建器模式实例化GUI对象。 以下是“产品”的代码: 这是“混凝土建造者”的代码: 以及“抽象生成器”接口的代码: 现在,这里是“Director”的当前工作构建方法: 酷,那有什么问题吗?好吧,这可能最终无关紧要,但这是我对该方法的实际首选实现: 看看它看起来有多干净?唯一的问题是JetBrains无论

  • 我正在使用android Studio学习应用程序开发。 在build.gradle页面上,我遇到了一个错误,即 “编译'com.android.support:appcompat-v7:25.2.0'”

  • 问题内容: 我想从一个名为Sorels的表更新一个名为的表。它们之间的链接是的等于Sorels表的。这是我对Merge语句的第一次尝试,并且我正在尝试学习语法。 运行此命令时,出现以下错误: 错误10/22/2009 1:38:51 PM 0:00:00.000 SQL Server数据库错误:关键字’ON’附近的语法不正确。46 0 添加的信息* 在建议了第一个修复程序之后,代码如下: 现在我得

  • 我有一个linq查询,我在foreach循环中迭代其结果。 第一个是一个从表布局面板中获取控件集合的查询,然后我遍历该集合并从表布局面板中删除控件,因此: 上面的操作并不像我预期的那样(即抛出一个错误),它只删除了一半的控件(奇数的控件)。似乎在每次迭代中,AllItems都会减少其自身,尽管底层集合正在修改,但不会抛出错误。 如果使用字符串数组执行Similar: 这次Visual studio