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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
快速入手Python字符编码
Aug 03 Python
Python类的动态修改的实例方法
Mar 24 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
python3 深浅copy对比详解
Aug 12 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
python的html标准库
Apr 29 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
js 操作select相关方法函数
2009/12/06 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
python的id()函数介绍
2013/02/10 Python
python中的列表推导浅析
2014/04/26 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
详解python进行mp3格式判断
2016/12/23 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
经济贸易系毕业生求职信
2014/05/31 职场文书
大学生自荐书范文
2015/03/05 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
防卫过当辩护词
2015/05/21 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
MySQL创建管理LIST分区
2022/04/13 MySQL