跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
1|0一、跨站请求伪造(csrf)
2|01. 什么是csrf
- csrf是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任
- 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
2|12. 钓鱼网站原理
-
钓鱼网站利用的就是csrf
-
通过开发一个和正规网站一模一样的页面,当用户不经意点击进去后,用户以为这就是正规的网站(因为长得都一样)。此时用户可能会在这个虚假的网页上做一些操作,最后往后端提交数据时,虚假网站其实对用户提交的数据做一定的篡改,再往正规网站后端提交。
-
如何实现(以银行转账为例)
- 钓鱼网站的页面写form表单的时候,让用户填写的对方账户input并没有name属性
- 而是在内部偷偷隐藏了一个具有name属性的input,并且value值是钓鱼网站的账户
2|23. 如何解决csrf
(1)思路:
- 让正规网站只处理由本正规网站发送来的post请求,不处理其他网站发送来的post请求。
- 但是此思路有个问题:如何识别、判断当前请求是由本网站发出的
(2)实现方法
- 当用户发送get请求想要获取到正规网站的页面时,正规网站返回给用户html页面时,会自动在该页面的源码中隐藏一个input框
- 这个框的value是一个随机字符串,并且网站自己也保留同样的一个这个字符串
- 当用户发送post请求时,后端会自动校验
request.POST
中的随机字符串是否和网站之前保存的随机字符串相同 - 相同则处理该post请求,不同则返回403错误页面。
(3)实现的具体代码
-
基于该项目是django项目
-
分为2种情况的post请求
- form表单发送post请求
- ajax发送post请求
1. 针对form表单发送的post请求
- 在写form表单的时候,你只需要在表单中写一个
{% csrf_token %}
即可
2. 针对ajax发送post请求
- 有3中书写方式。推荐使用第三种,最为通用
- 第一种(较繁琐)
- 第二种(较简单)
- 第三种(最通用)
2|33. csrf相关的装饰器
- 在django的项目中,django有一个中间件,专门用来处理csrf。
- 这里django中提供的装饰器分为两种:
- 对post请求进行csrf处理:
csrf_protect
- 忽略对post请求的csrf处理:
csrf_exempt
- 对post请求进行csrf处理:
(1)csrf_protect装饰器
- 分为对FBV和CBV的装饰
1. 对FBV的装饰
- 直接装饰在视图函数上即可
2. 对CBV的装饰
- 给CBV加装饰器的三种方式都可以
(2)csrf_exempt装饰器
- 分为对FBV和CBV的装饰
1. 对FBV的装饰
- 直接装饰在视图函数上即可
2. 对CBV的装饰
- 注意:给CBV加装饰器的三种方式中,只有给
dispatch
方法装才有效
3|0二、django的settings源码剖析
- django有两个配置文件
- 一个是直接暴露给用户,支持用户修改配置
- 一个是内部全局的(隐藏的)
- 当django项目启动时,先加载全局的配置,再加载局部的配置(即暴露给用户的配置)。如果两者有重复的,则局部覆盖全局的配置。
3|11. 模仿django的settings源码设计自定义settings
4|0三、django的auth模块
- 在使用
auth
模块的时候,要用就用全套(即不要一会用普通的方法来操作表,一会又用auth模块的方法来操作。类似面向对象中,子类重用父类的方法时,super().__init__(要重用的属性)
和父类.__init__(self,要重用的属性)
这两个也不能混用)
4|11. 使用终端如何创建超级用户:
4|22. auth模块常用方法
(1)创建用户
(2)校验用户名和密码是否正确
(3)保存用户登录状态
- 执行下面的代码后,会自动设置session并保存在django_session表中。还会把当前的用户对象保存在
request.user
中。
(4)判断当前用户是否登录
(5)校验密码
(6)修改密码
(7)注销
(8)登录装饰器
- 装饰器的配置有两种:局部配置和全局配置。(配置的作用是如果没有登录的用户访问需要登录的功能时,会将用户的浏览器页面跳转到指定的页面。配置里面书写的就是要跳转的url)
- 局部配置:只对装饰器装饰的函数有效
- 全局配置:对所有被装饰函数都有效
- 注意:如果全局配置了,局部也配置了 ,则以局部的为准
4|33. 扩展auth_user表字段
-
有两种方式
-
利用一对一外键字段,再创建一张表保存新的字段
-
利用继承关系,重写
auth_user
表
-
(1)方式一
(2)方式二
-
注意:如果要扩展auth_user表,必须在项目第一次执行数据库迁移命令时,将下面的模型类写好。(即如果已经执行完数据库迁移命令生成auth_user表后,再想扩展表字段,方式二是无法实现的)
-
注意:下面创建模型类后,还需要去settings文件中配置(
AUTH_USER_MODEL = 'app01.Userinfo' # 应用名.表名
,这么写完之后,你新建的Userinfo
表会代替原来的auth_user
表,之前所有的auth
模块功能全都以你写的表为准)
__EOF__

本文作者:BigSun丶
本文链接:https://www.cnblogs.com/Mcoming/p/11992149.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Mcoming/p/11992149.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!