CSRF

跨站请求伪造

	CSRF全称为Cross-site request forgery,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

  CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

CsrfViewMiddleware的作用:
在render返回页面的时候,在页面中塞了一个隐藏的input标签;当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求 跨站请求伪造csrf :
1.网站的搭建 :
写一个跟正规网站一模一样的页面;用户输入用户名 密码 对 方账户 转账金额提交,请求确实是朝银行的接口发送的 钱也扣了
但是对方账户变了 变成了钓鱼网站自己提前设置好的账户 2,钓鱼网站功能的实现 :
填写form表单的时候 让用户填写的对方账户input并没有name属性,是你自己在内部偷偷隐藏了一个具有name属性的input框,并且value值是你自己的账户 然后将该标签隐藏了

解决跨站伪造问题:

解决跨站问题 :
1.让服务端只处理本网站发送的post请求
2.识别判断当前请求是否是本网张发出的 网站在返回给用户一个form表单的时候 会自动在该表单隐藏一个input框;框的value是一个随机字符串 但是网站能够记住每一个浏览器发送的随机字符串 from 表单发送 POST请求: <form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>target_account:<input type="text" name="target_user"></p>
<p>money:<input type="text" name="money"></p>
<input type="submit">
</form> ajax 发送 POST请求: 先在页面任意的位置上书写
{ % csrf_token %} 1.方式1
通过标签查找获取随机字符串添加到data自定义对象即可
data: {'username': 'jason', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}, 2.方式2
data: {'username': 'jason', 'csrfmiddlewaretoken': '{{ csrf_token }}'}, 3.方式3
直接兴建js文件拷贝代码,导入即可
csrf.js文件

csrf 相关的装饰器:

#1. FBV模型:
from django.views.decorators.csrf import csrf_exempt,csrf_protect # @csrf_exempt # 不校验 csrf(中间件)
def index(request):
return HttpResponse('index') # @csrf_protect # 校验
def login(request):
return HttpResponse('login') # 2. CBV模型: from django.utils.decorators import method_decorator 1.# @method_decorator(csrf_exempt,name='xxx') # csrf_exempt 不支持装饰 2.@method_decorator(csrf_exempt,name='dispatch') # csrf_exempt 支持装饰 dispatch
class HomeView(View): # @method_decorator(csrf_exempt) # 支持装饰
def dispatch(self, request, *args, **kwargs):
return super(HomeView, self).dispatch(request, *args, **kwargs) # @method_decorator(csrf_exempt,name='post') # csrf_exempt不支持该方法
def post(self,request):
return HttpResponse('OK') 总结 : csrf_exempt这个装饰器只能给dispatch装才能生效
csrf_protect方式全都可以跟普通的装饰器装饰CBV一致

csrf.js文件:

# ajax  csrf.js文件
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|OPTIONS|TRACE)$/.test(method));
} $.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

最新文章

  1. 【Win 10 应用开发】Web授权示例:获取新浪微博的授权码
  2. 如何生成git的公钥和私钥
  3. PPTP-VPN第一章——部署与简单使用
  4. Problem C 链表
  5. 数据结构(RMQ):POJ 3624 Balanced Lineup
  6. hdu1505(dp求最大子矩阵)
  7. 老李分享:robotium常用API 1
  8. 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)
  9. MySQL 的调节和优化的提示
  10. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
  11. Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制
  12. Android视频录制从不入门到入门系列教程(一)————简介
  13. thinkphp5: 循环输出表格,并固定表格单元宽度(过长省略号)
  14. request之LIstener监听器
  15. #000 Python 入门第一题通过扩展,学到了更多的知识
  16. 2017-2018 Exp5 MSF基础应用 20155214
  17. iOS仿安卓手势解锁
  18. pat advanced 1139. First Contact (30)
  19. 神盾局特工第四季/全集Agents Of SHIELD迅雷下载
  20. NOIP计划与展望

热门文章

  1. Java基础语法面试题
  2. Java代码质量检查checkstyle, pmd, cpd, p3c,findbugs, jacoco, sonarquebe以及和Jenkins集成
  3. 谈谈 Callable 任务是怎么运行的?它的执行结果又是怎么获取的?
  4. 解决SpringBoot无法读取js/css静态资源的新方法
  5. 另一种缓存,Spring Boot 整合 Ehcache
  6. digital clock based C
  7. vb.net 多线程爬虫抓取免费代理IP
  8. C# vb .NET读取多个识别条形码线性条码
  9. C# vb .NET读取识别条形码线性条码UPC-A
  10. Huawei LiteOS简介