csrf攻击ajax,六十六:CSRF攻击与防御之CSRF防御之ajax防御和ajax封装(示例代码)

app里面还是要绑定CSRFProtect

ee1f58e07618465e86d851da1cd07850.jpg

from flask_wtf import CSRFProtect # flask_wtf 已经提供CSRF的防御手段

CSRFProtect(app) # 绑定app

登录页的js

097dbb1258e54082954d57483f0422f8.jpg

$(function () {

$(\'#submit\').click(function (event) {

event.preventDefault(); // 阻止默认form提交表单行为

var email = $(\'input[name=email]\').val();

var password = $(\'input[name=password]\').val();

var csrf_token = $(\'input[name=csrf_token]\').val();

// ajax

$.post({

\'url\': \'/login/\',

\'data\': {

\'email\': email,

\'password\': password,

\'csrf_token\': csrf_token

},

\'success\': function (data) {

console.log(data)

},

\'fail\': function (error) {

console.log(error)

}

});

});

});

在页面里面引入js

44ca5d1c38de4d55802460c69f30324a.jpg

登录
邮箱:
密码:

请求页面

2d2aa9e06e8f4f5c84ceb85056597227.jpg

3af8b6983cdd4ca99ea852aa0faaf485.jpg

以上方法虽能使用csrf_token防御,可需要在每一个提交页面都写,flask推荐的方式是将csrf_token()放到meta标签下下,发送数据时,放到头部信息中

使用jinja的模板继承功能,base模板:

209fa44364ee4aa9894fc79c472431bc.jpg

Title

{% block head %}{% endblock %}

导航条

{% block body %}{% endblock %}

底部

登录页继承base模板

c80783ccb6154fecb0b73816033ac778.jpg

{% extends \'base.html\' %}

{% block head %}

{% endblock %}

{% block body %}

邮箱:
密码:

{% endblock %}

登录页的js,将csrf放到头部信息

ed0ca22129324fbbbc56d6401ed19c83.jpg

$(function () {

$(\'#submit\').click(function (event) {

event.preventDefault(); // 阻止默认form提交表单行为

var email = $(\'input[name=email]\').val();

var password = $(\'input[name=password]\').val();

var csrf_token = $(\'meta[name=csrf_token]\').attr(\'content\');

//设置头部信息

$.ajaxSetup({

\'beforeSend\': function (xhr, settings) {

if(!/^(GET|HEAD|OPTIPNS|TRACE)$/i.test(settings.type) && !this.crossDomain){

xhr.setRequestHeader(\'X-CSRFToken\', csrf_token)

}

}

});

// ajax

$.post({

\'url\': \'/login/\',

\'data\': {

\'email\': email,

\'password\': password,

},

\'success\': function (data) {

console.log(data)

},

\'fail\': function (error) {

console.log(error)

}

});

});

});

访问

4c5f8da5e71049909a82046a9451c841.jpg

由于每个js请求都需要在头部信息里面添加此参数,所以可以将添加头部信息拿出来封装

封装一个统一的ajax,每次自动获取csrftoken并加到头部信息中

ec40a952a9cf44c580c699a1bd66e1d8.jpg

var http = {

\'get\':function (args) {

args[\'method\'] = \'get\';

this.ajax(args);

},

\'post\':function (args) {

args[\'method\'] = \'post\';

this.ajax(args);

},

\'ajax\':function (args) { // 将头部信息放到请求

this._ajaxSetup();

$.ajax(args);

},

\'_ajaxSetup\':function(){ // 将csrftoken放到头部信息

$.ajaxSetup({

\'beforeSend\': function (xhr, settings) {

if(!/^(GET|HEAD|OPTIPNS|TRACE)$/i.test(settings.type) && !this.crossDomain){

var csrf_token = $(\'meta[name=csrf_token]\').attr(\'content\'); // 获取csrf_token

xhr.setRequestHeader(\'X-CSRFToken\', csrf_token)

}

}

});

}

};

登录页的js,使用自定义的ajax机制

1960b0223a5f4d238ce4bc6adb13cc7a.jpg

$(function () {

$(\'#submit\').click(function (event) {

event.preventDefault(); // 阻止默认form提交表单行为

var email = $(\'input[name=email]\').val();

var password = $(\'input[name=password]\').val();

// 使用自定义的ajax

http.post({

\'url\': \'/login/\',

\'data\': {

\'email\': email,

\'password\': password,

},

\'success\': function (data) {

console.log(data)

},

\'fail\': function (error) {

console.log(error)

}

});

});

});

base模板中导入ajax的js

2e6e6d4ee33545a2bd5188f2b9c29026.jpg

Title

{% block head %}{% endblock %}

导航条

{% block body %}{% endblock %}

底部

请求

4c2a4dcf0d144e43877cbd9c1a7eb28c.jpg

41c6c47c25664013a009c584515605b9.jpg

066a07db4953480f87745a30fd1d9f5f.jpg

这样发送请求的时候使用自己封装的ajax就可以实现每次发送请求的时候自动在头部信息加上csrftoken信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值