CSRF攻击原理和防御方案在本书的跨站请求伪造章节中讨论。安全令牌可以与Web框架一起使用来解决CSRF攻击问题。
CSRF 攻击的目标通常会生成用于“写入数据”操作(例如“添加”、“删除”和“修改”)的URL,但“读取数据”操作不是CSRF 攻击的目标。进程攻击者无法检索服务器返回的数据。读取数据对CSRF 没有直接影响,因为攻击者只是利用用户的手来触发服务器操作(尽管需要注意的是XSS 漏洞或其他跨域漏洞,如果有的话,您可能会受到影响)。我们在这里只讨论CSRF 冲突本身,因为它们可能会导致其他问题)。
因此,在Web应用开发中,有必要区分“读操作”和“写操作”。例如,使用HTTP POST 需要所有“写操作”。
很多关于CSRF防护的文章都呼吁使用HTTP POST进行防护,但实际上,POST本身并不足以对抗CSRF,因为POST是自动发送的。然而,POST的使用对于保护令牌具有积极的影响,而安全令牌隐私(不可预测性原则)是防御CSRF攻击的基础。
Web 框架可以自动将令牌添加到所有POST 相关代码,包括所有表单和所有Ajax POST 请求。
完整的CSRF防护解决方案包括对Web框架的以下更改:
(1)在会话内绑定token。如果您无法将其保存在服务器端会话中,则可以将其保存在cookie 中。
(2)自动填写表单中的token字段,如。
(3) 自动向Ajax请求添加令牌。这可能需要支持现有的Ajax 封装实现。
(4) 通过在服务器端比较POST发送参数中的token是否与会话绑定的token匹配来验证CSRF攻击。
在Rails 中,您只需向应用程序控制器添加一行即可完成此操作。
防伪保护: 秘密=\’123456789012345678901234567890.\’
令牌会根据您的秘密和服务器端随机化因子自动生成,并自动添加到Rails 生成的所有表单和Ajax 请求中。该功能通过框架实现,极大地简化了程序员的开发工作。
Django 具有类似的功能,但设置起来稍微复杂一些。
首先,将django.middleware.csrf.CsrfViewMiddleware 添加到MIDDLEWARE_CLASSES 中。
(\’django.middleware.common.CommonMiddleware\’,
\’django.contrib.sessions.middleware.SessionMiddleware\’,
\’django.middleware.csrf.CsrfViewMiddleware\’,
\’django.contrib.auth.middleware.AuthenticationMiddleware\’,
\’django.contrib.messages.middleware.MessageMiddleware\’,)
接下来,将令牌添加到表单模板中。
表单操作=\’.\’方法=\’post\'{% csrf_token %}
接下来,确保您的视图层函数使用django.core.context_processors.csrf。如果使用RequestContext,则默认已使用。否则您必须手动添加。
从django.core.context_processors 导入csrf
从django.shortcuts 导入render_to_response
def my_view(请求):
c={}
c.更新(csrf(请求))
# .在此处显示代码
返回render_to_response(\’a_template.html\’, c)
这样,您的配置就会成功,并且您将能够享受CSRF 保护的好处。
由于普通JavaScript 无法获取HTTP 头信息,因此Ajax 请求中一般会插入包含token 的HTTP 头,但如果存在跨域漏洞,则可能会出现异常。
下面是使用Ajax 添加自定义令牌的示例。
$(文档).ajaxSend(函数(事件,xhr,设置){
函数getCookie(名称) {
var cookieValue=null;
if (document.cookie document.cookie !=\’\’) {
var cookies=document.cookie.split(\’;\’);
for (var i=0; i cookies.length; i++) {
var cookie=jQuery.trim(cookies[i]);
//这个cookie 字符串是否以所需的名称开头?
if (cookie.substring(0, name.length + 1)==(name + \’=\’)) {
cookieValue=decodeURIComponent(cookie.substring(name.length + 1));
休息;
}
}
}
返回cookie 值。
}
函数同源(url){
//URL 可以是相对的、方案相对的或绝对的
var host=document.location.host //主机+ 端口;
var 协议=document.location.protocol;
var sr_origin=\’//\’ + 主机;
var origin=协议+ sr_origin;
//允许绝对或相对于方案的URL 指向同一来源
return (url==origin || url.slice(0,origin.length + 1)==origin + \’/\’) ||
(url==sr_origin || url.slice(0, sr_origin.length + 1)==sr_origin + \’/\’) ||
//或任何其他非相对或绝对方案(即相对)的URL。
!(/^(\\/\\/|http:|https:).*/.test(url));
}
函数安全方法(方法){
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(方法));
}
if (!safeMethod(settings.type) SameOrigin(settings.url)) {
xhr.setRequestHeader(\’X-CSRFToken\’, getCookie(\’csrftoken\’));
}
});
Spring MVC 和其他流行的Web 框架不直接提供针对CSRF 的保护,因此您必须自己实现这些功能。
以上关于#web框架和CSRF保护的相关内容摘自互联网,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91801.html