伪造ajax请求,ajax向Django前后端提交请求和CSRF跨站请求伪造

1.ajax登录示例

urls.py

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews

urlpatterns=[

url(r'^admin/', admin.site.urls),

url(r'^login_ajax/$', views.login_ajax, name='login_ajax'),

url(r'^index/$', views.index, name='index'),

]

views.py

from django.shortcuts importrender, HttpResponse, redirectimportjsondefindex(request):return HttpResponse('this is index')deflogin_ajax(request):if request.method == "POST":

user= request.POST.get("user")

pwd= request.POST.get("pwd")

ret= {"status": 0, 'url': ''}if user == "alex" and pwd == "123":

ret['status'] = 1ret['url'] = '/index/'

returnHttpResponse(json.dumps(ret))return render(request, "login_ajax.html")

login.html登录页面

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

登录
{% csrf_token %}

用户名

密码

记住我

$('#login').click(function () {

$.ajax({

url:'/login_ajax/',

type:'post',

data: {

csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),

user: $('[name="user"]').val(),

pwd: $('[name="pwd"]').val()

},

success: function (data) {

data=JSON.parse(data);if(data.status) {

window.location=data.url

}else{

alert('登陆失败')

}

}

})

})

View Code

静态文件需要配置,使用了jQuery和Bootstrap。

2.CSRF跨站请求伪造

一共四种方式

1,将 csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val() 放在POST的请求体中。

示例中就是使用的这种方式。

2,给ajax的请增加X-CSRFToken的请求头,对应的值只能是cookie中的csrftoken的值。

所以我们要从cookie中提取csrftoken的值,jQuery不能去cookie,我们使用jquery.cookie的插件。点击下载jquer.cookie插件。

HTML中导入jquery.cookie.js。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

$('#login').click(function () {

$.ajax({

url:'/login_ajax/',

type:'post',

headers:{"X-CSRFToken":$.cookie('csrftoken') },

data: {

user: $('[name="user"]').val(),

pwd: $('[name="pwd"]').val()

},

success: function (data) {

data=JSON.parse(data);if(data.status) {

window.location=data.url

}else{

alert('登陆失败')

}

}

})

})

View Code

3,使用$.ajaxSetup()给全局的ajax添加默认参数。

可以按照方式一设置data,也可以按照方式二设置请求头。

$.ajaxSetup({

data: {

csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),

}

});

或者

$.ajaxSetup({

headers: {"X-CSRFToken": $.cookie('csrftoken')},

});

4,官方推荐方法(用到jquery.cookie插件):

function csrfSafeMethod(method) {// these HTTP methods do notrequire CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

}

$.ajaxSetup({

beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) &&!this.crossDomain) {

xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));

}

}

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值