Python菜鸟之路:Django CSRF跨站请求伪造
前言
CSRF,Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。他的产生由来是因为浏览器引起的。 比如用户访问A网站,A网站的html代码中有个提交数据,是发往B网站的,B网站受到浏览器发来的请求,实际上已经处理完毕,并且将返回数据发回了。但是这段数据在到达用户浏览器的时候,被浏览器拦截抛弃,这种现象是CSRF的由来。
也有部分人利用CSRF进行相关攻击,攻击原理如下:

Django中的CSRF
在Django中,有个中间件叫做django.middleware.csrf.CsrfViewMiddleware,如果加载后,在什么都不配置的情况下,跨站请求就会被阻挡,报错CSRF的错误。

解决上述问题,有两种方法,一种是在html中书写: {% csrf_token %}。另外一种是为每次ajax请求设置cookie
方法一:HTML中书写
<form action="/csrf/" method="post">
{% csrf_token %}
<input type="text" name="v">
<input type="submit" value="提交">
</form>
上述的{% csrf_token %}在页面中,会转换成input标签,标签中的内容类似如下:
<input type="hidden" name="csrfmiddlewaretoken" value="FS187YU8N8ixAOskUHTAEtkq0xJ3dirS2yJrCnN5IpAY9B9qpVHAQOhxoC4iV614">
这样的话,这次访问过去的请求的header中,就会带有csrftoken=QRzJCWrjRzJxHnG3phk1Nx60f96jfie7bILMEOi9gNEXTs6Mf9N6JyWzqJUMRogn的cookie,这样就不会受到浏览器的阻碍。

但是这么做是有弊端的。因为这段value字符串,在机器A可以用,如果在机器B上用,Django也会认为是合法的。
在书写的时候,路由函数也要注意使用render!!!
def csrf(request):
return render(request,'csrf.html')
方法二:为每次ajax请求设置cookie
通常我们的请求都是以ajax方式来提交的。因此这种方法更加需要明白。不多废话,直接贴代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/csrf/" method="post">
{% csrf_token %}
<input type="text" name="v" />
<input type="submit" value="提交" />
</form> <input type="button" value="Ajax提交" onclick="DoAjax();" />
<script src="/static/jquery-2.1.4.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
// 去cookie中获取值
var csrftoken = $.cookie('csrftoken'); function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({ //当所有的ajax请求发送之前,进行这样的配置
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function DoAjax(){
$.ajax({
url: '/csrf/',
type: 'POST',
data: {'k1': 'v1'},
success: function (data) {
console.log(data);
}
})
}
</script> </body>
</html>
上述的本质,就是去浏览器的cookie中获取csrftoken,在发送ajax请求的header的cookie中,加入csrftoken。

CSRF的单独使用
通常情况下,在settings的文件中,载入csrf的配置后,CSRF会对全局的url产生效果。那么,如果在settings中没有加载CSRF,CSRF还能使用么?答案是肯定的。
from django.views.decorators.csrf import csrf_exempt,csrf_protect
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
Python菜鸟之路:Django CSRF跨站请求伪造的更多相关文章
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- python CSRF跨站请求伪造
python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- [Django高级之中间件、csrf跨站请求伪造]
[Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- Django中的CSRF(跨站请求伪造)
Django中的CSRF(跨站请求伪造) Django CSRF 什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
随机推荐
- JAVASCRIPT 格式化日期
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...
- tomcat 输入localhost:8080显示404 (找不到tomcat主页)
最近使用tomcat时常出现一个问题,tomcat开启后浏览器输入localhost:8080时显示404,但是输入项目的路径是可以看到效果的,因为没啥大碍,所以没有在意 [ 在这里顺便介绍几种访问 ...
- WebUI中 DataGrid多层表头 的终极解决办法
因为DataGrid控件的简单易懂,大多数做.NET程序员都喜欢用,有需要把数据显示成表格样式的地方DataGrid会是首选,但是所有的东西都会有好和不好的一面,DataGrid在给我们带来了数据显示 ...
- Matlab、R向量与矩阵操作
Matlab.R向量与矩阵操作 描 述 Matlab R 1 建立行向量v=[1 2 3 4] v=[1 2 3 4] v<-c(1,2,3,4)或v<-scan(),然后输入 ...
- ImageLoader使用
最近琢磨的网上的这些开源框架,imageLoader确实很好用,基本用法不记录了,参考网上的一些代码写了个ImageLoaderManager /** * Created by Lee on 2016 ...
- leetCode 87.Scramble String (拼凑字符串) 解题思路和方法
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- C语言基础(15)-多文件编译
一.头文件的使用 如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中声明函数原型.如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了 ...
- SecureCRT中的vim出现1H特殊字符
问题原因:由于采用了UTF_8编码方式导致的. 解决方法:把字符编码改为:GB18030即可.如图:
- input子系统分析(转)
转自:http://www.linuxidc.com/Linux/2011-09/43187.htm 作者:作者:YAOZHENGUO2006 Input子系统处理输入事务,任何输入设备的驱动程序都可 ...
- Java基础11 对象引用(转载)
对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test{ public static void main(String[] args){ ...