javascript - 如果我在 JS 中存储静态 session token 以便与 AJAX 一起使用,它是否可以安全地抵御 CSRF?

标签 javascript ajax security csrf

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

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

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

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

<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 无法被用户读取,因为它是 Controller 对象的私有(private)成员变量。

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

此外,现在我的 Controller 可以本地访问 session token ,我可以在每个 AJAX 请求中“烧入” session token ,因此每次 AJAX 请求时我什至不必再考虑传递 token 请求 AJAX 文件。所有 AJAX 对象和请求都将在 Controller 对象的构造函数中初始化为私有(private)成员,因此没有人可以访问/修改回调函数以泄露 session token 。

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

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

最佳答案

首先,对于用户来说,获取您的 token 是微不足道的,而对于 CSRF 来说,这根本不重要。您传输给用户的任何内容都可以被拦截,从 javascript 发送的任何内容都可以是 tampered with 。 Cookie 总是很容易重放(谁在乎伪造它们?它只是一个随机数。),只要您使用 HTTPS,这并不重要。老实说,我认为这个安全系统根本不解决 CSRF 问题,事实上我不确定你想要防止什么。您的 .lasso 文件位于何处或其包含什么内容并不重要。

重要的是 GET 和 POST 请求是可以伪造的。拥有 CSRF token 的全部意义在于,第三方在不了解有关站点的情况下无法创建精确的 GET/POST 请求(并且由于 Same-Origin Policy ,编写为隐藏值的简单 token 有效)。 不要推出自己的安全系统,从 Cross-Site Request Forgery Cheat Sheet 中选择一个解决方案。

关于javascript - 如果我在 JS 中存储静态 session token 以便与 AJAX 一起使用,它是否可以安全地抵御 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5584029/

相关文章:

javascript - 如何拆分我的日期选择器日期状态的日期?

javascript - 使用 D3 转换禁用 SVG 上的悬停 CSS

mysql - 使用 AJAX 每秒更新同一个 MySql 表

c# - Telerik Grid中ajax绑定(bind)数据时如何进行分组和聚合

java - BufferedReader 的安全实现

javascript - 在 ES6 类中使用 EventEmitter

javascript - ExtJS 从 URL 获取更新进度条

jquery - 使用 AJAX 和 formData 上传多个文件(单独上传,而不是多个文件一起上传)

java - 用于第三方集成的两种方式密码加密

security - 我怎样才能允许人们收听音频剪辑,但可以限制他们下载它们?