跨站请求伪造

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
csrf:post时,需要用户携带随机字符串

二、应用

1、普通表单

veiw中设置返回值:
  return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
或者
return render(request, 'xxx.html', data) html中设置Token:
  {% csrf_token %}

  

2、Ajax

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

示例:

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls), # 关于csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
url(r'^csrf1.html$',views.csrf1), ]

views.py

from django.shortcuts import render,HttpResponse
from django.views import View
from app01 import models
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# =============关于csrf的:
# csrf:跨站请求伪造(生成随机字符串),每次操作访问时则检查随机的字符串
# 1.将setting里面的csrf的注释去掉
@csrf_protect#这个指的是局部使用,全站禁用,(仅仅在下面的这个被装饰的函数使用csrf)需要注释setting里的csrf
@csrf_exempt#这个指的是局部禁用,全站使用,(仅仅在下面的这个被装饰的函数禁用csrf)不能注释setting里的csrf
def csrf1(request):
if request.method=="GET":
return render(request,"csrf1.html")
else:
return HttpResponse("good")

csrf1.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/csrf1.html">
{% csrf_token %}
{# {{ csrf_token }}#}
<input id="user" type="text" name="username">
<input type="submit" value="提交">
<a onclick="submitForm();">Ajax提交</a>
</form> <script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script> <script>
function submitForm() {
var token=$.cookie("csrftoken");
{# var token=$.cookie("csrftoken");这个根据cookie的key来取的随机生成的cookie的value值#}
var user=$("#user").val();
$.ajax({
url:"/csrf.html",
type:"POST",
headers:{"X-CSEFToken":token},
data:{"user":user},
success:function (arg) {
console.log(arg);
}
}) }
</script> </body>
</html>

三、csrf基于FBV和CBV的应用

示例:

from django.shortcuts import render,HttpResponse
from django.views import View
from app01 import models
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# =======csrf里面的CBV(基于类的方式)应用装饰器
from django.views import View
from django.utils.decorators import method_decorator
# 1、先自定义一个闭包函数做装饰器
def wrapper(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
# 关于cbv的应用装饰器,方法一:在指定的方法上添加装饰器
class Foo(View):
@method_decorator(wrapper)#仅仅在下面的函数内有效
def get(self,request):
# return HttpResponse("login_get")
return render(request,"login.html") def post(self,request):
print(request.POST.get("username"))
return HttpResponse("login_post") # 方法二:在类上面添加
# @method_decorator(wrapper,name="get")#仅仅给类里面的get函数使用
@method_decorator(wrapper,name="dispatch")#给下面所有的函数使用
class Foo(View):
def dispatch(self, request, *args, **kwargs):
pass
def get(self,request):
# return HttpResponse("login_get")
return render(request,"login.html") def post(self,request):
print(request.POST.get("username"))
return HttpResponse("login_post")

  

xss攻击

- 慎用 safe和mark_safe
- 非要用,一定要过滤关键字

示例:

xss攻击
跨站脚本攻击:
防止:
-其他人输入的内容 不用safe
-自己输入的内容 可用safe <scripts>
for(var i=0;i<9999;i++){
alert(i)
}
</scripts> <scripts>
获取本地cookie,发送到别外一个网站
</scripts>

Django之cfrs跨站请求伪造和xfs攻击的更多相关文章

  1. Django之CSRF 跨站请求伪造

    一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...

  2. Django添加防跨站请求伪造中间件

    第一步: 在全局设置中打开此中间件: MIDDLEWARE_CLASSES = [ ... 'django.middleware.csrf.CsrfViewMiddleware', ... ]     ...

  3. Django框架之跨站请求伪造

    跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...

  4. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  5. django的csrf跨站请求伪造

    1.什么是跨站请求伪造 请看图: 我们自行写了一个网站模仿中国银行,用户不知道是否是真的中国银行,并且提交了转账信息,生成一个form表单,向银行服务器发送转账请求,这个form表单和正规银行网站的f ...

  6. Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)

    首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...

  7. 跨站请求伪造CSRF:攻击与防御

    CSRF是什么         (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为&quo ...

  8. django中csrftoken跨站请求伪造的几种方式

    1.介绍 我们之前从前端给后端发送数据的时候,一直都是把setting中中间件里的的csrftoken这条给注释掉,其实这个主要起了一个对保护作用,以免恶意性数据的攻击.但是这样直接注释掉并不是理智型 ...

  9. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

随机推荐

  1. 详解免费高效实用的.NET操作Excel组件NPOI(转)

    有时间研究一下NPOI http://www.cnblogs.com/pengze0902/p/6150070.html

  2. 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理

    题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...

  3. 【bzoj4244】邮戳拉力赛 背包dp

    题目描述 IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶,下行电车沿编 ...

  4. 个人博客开发-01-nodeJs项目搭建

    // window系统下 1.nodeJs 安装 nodeJs 安装 看  这里 , 先下载再下一步下一步就OK了,我的是在C盘里安装的. 安装完以后 按 win + R ,在弹出的小框框里输入 CM ...

  5. 【明哥报错簿】tomcat 安装时出现 Failed to install Tomcat7 service

    安装tomcat时提示 Failed to install Tomcat7 service 应该是卸载时直接删除目录导致的. Failed to install Tomcat7 service Che ...

  6. JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  7. 【JavaScript】面向对象的程序设计

    一.前言        接着上一篇的内容,继续JavaScript的学习. 二.内容 属性类型 //数据属性[Configurable] —— 能否通过delete删除属性从而重新定义属性,能否修改属 ...

  8. 【PDF】HTML中嵌入pdf的简单方法

    <embed src="> 或者你不想显示某些功能的话: <embed src=">

  9. 在华为eNSP中配置简单的DHCP

    拓扑图,如图1 图1 在AR1中的配置过程如图2 图2 通过PC1查看是否分配了地址,如图3 图3

  10. 《Linux内核设计与实现》第1、2章读书笔记

    第一章 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确的目的: 在Unix中,大部分东西都被(或者正致力于)被当做文件对待: Unix内核即相关系统工具软件都是用C语言编写的,这使得系 ...