我的前端时jquery,后端是django。我用django自带的auth验证系统授权访问页面。在使用中发现了一个漏洞:
我有2个页面,“ip/a/ “和 “”ip/b/“”,都在views的index函数中定义(判断a或者b的值后流转)。
我打开a页面后,再打开b页面,然后因为没操作用户被自动注销。这时我点击浏览器(谷歌)的后退按键,回到了a页面,
a页面有很多ajax应用,点击页面发送请求的按钮,这些ajax居然都是正常的!!
我的ajax都是以路由的方式映射到后台的view的对应函数,如下:
path('ajax_rio/', views.ajax_rio,name='ajax_rio'),
path('ajax_stock_mv/', views.ajax_stock_mv,name='ajax_stock_mv'),
path('ajax_stock_R_D_bend/', views.ajax_stock_R_D_bend,name='ajax_stock_R_D_bend'),
path('ajax_stock_risk/', views.ajax_stock_risk,name='ajax_stock_risk'),
请问:我应当在每个ajax函数前加上@login_required装饰器来限制吗?还有没有更好的办法?
其实,并不需要,每个view都加,你可以配置全局的登录验证,这个功能可以通过Middleware中间件来实现。具体怎么写这个中间件,你直接搜索Django全局登陆验证login_required等类似的关键字找,有很多教程。或者我给你找一个:
https://blog.csdn.net/myy1066883508/article/details/106477893
可以在每个需要授权的ajax请求的视图函数中添加@login_required装饰器来限制未登录用户的访问。这将确保只有已登录的用户才能访问这些ajax请求。
另外,您可以通过在ajax请求中发送CSRF令牌来提高安全性。在django中,默认启用了CSRF保护,这将为每个用户生成一个唯一的令牌。您可以在ajax请求中将此令牌作为POST数据或HTTP头发送,并在服务器端进行验证。这可以防止跨站点请求伪造攻击(CSRF)。
在前端代码中,您可以使用以下方法将CSRF令牌添加到ajax请求中:
$(function() {
// 获取CSRF令牌
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
// 将令牌添加到ajax请求中
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
});
});
此外,您还可以使用django-rest-framework(DRF)为您的ajax请求提供身份验证和授权。 DRF是一个强大的框架,提供了许多工具和功能来简化RESTful API的开发。您可以使用DRF为您的ajax请求提供基于令牌的身份验证和授权,这将确保只有已登录的用户才能访问您的API端点。
在需要验证访问的 Django 中,如果使用了基于会话(Session)的用户认证,用户注销后原有的会话信息就会失效。这时候,即使用户尝试访问需要验证的页面,也会被重定向到登录页面。
在使用 Ajax 的情况下,我们可以在前端代码中通过 XMLHttpRequest 对象的 status 属性来获取后端返回的 HTTP 状态码,如果状态码为 401,就意味着用户未经授权访问了需要验证的资源。这时候,我们可以在前端代码中根据状态码的值,将页面重定向到登录页面或者显示其他相应的错误提示信息。
以下是一个简单的示例代码:
// 向服务器发送 Ajax 请求
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/some_resource/', true);
xhr.send();
// 监听 Ajax 请求的完成事件
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
// 请求成功,处理服务器返回的数据
console.log(xhr.responseText);
} else if (xhr.status === 401) {
// 用户未经授权访问需要验证的资源,重定向到登录页面
window.location.href = '/login/';
} else {
// 其他错误状态码,显示相应的错误提示信息
console.error(xhr.statusText);
}
}
};
在这个示例代码中,我们向服务器发送了一个 GET 请求,如果服务器返回的状态码为 401,就将页面重定向到登录页面。如果状态码为其他的错误码,就将相应的错误信息输出到控制台。