如果我在JS中存储一个静态会话令牌以供AJAX使用,它对CSRF是否安全?
If I store a static session token in JS for use with AJAX, will it be secure against CSRF?
这几天我一直在阅读有关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中选择解决方案。
- Wordpress ajax使用多站点登录
- AJAX使用php和javascript连接到db
- 通过 ajax 使用自定义滚动条向元素添加内容
- 无法让 ajax 使用 PHP 从 MySQL 加载信息表
- 使用Ajax使用REST服务-同源策略
- Ajax 使用函数每秒获取一次 php 数据
- jquery$.ajax使用返回数据时出现问题
- AJAX使用PHP从POST获取数据
- AJAX使用从PHP生成的HTML调用的函数更新MYSQL数据库
- AJAX使用jQuery可排序(非表单)发布附加数据
- AJAX:使用AJAX加载内容后,Javascript函数将不起作用
- Ajax使用来自PHP的信息
- 如何为 jQuery.ajax 使用不同的 json 解析器
- AJAX使用相同的按钮添加和删除
- 如何让 AJAX 使用 rails 和 JavaScript 计时器工作
- ajax使用Jquery Mobile调用了两次
- 如何使用 JQuery 和 Ajax 使用另一个 ComboBox 的内容更新 HTML 文件中 ComboBox 的内
- Angular ajax 使用 $http 失败
- 如何使用 AJAX 使用
- onclick 事件调用 php 函数
- 使用jQuery和Ajax使用相同的按钮提交PayPal表单和PHP表单