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

CSRFGuard:如何将CSRF令牌注入到AJAX调用返回的URL中

高朝明
2023-03-14

我们正试图通过使用CSRFGuard将CSRF保护添加到现有的java web应用程序中。我们遵循了OWASP的令牌注入指南,这让我们走了大部分路。我们使用的是动态DOM操作方法,发现大多数URL/forms/AJAX调用都使用插入的CSRF令牌正确格式化。我们的问题是:

某些页面的一部分是由返回jspfs的AJAX调用动态生成的。返回的jspfs具有从不受CSRFGuard DOM操纵的链接,因此没有CSRF令牌。单击这些链接会导致CSRF冲突,因为不存在令牌。

此外,根据AJAX支持的OWASP指南,需要在AJAX调用之前引用动态脚本,以便可以拦截AJAX调用并将CSRF令牌插入到头中。这与动态更新DOM的脚本相同。所以,为了解决这个问题,我需要在AJAX调用之后运行脚本,但我也需要在AJAX调用之前运行脚本,以便首先运行脚本。尝试运行两次会导致问题。

这里的正确解决方案是什么?是否需要修改CSRFGuard javascript文件,以便可以针对目标元素运行动态令牌注入?这个问题已经解决了吗?

共有2个答案

谢骏奇
2023-03-14

注意:此答案需要修改CSRFGuard。

我正在使用SkateJS(https://github.com/skatejs/skatejs)要监视的动态更新,请执行以下操作:

这将捕获javascript工具包在初始DOM加载后插入的标记。

我还必须修改脚本,防止它在加载时总是扫描整个DOM树以插入令牌。这是非常低效的,使用上述方法是不必要的。

下面是SkateJS配置的示例

window.addEventListener('load',
    function() {
        var config = {
            ready : function(element) {
                if (CsrfGuard && CsrfGuard.isEnabled) {
                    CsrfGuard.injectTokens([element]);
                } else {
                    skate.destroy();
                }
            },
            type : skate.types.TAG
        };
        skate('a', config);
        skate('img', config);
        skate('form', config);
    }
);

注意:这在IE8上不起作用。为此,我正在使用Microsoft DHTML行为。

<![if IE 8]>
<style>
a,img,form {
    behavior: url("csrf_ie8.htc");
}
</style>
<![endif]>

csrf_ie8。宏达电:

<public:attach event="ondocumentready" onevent="CsrfGuard.injectTokens([element]);" />
宗政博
2023-03-14

我也有同样的问题。我修改了csrfguard。这样做:

>

  • 我从(函数() {}) 块中移出所有函数,并将它们放在块之前。
  • 我定义了2个新函数

        function getTokenNameValuePair() {
            var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest : new window.ActiveXObject("Microsoft.XMLHTTP");
            var csrfToken = {};
            xhr.open("POST", "%SERVLET_PATH%", false);
            xhr.setRequestHeader("FETCH-CSRF-TOKEN", "1");
            xhr.send(null);
            return xhr.responseText;
    } 
    
    function injectTokensForNewTags() {
        var token_pair = getTokenNameValuePair();       
        token_pair = token_pair.split(":");
        var token_name = token_pair[0];
        var token_value = token_pair[1];
        injectTokens(token_name, token_value);
    }
    

    返回带有链接的HTML块的AJAX应该如下所示:

        $.post(loadurl, function(data) {
            $(target).html(data);
            injectTokensForNewTags();
        });
    

  •  类似资料:
    • > 我正在使用OWASP CSRFGuard 3.0保护这些Restful服务不受CSRF的影响。 当使用简单的超文本标记语言访问相同的Rest服务时-AJAX请求-CSRF令牌正在设置,我得到了响应: 下面的代码工作正常。 角度代码(我对角度代码非常陌生) 有人能建议我如何设置角形标记吗。 引自: 在寻找此问题的解决方案时,请阅读以下语句。 跨站请求伪造(XSRF)保护XSRF是一种技术,通过这

    • 问题内容: 在Cakephp3中,启用Csrf组件时。我如何在ajax调用中使用它。在ajax的此参数中,csrf令牌设置在标头中。什么是价值。由于它给出了错误 未定义csrfToken 另外,如何为某些ajax调用禁用Csrf组件。 问题答案: CSRF组件将当前令牌写入,作为请求参数,您可以通过request objects 方法(或从CakePHP 3.4开始)获取它: 可以通过从控制器事件

    • 我想允许用户重置他们的密码。为了做到这一点,我首先检查他们的电子邮件是否存在于数据库中,如果存在,我向他们发送一封电子邮件,其中包含指向重置密码页面的链接。为了确保链接是安全的,后者是用jwt令牌制作的,该令牌仅对15mn有效。 但是,无法访问该url,因为有“.”在jwt中: < code > http://www . myapp . com/reset-password/eyjhbgcioin

    • 问题内容: 我正在使用ajax发布一些数据。我想处理该数据并返回到调用jQuery脚本。 这是我的jQuery: 这是我在服务器上的somescript.php: 我在服务器端是否正确执行此操作?ajax调用完成后如何访问返回字符串? 问题答案: 我想到了。需要在PHP中使用echo而不是return。 和jQ:

    • 问题内容: 我正在尝试在我的项目中实现csrf保护,但无法使其与jQuery Ajax一起使用。(不过,它适用于普通的帖子请求) 如果在发送表单之前使用chrome开发工具篡改令牌,则仍会看到“正在处理数据”文本,而不是错误。 app.js send.jade test.js 问题答案: 在有效负载消息中发送CSRF令牌: 为了简化您的工作,我认为您可以创建一个Jquery插件来执行此操作,如下所

    • 我想从Stormpath帖子中对JWT令牌和CSRF提出疑问,这些令牌和CSRF解释了将JWT存储在localStorage或Cookie中的优缺点。 [...] 如果您使用JS从cookie中读取值,这意味着您不能在cookie上设置Httponly标志,因此现在站点上的任何JS都可以读取它,从而使其与在localStorage中存储内容的安全级别完全相同。 我试图理解为什么他们建议将xsrfT