Django的CSRF

1、什么是CSRF

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。

2、对于CSRF的为什么出现。

  1. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的?)

    钓鱼网站的页面是由 钓鱼网站的服务端给你返回的
    正经网站的网页是由 正经网站的服务端给你返回的

    Django就是为了放置这一类的钓鱼网站等用途

  2、Django中内置了一个专门处理csrf问题的中间件

  django.middleware.csrf.CsrfViewMiddleware  这个就在我们项目的setting里面的MIDDLEWARE列表里面

    这个中间件做的事情:

      1. 在render返回页面的时候,在页面中塞了一个隐藏的input标签

    用法:
      我们在页面上 form表单 里面 写上 {% csrf_token %}
      <input type="hidden" name="csrfmiddlewaretoken"           

      value="8gthvLKulM7pqulNl2q3u46v1oEbKG7BSwg6qsHBv4zf0zj0UcbQmpbAdijqyhfE">

      这个黄色部位每一次请求都会不一样
  2. 当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求

下面就是钓鱼网站的列子:

创建Django项目的时候会自动有这个插件的。我前面写的所有的都把这个注释了这一次就不注释了

正规网站:

路由系统的代码(项目/urls.py)

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^transfer/$‘, views.transfer)
]

视图里面(app01/views)

from django.shortcuts import render, redirect, HttpResponse
# 转账
def transfer(request):
    if request.method == "POST":
        from_ = request.POST.get("from")
        to_ = request.POST.get("to")
        money = request.POST.get("money")

        print("{} 给 {} 转了 {}钱".format(from_, to_, money))
        return HttpResponse("转账成功!")

    return render(request, "transfer.html")

transfer.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>正经的网站</h1>
<form action="/transfer/" method="post">
      {% csrf_token %}
    <p>
        转出:
        <input type="text" name="from">
    </p>

    <p>
        转入:
        <input type="text" name="to">
    </p>
    <p>
        金额:
        <input type="text" name="money">
    </p>
    <p>
        <input type="submit" value="转账">
    </p>
</form>
</body>
</html>

钓鱼网站

路由系统的代码(项目/urls.py)

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^transfer/$‘, views.transfer)
]

视图里面的代码(app/views)

from django.shortcuts import render

# Create your views here.

def transfer(request):
    return render(request, "transfer.html")

transfer.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>钓鱼的网站</h1>
<form action="http://127.0.0.1:8000/transfer/" method="post">
    <p>
        转出:
        <input type="text" name="from">
    </p>

    <p>
        转入:
        <input type="text" name="">
        <input type="text" name="to" style="display: none" value="哪吒">
    </p>
    <p>
        金额:
        <input type="text" name="money">
    </p>
    <p>
        <input type="submit" value="转账">
    </p>
</form>
</body>
</html>

这个只是做了简单的转账,如果都没有CSRF这个中间件那么我们就会被钓鱼网站这个隐藏的

<input type="text" name="to" style="display: none" value="哪吒">这个插件不管我们填什么转账用户都会转到这个用户里面

当我们有了CSRF的时候这个验证就不会通过,页面就回报403错误。这个就是防止跨站伪造

原文地址:https://www.cnblogs.com/yang-China/p/9324784.html

时间: 2024-07-30 20:14:53

Django的CSRF的相关文章

Django POST CSRF verification failed. Request abor

环境 Window 7 Python2.7 Django1.4.1 sqlite3 问题 在使用Django搭建好测试环境后,写了一个提交POST表单提交留言的测试页面. 如图: 填写表单,点击“提交留言”按钮提交到服务器,却出现 Forbidden (403) CSRF verification failed. Request aborted. 由于之前使用GET方式提交表单内容测试均正常,就以为这个问题估计是配置问题没细看后边的帮助提示直接在网上搜索解决方案. 一搜索发现相关网页很多,看来大

Django之CSRF以及CBV补充

1.CSRF a.基本应用 form表单中添加 {% csrf_token %} b.全栈禁用 # 'django.middleware.csrf.CsrfViewMiddleware', c. 局部禁用            'django.middleware.csrf.CsrfViewMiddleware', from django.views.decorators.csrf import csrf_exempt @csrf_exempt def  csrf1(request): if r

解决django出现CSRF token missing or incorrect.错误

给template中的每个POST form添加{% csrf_token %}标签. <form action="/contact/" method="post">     {% csrf_token %}     <p>Subject: <input type="text" name="subject"></p>     <p>Your e-mail (optio

Django 的 CSRF 保护机制(转)

add by zhj:其实我个人推荐前端不要将数据放在cookie中,而是放在其它本地存储(HTML5中称之为Web Storage),本地存储与cookie的一 个重要区别在于:本地数据不会自动加在http请求中.这样也就不会有CSRF了.假设用户登录了网站A,而在网站B中有一个CSRF攻击标签,点 击这个标签就会访问网站A,如果前端数据(包括sessionid)都放在本地存储的话,当在网站B点击CSRF攻击标签时,标签绑定的方法是无法获 取网站A本地存储中的sessionid的,这样用户在服

Django的CSRF机制

原文链接:http://www.cnblogs.com/lins05/archive/2012/12/02/2797996.html 必须有的是: 1.每次初始化一个项目时,都能看到django.middleware.csrf.CsrfViewMiddleware这个中间件 2.每次在模板里写form时都知道要加一个{% csrf_token %}tag 3.每次发ajax POST请求时,都需要加一个X_CSRFTOKEN 的header

Django之CSRF

网页向后端传送数据的时候有两种方式,get和post.通过设置form中的method来达到是否采用get或者是post <form action="/show_all/" method="POST"> 但是django中使用post的话会遇到如下的错误 这个错误的意思是csrf校验失败,request请求被丢弃掉.我们先来了解下什么是csrf. CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站

django 解决csrf跨域问题

1.中间件代码 [[email protected] mysite]# tree middlewares middlewares ├── base.py ├── base.pyc ├── cors.py ├── cors.pyc ├── __init__.py └── __init__.pyc 0 directories, 6 files [[email protected]-node01 mysite]# 2. 代码 middlewares/base.py [[email protected]

Django 的 CSRF 保护机制

用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件 每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag 每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header 但是一直我都是知其然而不知其所以然,没有把 csrf 的机制弄清楚.昨天稍微研究了一下,总结如下. 什么是 CSRF CSRF,

前后端分离,解决跨域问题及django的csrf跨站请求保护

1. 前后端分离解决跨域问题 解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现: 关于跨域,前端会先发送OPTIONS请求,进行预检,检查后端是否允许前端设置的相应的请求头,请求内容 function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie