day56 csrf 认证,ajax通过django的csrf_token认证机制的写法
讲述CSRF(cross-site request forgery), 中文名称: 跨站请求伪造, 也被称为: one click attack/session riding, 缩写为: CSRF/XSRF. 攻击者通过Http请求数据传送到服务器, 从而盗取回话的cookie, 盗取回话cookie之后, 攻击者不仅可以获取到用户的信息, 还可以修改该cookie关联的账户信息


token 字符串的前32位是salt, 后面是加密后的token, 通过salt能解密出唯一的secret.
django会验证表单中的token和cookie中token是否能解出同样的secret, secret一样则本次请求合法.
1, 在响应的页面中加入{% csrf_tiken %} 标签, 那么在进行模板渲染是自动会生成如下标签
<input type="hidden" name="csrfmiddlewaretoken" value="ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj">
2, 并且在响应还有这个 {% csrf_token %} 标签的页面时, 会添加cookie键值对, 如下
csrftoken:lsMQeJgVbIKKxlfz6umgYM8WOWx1Njr77cHzM0L4xtXoApsnhFXXk1OGzwb1dd0G
3,当用户从该页面提交数据时, 会携带
csrfmiddlewaretoken:ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj和cookie键值对
4, 取出cookie中的csrftoken值和请求数据部分的csrfmiddlewaretoken的值,两者进行比较, 这个随机字符串叫做token字符串, django如果在请求数据部分找不到token值, 会去请求数据中的请求部分,
找一个叫做X-CSRFTOKEN 的键值对, 如果这个键对应的值和cookie中csrftoken对应的值相同, 也能通过认证
过程:
token字符串的前32位是salt, 后面是加密后的token, 通过salt能解密出唯一的secret字符串.
secret: 是settings配置文件中secret_key:
SECRET_KEY = 's!xbzez1zxrevmq7k_89%%-z&#)e7686pyq8pg@_bp_k_2s^ho'
django会验证表单中的token和cookie中的token是否能解出同样的secret, secret一样则本次请求合法.
如果不同就403 forbidden
ajax通过django的csrf_token认证机制的写法
方式一:
<script>
html中:
{% csrf_token %}
$('#btn').click(function () {
var name = $("#username").val();
var password = $("#password").val();
var token = $("[name='csrfmiddlewaretoken']").val();
$.ajax({
type: 'post', // 请求方法
url: '/login/', // ajax提交到哪个路径(ajax提交: 页面无刷新提交)
// ajax提交的数据, 一定要用data的字典的形式提交
data: {xname: uname, pwd: password, csrfmiddlewaretoken: token},
success: function (res) {// 上面规定好吧要提交大数据都放入data中,并且要接受到的状态码是通过的,就 会走success并且把参数放到res处进行提交
console.log('success', res); // 这里只是测试打印出什么东西, 实际不用写
},
error: function* (error) { // 如果接收到的状态吗不对, 就会走快该函数, 并把data数据传到error
console.log('error', error);
$('#ajax_error').text(error.responseText); // 可以告诉是什么错误
}
})
})
</script>
方式二
<script>
$.ajax({
type: 'post', // 请求方法
url: '/login/',
// {{ csrf_token }}拿到是{% csrf_token %}生成的input标签的那个value属性的token值
data: {xname:uanme, pwd: password, csrfmiddlewaretoken: '{{ csrf_token }}'},
success: function(res){
console.log('success',res);
},
error:function(error){
console.log9('error',error);
$('#ajax_error').text(error.responseText);
}
})
</script>
方式三(添加请求头键值对, 键必须叫做: 'X-CSRFTOKEN', 值是cookie中的token值)
<script>
// 添加请求头键值对, 键必须叫做: 'X-CSRFTOKEN', 值是cookie中的token值
$.ajax({
type: 'post',//请求方法
url: '//login',
data: {xname:uanme,pwd: password},
headers:{// 设置请求头键值对
'X-CSRFTOKEN':$.cookie('csrftoken'),
},
success: function(res){
console.log('sucess',res);
},
error: function(error){
console.log('error', error);
$('#ajax_error').text(error.responseText);
}
})
</script>

浙公网安备 33010602011771号