首页 > 其他分享 >Django框架之csrf跨站请求

Django框架之csrf跨站请求

时间:2024-03-25 18:12:25浏览次数:22  
标签:跨站 请求 网站 校验 Django CSRF csrf

【一】跨站请求伪造介绍

【1】引入

  • CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
  • 攻击者通过诱导受害者访问恶意网站或点击恶意链接
    • 将恶意请求发送到目标网站上
    • 利用受害者在目标网站中已登录的身份来执行某些操作
    • 从而达到攻击的目的。

【2】举例

  • 假设受害者在一家网银网站上登录账户,然后继续浏览其他网页。
  • 同时,攻击者通过电子邮件等方式向受害者发送了一封包含恶意链接的邮件。
  • 当受害者点击该链接时,潜在的威胁就会变得非常现实。
  • 该链接指向一个由攻击者操纵的网站,该网站上的恶意代码会自动向网银网站发送一个请求,请求转账到攻击者的账户。
  • 由于受害者在网银网站中已经登录,所以该请求会被认为是合法的,这样攻击者就可以成功地进行转账操作。

【3】保护措施

# 要保护自己免受CSRF攻击,网站开发者可以采取以下措施:

# 1.使用CSRF令牌
在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
每次提交请求时都会验证该令牌,以确保请求是合法的。

# 2.启用SameSite属性:
将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
这可以在一定程度上缓解CSRF攻击。

# 3.严格验证请求来源
服务器端可以验证请求的来源是否为预期的网站域名
例如检查HTTP Referer头部。

# 4.使用验证码
在敏感操作(如转账、更改密码等)上使用验证码
增加用户身份验证的防护

【二】钓鱼网站案例

  • 在早期的网站很容易出现钓鱼诈骗网站的现象,就是钓鱼页面和真的页面做的一模一样,用户在进行金额转账的时候,就会把钱打到陌生人的账户里
  • 如果没有csrf校验,就很容易出现这个现象
  • 下面对这个现象做一个演示

【1】钓鱼网站

【三】CSRF校验

【1】介绍

  • csrf校验是一种用于防止跨站请求伪造(Cross-Site Request Forgery)攻击的安全措施。

【2】csrf校验策略

  • csrf中间件会在用户返回一个具有提交数据功能的页面的时候给这个页面加一个唯一标识
  • 当这个页面朝后端发送post请求的时候,我的后端会先校验唯一标识,如果唯一标识不对会直接拒绝访问,如果成功则正常运行

【四】POST请求校验CSRF

【1】form表单校验csrf

## 在form表单内加上 {% csrf_token %}

<form action="" method="post">
   {% csrf_token %}
    <p>转账对象: <input type="text" name="username"></p>
    <p>转账金额: <input type="text" name="money"></p>
    <p><input type="submit" value="转账"></p>
</form>

# 在浏览器访问的时候会发现这个csrf变成了一个很长很长的字符串,也就是唯一字符串

【2】Ajax携带CSRF

## 来利用标签查找获取页面上的随机字符串
## 书写的代码较长,不推荐
<script>
    $('#btn').on('click', function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'name': 'hqq','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
            success: function (args) {

            }
        })
    })
</script>


## 利用模板语法
## 书写的代码少了一些 但是再写前后端分离的项目的时候无法使用模板语法,局限性太大,不推荐
<script>
    $('#btn').on('click', function () {
        $.ajax({
            url: '',
            type: 'post',
            data: {'name': 'hqq', 'csrfmiddlewaretoken':{% csrf_token %}},
            success: function (args) {

            }
        })
    })
</script>

标签:跨站,请求,网站,校验,Django,CSRF,csrf
From: https://www.cnblogs.com/Hqqqq/p/18095010

相关文章

  • Django框架之中间件思想
    【一】引入我们在Django的配置文件中,里面的中间件配置文件虽然使用逗号分开,但是可以直接映入到某个模块MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.C......
  • Django框架之auth模块
    【一】Auth模块引入auth模块是django自带的用户认证模块当我们开发一个网站的时候,无可避免的需要设计实现网站的用户登陆系统。此时我们需要实现包括用户的注册,登录,全局登录认证,注销,修改密码等等,如果要靠自己一点点敲代码完成,那实在是太繁琐了Django为我们提供的Auth模块......
  • Django框架静态文件
    【一】静态文件配置说明【1】模板文件通常html文件都会放在templates文件夹下【2】资源文件资源文件也就是jQuery,bootstrap这些前端框架这些都统称为静态文件,通常默认是放在static文件夹里面的static内部又通常分为以下三部分cssjssimgplugins【二】静态文件配......
  • Django框架之ORM操作
    【一】配置数据库【1】默认数据库在settings.py文件中的DATABASES字典就是用来配置数据库的默认的数据库是django自带的数据库是sqlite3DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',......
  • Django框架之requests对象
    【一】requests对象引入【1】提交GET请求前端form表单中action属性,如果不写的话,默认就是向当前路由请求form表单中的method属性,如果不写默认就是GET请求<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>{%lo......
  • Django框架之视图层
    【一】视图层三板斧HttpResponse非常重要,因为三板斧的三个方法返回的都是HttpResponse对象通过看源码可以发现各种各样的类,最终都是由HttpResponse这个类继承而来的【1】HttpResponseHttpResponse是Django中用于创建HTTP响应的一个类,它可以方便的把一些自定义的文本内容或......
  • Django框架之路由层
    【一】Django的路由系统【1】什么是URL配置URL调度器|Django文档|Django(djangoproject.com)URL配置的本质就是让URL与视图函数之间有对应的关系当在浏览器输入对应的URL,django就能通过URL配置去找对应的视图函数【2】基本格式##Django1.x版本语法fromdjango.co......
  • Django框架之模板层
    【一】模板语法的传取值模板语法需要记两组符号,分别是{{}}和{%%}{{}}通常是与变量相关的{%%}通常是与逻辑相关的【1】传值模板语法可以传递python所有的数据类型,包括函数和类,以及类实例化的对象传递函数的时候,函数需要有返回值,要不然在页面显示的结果就是None模板语法......
  • Django 分页器代码
    分页器代码:在使用到非Django内置的第三方功能或者组件代码的时候,一般情况下会创建你一个名为utils文件夹,在该文件夹对模块进行功能性划分。utils可以创建在每个应用下。classPagination(object):def__init__(self,current_page,all_count,per_page_num=2,pager_coun......
  • Django 字段类型,字段参数,以及在drf中的使用。
    字段类型#models中CharField,DecimalField.....#记住的: CharFieldIntegerFieldFloatFieldDecimalFieldDateTimeFieldDateField#知道--》models中没有的---》反序列化的时候,前端传入的{name:lqz,age:19,hobby:[篮球,足球],wife:{name:lyf,age:38}} ListF......