保护基于prototype.js的XHR请求免受CSRF

Posted

技术标签:

【中文标题】保护基于prototype.js的XHR请求免受CSRF【英文标题】:Protecting prototype.js based XHR requests against CSRF 【发布时间】:2011-07-29 22:39:29 【问题描述】:

Django 已经更新到 1.3,事实上从 1.2.5 开始,它已经扩展了将跨站点请求伪造保护令牌传递给 XMLHttpRequests 的方案。 Django 人员提供了 an example for jQuery 来为每个 XHR 应用特定的标头。

原型(因此是 Scriptaculous)必须遵守这个方案,但我找不到告诉原型添加 X-CSRFToken 标头的方法。最好的办法是以一种在整个应用程序中应用它的方式执行一次(比如 jQuery)。

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

这是一个疯狂的猜测,但您可以尝试 extending 基础 AJAX 类...

Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
    function (callOriginal, options) 
        var headers = options.requestHeaders || ;
        headers["X-CSRFToken"] = getCookie("csrftoken");
        options.requestHeaders = headers;
        return callOriginal(options);
    
);

【讨论】:

我终于有时间来测试您的解决方案,并且它奏效了。我刚刚在匿名函数中集成了getCookie 函数,就像在 Django 提供的 jQuery 示例中一样。

以上是关于保护基于prototype.js的XHR请求免受CSRF的主要内容,如果未能解决你的问题,请参考以下文章

保护 Express 免受 XSS:对整个传入请求的 HTML 实体进行编码是不是足够?

Laravel 保护路由免受其他系统请求

是否有必要保护 JAX-RS 请求免受 CSRF 影响?

如何保护 Webservice 免受拒绝服务攻击?

如何保护 laravel api 路由免受外部 GET 请求的影响

从 AJAX 获取受 SSO 保护的 XHR 资源