Django之cfrs跨站请求伪造和xfs攻击
跨站请求伪造
一、简介
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攻击的更多相关文章
- Django之CSRF 跨站请求伪造
一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...
- Django添加防跨站请求伪造中间件
第一步: 在全局设置中打开此中间件: MIDDLEWARE_CLASSES = [ ... 'django.middleware.csrf.CsrfViewMiddleware', ... ] ...
- Django框架之跨站请求伪造
跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- django的csrf跨站请求伪造
1.什么是跨站请求伪造 请看图: 我们自行写了一个网站模仿中国银行,用户不知道是否是真的中国银行,并且提交了转账信息,生成一个form表单,向银行服务器发送转账请求,这个form表单和正规银行网站的f ...
- Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)
首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...
- 跨站请求伪造CSRF:攻击与防御
CSRF是什么 (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为&quo ...
- django中csrftoken跨站请求伪造的几种方式
1.介绍 我们之前从前端给后端发送数据的时候,一直都是把setting中中间件里的的csrftoken这条给注释掉,其实这个主要起了一个对保护作用,以免恶意性数据的攻击.但是这样直接注释掉并不是理智型 ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
随机推荐
- Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builti ...
- C++解析(18):C++标准库与字符串类
0.目录 1.C++标准库 2.字符串类 3.数组操作符的重载 4.小结 1.C++标准库 有趣的重载--操作符 << 的原生意义是按位左移,例:1 << 2;,其意义是将整数 ...
- Linux系统启动详解(二)
上节讲到了Linux启动大体流程,及grub的作用,本节主要扯扯initramfs的那些事,并且通过简单修改initramfs,将整体操作系统运行到了内存中. 3 initramfs 3. ...
- Linux(三)高级文本处理命令
一.cut (cut 命令可以从一个文本文件或者文本流中提取文本列 ) 1.cut语法 cut -d '分隔字符' -f fields 用于有特定分隔字符 cut -c 字符区间 ...
- bzoj3173: [Tjoi2013]最长上升子序列(fhqtreap)
这题用fhqtreap可以在线. fhqtreap上维护以i结尾的最长上升子序列,数字按从小到大加入, 因为前面的数与新加入的数无关, 后面的数比新加入的数小, 所以新加入的数对原序列其他数的值没有影 ...
- 实现了一下Berlekamp-Massey
//from https://www.cnblogs.com/TSHugh/p/9265155.html //在FP中求固定项数数列的线性递推式 //此递推式严格符合数学定义,故可能在末尾出现一些看起 ...
- PostgreSQL 传统 hash 分区方法和性能
背景 除了传统的基于trigger和rule的分区,PostgreSQL 10开始已经内置了分区功能(目前仅支持list和range),使用pg_pathman则支持hash分区. 从性能角度,目前最 ...
- python使用snappy压缩
今天在网上找了很久,终于找到1个snappy压缩命令行,记录下来: 1.wget https://bootstrap.pypa.io/get-pip.py 2.python ./get-pip.py ...
- 「Django」rest_framework学习系列-分页
分页a.分页,看第N页,每页显示N条数据方式一:使用PageNumberPagination创建分页对象,配合settings全局配置 views设置 from rest_framework.pagi ...
- 「Django」rest_framework学习系列-权限认证
权限认证:1.项目下utils文件写permissions.py文件 from rest_framework.permissions import BasePermission class SVIPP ...