目录
扩展方式二 : 继承 AbstractUser 类来扩写 (步骤)
CSRF简介
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding, 缩写为:CSRF/XSRF
用途
CSRF可以用来做钓鱼网站: 假设是一个和银行一模一样的网址页面,用户在该页面上转账账户的钱就会减少,三十受益人却不是自己指定想要转账的那个人.
你可以这么理解CSRF共计:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你的名义发送邮件,发信息,盗取你的账号,甚至于购买商品,虚拟货币转账...造成的问题包括:个人隐私泄露以及财产安全
模拟
一台计算机上的两个服务端口启动,钓鱼网站提交地址改为正规网站的地址
-
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
-
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
-
3.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
-
4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
-
5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
预防
- csrf策略:通过在返回的页面上添加独一无二的标识信息从而区分正规网站和钓鱼网站的请求
- CSRF防护的一个重点就是要对用户凭证进行处理,通过这种机制可以对用户的请求合法是否合法进行判断,判断是不是跨站攻击的行为。因为用户凭证是Cookie中存储的,所以防护机制的处理对象也是Cookie的数据,我们要在防护的数据中加入签名校验,并对数据进行生命周期时间的管理,就是数据过期管理。
csrf校验策略
1.Token的构成
消息[msg]:而msg本身也有两部分组成:一部分:随即字符串,过期时间戳。
分隔符[separator]:用于分割msg部分与加密后生成的signature签名部分,这里用的是"."
签名[signature]:singnature.signature签名,是对“msg消息”用特定算法进行加密后的字符串
token = base64(msg)格式化..base64(sha256("密码",msg))
Token由被base64的msg编码穿+256加密msg再进行Base64编码,两个字符串的内容结合
2.form表单操作csrf
<h1>这是一个真实的网站</h1>
<form action="" method="post">
{% csrf_token %}
</form>
3.Ajax操作csrf
方法一:先编写csrf模板语法,然后利用标签查找和值获取,手动添加
data:{'username':'','csrmiddlewaretoken':$('[name="csrmiddlewaretoken"]').val()},
方法二:直接利用模板语法即可
data:{'username':'','csrfmiddlewaretoken':'{
{ csrf_token }}'},
方法三:通用方法(js脚本)CV大法即可
更多详情请见: https://docs.djangoproject.com/en/1.11/ref/csrf/
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|O