如果我在JS中存储一个静态会话令牌以供AJAX使用,它对CSRF是否安全?

If I store a static session token in JS for use with AJAX, will it be secure against CSRF?

本文关键字:AJAX 使用 令牌 它对 安全 是否 CSRF 会话 静态 JS 存储      更新时间:2023-09-26

这几天我一直在阅读有关CSRF和XSS漏洞的文章,并试图提出一个解决方案:1)易于实现和使用,2)使用Javascript完成大量繁重的工作,以及3)使执行CSRF攻击几乎不可能。

我还没有见过像我将要描述的那样的解决方案。我希望这并不意味着它漏了。

根据我对AJAX和JS的了解,我提出了以下解决方案。这段代码假设用户已经通过了登录屏幕,并且在服务器和cookie中的上设置了一个会话变量,具有相同的值。

将代码粘贴进去并记录下来比解释它在做什么更容易。该代码将在用户登录后立即看到的页面中运行:

<script>
// this is the constructor:
function Controller(){
  //the following 2 variables are private, and inaccessible via JS calls
    var secretToken;  //this holds the session token, but cannot be read by the browser
    //returns the session token from the server
    var x = new ajaxObject('AJAX/retrieve_session_cookie.lasso'); 
    x.callback = function(responseText, responseStatus){
      secretToken = responseText;
    }
  //this is a private function, again inaccessible via JS calls
    function getCookie(){
      x.update();
    }
  //the following 2 functions are publicly accessible
    //just a test function to ensure that secretToken is invisible
    this.tell = function(){
      alert(secretToken);
    }
    //privileged function that calls a private function, to load the token into a private variable
    this.initialize = function(){
      getCookie();
    }
}
E = new Controller();
E.initialize();
</script>

变量secretToken不能被用户读取,因为它是控制器对象的私有成员变量。

retrieve_session_cookie.lasso中,我正在检查有效的会话,并将会话变量与浏览器的cookie匹配。如果满足这两个条件,会话变量将以纯文本形式返回,在对象E中设置为secretToken。通过仔细检查cookie是否与会话令牌匹配,我希望不可能通过CSRF获得会话令牌,因为它不能伪造cookie。输入'AJAX/retrieve_session_cookie。Lasso '不会返回任何内容,除非用户在有效会话中输入,并且只能从用户的计算机输入。

另外,既然我的控制器具有对会话令牌的本地访问权限,我就可以在每个AJAX请求中"刻录"会话令牌,所以每次请求AJAX文件时,我甚至不必再考虑它传递令牌。所有AJAX对象和请求都将在控制器对象的构造函数中初始化为私有成员,因此没有人可以访问/修改回调函数来公开会话令牌。

为每个AJAX调用传递会话令牌将保护每个其他AJAX文件,因为它们在返回任何数据之前都会对匹配会话令牌的cookie执行相同的检查。而且,在我的编程中,又少了一个需要担心的变量。

如果我要继续使用以这种方式实现的控制器,是否有任何方法可以让令牌被用户或恶意编码器通过CSRF访问/利用?

首先,对于用户获取令牌是微不足道的,对于CSRF来说,这根本无关紧要。你传输给用户的任何东西都可能被拦截,任何从javascript发送的东西都可能被篡改。cookie总是很容易重放(谁在乎伪造它们?它只是一个随机数),只要你使用HTTPS就没关系。老实说,我认为这个安全系统根本没有解决CSRF问题,事实上,我不确定您想要保护的是什么。不管你的.lasso文件在哪里,或者它们包含什么。

重要的是GET和POST请求可以被伪造。使用CSRF令牌的全部意义在于,第三方在不了解站点的情况下无法创建准确的GET/POST请求(由于同源策略,将简单的令牌写入隐藏值即可工作)。不要使用自己的安全系统,从跨站点请求伪造Cheat Sheet中选择解决方案。