Python djanjo之csrf防跨站攻击实验过程


Posted in Python onMay 14, 2021

一.CSRF简介

  1. CSRF是什么?
    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
  2. CSRF可以做什么?
    你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
  3. CSRF漏洞现状?
    CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI…而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
    引用自:https://blog.csdn.net/qq_21956483/article/details/78116094

二.CSRF(Web表单提交)

web表单下设置CSRF标签可以有效防止CSRF跨站攻击(如下图)

{% csrf_token %}

Python djanjo之csrf防跨站攻击实验过程

如果不设置该表单,那么在访问web页面时会禁止访问(如下图)

Python djanjo之csrf防跨站攻击实验过程

应对禁止访问,其实也有很多办法,其中一个办法就是将配置文件(settings.py)中的csrf的中间件儿拿掉,这样原来禁止访问的页面也可以成功访问,但这种做法风险是非常大的,出于安全考虑,不推荐这样做

Python djanjo之csrf防跨站攻击实验过程

另一种办法是在视图层加一个装饰器(@csrf_exempt),实现局部不检测,换句话说,就是即使不在web表单中添加csrf标签,只要加了装饰器,也能成功访问页面,需要注意的是仅限加了装饰器的内容,其他不加装饰器的代码还是禁止访问的状态

Python djanjo之csrf防跨站攻击实验过程

三.CSRF(Web表单提交)实验

接着我们就着上面说的内容用代码演示一遍:

首先,在app下的urls.py文件下配置一个子路由

from django.urls import path, re_path
from App import views

urlpatterns = [
    # csrf测试
    path('register/',views.register,name = 'register'),
]

接着,编写视图函数

def register(request):
    if request.method == "POST": # 如果该请求为POST请求
        username = request.POST.get('username') # 获取表单中的username
        password = request.POST.get('password') # 获取表单中的password
        print(username,password) # 打印username,password
    return render(request,'register.html') # 渲染模版,返回给web register.html中的内容

web表单(未设置csrf标签)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form ation="" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit">
</form>
</body>
</html>

此时开启服务(python manage.py runserver 8090)后,访问web页面,会显示禁止访问的字样

那么接下来我们在web表单中设置csrf标签

{% csrf_token %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form ation="" method="post">
    {# 防止跨站攻击 #}
    {% csrf_token %}
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit">
</form>
</body>
</html>

再来访问web页面,发现用户名,密码可以正常提交,且表单中会多一个csrf隐式伪随机数

CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

CSRF防御机制思路是在客户端页面增加伪随机数即可实现比较有效的跨站攻击防御

Python djanjo之csrf防跨站攻击实验过程

四.CSRF(ajax提交)

ajax提交,需要在html中添加以下内容

?1 引用jquery

?2 添加防止跨站攻击标签

?3 添加ajax提交用button

?4 添加ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    {# ?1 引用jquery #}
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<form ation="" method="post">
    {# ?2 防止跨站攻击 #}
    {% csrf_token %}
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
<!--    {# 表单提交 #}-->
<!--    <input type="submit">-->

<!--    {# ?3 ajax提交 #}-->
    <input type="button" value="注册" id="button">
</form>
</body>
</html>
<script>
	{# ?4 ajax #}
    $("#button").click(function(){
        username = $("[name='username']").val();
        password = $("[name='password']").val();
        csrf = $("[type='hidden']").val();
        console.log(username,password,csrf);
        {# $.post("/register/") #}
    });

</script>

此处关于ajax传参的方式只介绍了一种,如果还想了解的更深,请移步django之ajax传参的两种格式

访问web页面后,输入用户名,密码,查看审查元素,控制台会显示输入的用户名,密码,以及隐式伪随机数

Python djanjo之csrf防跨站攻击实验过程

在html中继续添加以下内容

?5 post提交

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    {# ?1 引用jquery #}
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<form ation="" method="post">
    {# ?2 防止跨站攻击 #}
    {% csrf_token %}
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
<!--    {# 表单提交 #}-->
<!--    <input type="submit">-->

<!--    {# ?3 ajax提交 #}-->
    <input type="button" value="注册" id="button">
</form>
</body>
</html>
<script>
	{# ?4 ajax #}
    $("#button").click(function(){
        username = $("[name='username']").val();
        password = $("[name='password']").val();
        csrf = $("[type='hidden']").val();
        console.log(username,password,csrf);

        {# ?5 post提交 #}
        {# $.post("地址",{参数},function(返回值){}) #}
        $.post("/user/register/",{'username':username,'password':password,'csrfmiddlewaretoken':csrf},function(data){
            console.log(data)
        })

    });

</script>

视图层添加以下代码

?返回ajax请求

# 局部禁止
# @csrf_exempt
def register(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username,password)

        # ?返回ajax请求
        return JsonResponse({'code':1})
        # {'code':1}为自定义值

    return render(request,'register.html')

最后访问web页面,ajax请求成功,且成功返回返回值{‘code':1}

Python djanjo之csrf防跨站攻击实验过程

总结

到此这篇关于Python djanjo之csrf防跨站攻击的文章就介绍到这了,更多相关djanjo csrf防跨站攻击内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的zipfile模块使用详解
Jun 25 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
python 日期操作类代码
May 05 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
django主动抛出403异常的方法详解
Jan 04 Python
python实现车牌识别的示例代码
Aug 05 Python
python 实现兔子生兔子示例
Nov 21 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 Python
Spring实战之使用util:命名空间简化配置操作示例
Dec 09 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
python控制台打印log输出重复的解决方法
聊一聊python常用的编程模块
May 14 #Python
如何获取numpy array前N个最大值
May 14 #Python
使用pandas模块实现数据的标准化操作
pandas 实现将NaN转换为None
May 14 #Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
Python爬虫:从m3u8文件里提取小视频的正确操作
You might like
PHP 实现explort() 功能的详解
2013/06/20 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
Python正则表达式的使用范例详解
2014/08/08 Python
Python中使用SAX解析xml实例
2014/11/21 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python实现求数列和的方法示例
2018/01/12 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
详解Python中namedtuple的使用
2020/04/27 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
主治医师岗位职责
2013/12/10 职场文书
上课看小说检讨书
2014/02/22 职场文书
松材线虫病防治方案
2014/06/15 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server