Web 框架与 CSRF 防御,webflux框架

Web 框架与 CSRF 防御关于 CSRF 的攻击原理和防御方案,在本书“跨站点请求伪造”一章中有所阐述。在 Web 框架中可以使用 security token 解决 CSRF 攻击的问题。
CSRF 攻击的目标&#xf

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

Like (0)
CSDN的头像CSDN
Previous 2024年6月23日
Next 2024年6月23日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注