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之复习if语句
Oct 02 Python
详解python开发环境搭建
Dec 16 Python
Python使用wxPython实现计算器
Jan 30 Python
理论讲解python多进程并发编程
Feb 09 Python
python调用外部程序的实操步骤
Mar 04 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
详解MindSpore自定义模型损失函数
Jun 30 Python
Python if else条件语句形式详解
Mar 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
discuz7 phpMysql操作类
2009/06/21 PHP
PHP文件上传类实例详解
2016/04/08 PHP
js身份证验证超强脚本
2008/10/26 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
Python堆排序原理与实现方法详解
2018/05/11 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python中count函数简单的实例讲解
2020/02/06 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
网络安全方面的面试题
2016/01/07 面试题
工程学毕业生自荐信
2014/06/14 职场文书
社会学专业求职信
2014/07/17 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
校园开放日新闻稿
2015/07/17 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS