[주] 장고 템플릿 (2) - CSRF, 인증 코드, URL 리버스 룩업

 

노트는 주로에 따라 공식 문서 , 노트 및 추출 키 포인트, 문서 링크를 포함시 키 공식. 공식 문서를 참조하십시오.

공식 문서 : 장고 문서 

권장 블로그 : Django2.2 자습서

공식 문서보기 층 : 템플릿 계층

 

디렉토리

1.CSRF

1.1. 기본 사용

1.2. 데코레이터 장식

2. 확인 코드

3.URL 역 분석

개요


 

1.CSRF

공식 문서 : 크로스 사이트 요청 위조 CSRF 보호

더 많은 보안 관련 문서 : 안전

 

1.1. 기본 사용

크로스 사이트 요청 위조로 번역 크로스 사이트 요청 위조에 CSRF 맞춤법. CSRF 공격자는 사용자를 대신하여 악의적 인 요청을 전송하는 사용자의 신원을 훔친. CSRF는 일을 포함 할 수 있습니다, 전자 메일, 메시징의 이름을 보내 귀하의 계정을 도용, 심지어 상품의 구매, 가상 화폐 전송하는 ...... 인한 문제는 다음과 같습니다 개인 정보 및 재산 안전의 공개.

당신이 장고 프로젝트를 만들 때 기본 CSRF 미들웨어으로 사용 가능. 켜져 있지 않으면 미들웨어가 setting.py 제공에 첨가 할 수있다 'django.middleware.csrf.CsrfViewMiddleware' .

CSRF는 POST 방법에 대한 일반적 . 장고는 우리를 위해 CSRF 공격을 방지 할 수있는 메커니즘을 제공합니다. 다음과 같이 기본적인 사용은 :

 

양식의 경우 :

POST 함유 양식 필요 템플릿, <form>양식 내의 요소를 추가 csrf_token태그 아래와 같이를 :

<form action="" method="post">
    {% csrf_token %}
    ....
</form>

따라서, 통상의 형태로 데이터에 부가하여, 백엔드 서버로 전송 POST 방식으로 폼 데이터는 또한 검증 CSRF 랜덤 문자열 CSRF 토큰을 운반 할 때.

 

아약스의 경우 :

에서 AJAX 하지 양식으로 캐리 형태로 {% csrf_token %}토큰입니다. 장고 서버는 AJAX는 더 많은 문제를 통과에서 POST 요청을 전송받는 경우.

솔루션은 프런트 엔드 템플릿에 공식 장고 에 자바 스크립트 코드 는 JQuery와, JQuery와 사전에로드해야합니다 라이브러리에 의존,이 방법은 아약스 POST CSRF이 필요 토큰을 가져올 수있을 것입니다, 다음 코드를 추가합니다. (공식 문서를 참조하십시오)

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // 这些HTTP方法不要求CSRF包含
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

 

1.2. 데코레이터 장식

(1) 별도의 인증에 대한 필요성 CSRF 지정

때때로, 우리 가까이에있는 전체에 CSRF 기능을 서 있지만, 보기 CSRF 방어에 일부 필요가 , 어떻게 그것을 할? 장고는 제공 csrf_protect (보기) 장식을.  

 csrf_protect (보기)  사용 :

from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render(request, "a_template.html", c)

역의이 CSRF 끌하지만, 비록 위는 my_view보기는 아직 검증 CSRF합니다.

참고 : 뷰 클래스 기반의 경우, 참조 할 수 클래스 기반 뷰를 기반으로 장식 뷰 클래스를 장식 ..

(2) 독립적으로 무시 CSRF 검증 지정된

대신, 역의 시간에 개방 CSRF 메커니즘은 일부보기 우리는 CSRF 메커니즘을 설정하고 싶지 않아요 . 이 방법으로 할 수 있습니다? 이것은 장고는 우리가 제공하는 사용이 필요합니다 csrf_exempt(view) (또 다른 보안 문제를 다루는이 시점에서)의 장식을 사용합니다 :

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

(3) 그 토큰 CSRF을 보장하기 위해 제공된다

CSRF 토큰에 반환 페이지를 따라 반환되는 장식 할 뷰를 확보하면서 장고는 장식을 제공합니다.

데코레이터는 다음과 같습니다 ensure_csrf_cookie (보기) :

from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import HttpResponse

@ensure_csrf_cookie
def my_view(request):
    return HttpResponse('Hello world')

 

실제 개발에서, 일부는 당신은 장식에 인증 로그인, 데코레이터 로그인을 디자인 할 수 있습니다, 액세스 인증 로그온 페이지를 필요로 운영하고 있습니다. 그리고 코드 감소 로직의 양을 증가.

 

2. 확인 코드

사용자 등록에서, 로그인 페이지, 방지하기 위해 폭력 요청을 , 당신은 코드가 잘못된 경우, 당신은 비즈니스 서버, 데이터베이스 서버에 대한 압력을 줄일 수, 치료를 수행 할 필요가 없습니다, 확인 코드 기능을 추가 할 수 있습니다.

수동으로 검증 코드를 구현 (여러 가지를 달성하기 위해 온라인으로 사용할 수 있습니다)

이러한 코드가 인터넷을 많이 발견 할 수 있기 때문에 다음 코드는 서면 설명서를 필요로하지 않습니다.

1) 설치 패키지 베개.

pip install Pillow

또한 설치된 버전을 지정할 수 있습니다. 다음 코드는 이미지, ImageDraw는, ImageFont은 개체 및 방법을 사용합니다.

베개 : https://pillow.readthedocs.io/en/latest/index.html

베개 관련 블로그 : https://www.cnblogs.com/linyouyi/p/11429511.html , https://blog.csdn.net/wzyaiwl/article/details/89023729

 

2) views.py 파일에서 뷰 verify_code를 만들 수 있습니다.

  • 1 팁 : 임의로 생성 된 문자열을 세션으로, 이후의 결정을 위해.
  • 팁 2 :보기 반환 MIME 형식 이미지 / PNG입니다.
from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO
...
def verify_code(request):
    #引入随机函数模块
    import random
    #定义变量,用于画面的背景色、宽、高
    bgcolor = (random.randrange(20, 100), random.randrange(
        20, 100), 255)
    width = 100
    height = 25
    #创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    #创建画笔对象
    draw = ImageDraw.Draw(im)
    #调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)
    #定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    #随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    #构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
    font = ImageFont.truetype('FreeMono.ttf', 23)
    #构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    #绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    #释放画笔
    del draw
    #存入session,用于做进一步验证
    request.session['verifycode'] = rand_str
    #内存文件操作
    buf = BytesIO()
    #将图片保存在内存中,文件类型为png
    im.save(buf, 'png')
    #将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

3) 열기  애플리케이션 /urls.py의 구성 URL을 파일을.

    path('verify_code', views.verify_code, name='verify_code'),  # 产生验证码图片

4) 서버를 실행, 브라우저에서 다음 URL을 입력합니다. 당신은 생성 된 코드를 볼 수 있습니다.

http://127.0.0.1:8000/verify_code

필요성이 확인되면 다음과 같이보기 키 코드입니다 :

    # 获取用户输入验证码
    vcode1 = request.POST.get('vcode')
    # 获取session中保存的验证码
    vcode2 = request.session.get('verifycode')
    # 进行验证码校验
    if vcode1 != vcode2:
        # 验证码错误
        return redirect('/login')  # 检验失败,重定向到一个页面

 

 

3. URL의 역 분석

공식 문서 : URL 스케줄러 ( 요청 처리 , 경로 변환기 , 정규 표현을 이용하여 , URL을 일치 URLconf 부는 , 다른 URLconf는 (순방향 경로) 등 , URL을 해석의 역  등)

블로그 : https://www.liujiangblog.com/course/django/136

개요

 

실제 장고 프로젝트에서, 종종 구성 생성 된 내용에 바 URL, URL 링크를 얻기 위해 필요합니다.

그것은 최고의 하드 코딩하지 URL입니다 (소비 확장 할 수 없습니다, 오류가 발생하기 쉬운). 생성 및 URL과 URLconf 설명 일시적인 메커니즘을 사용하지 않는 URL 디자인은,이 URL은 무용지물이 될 시간이 지남에 이어질 것입니다.

소스 코드에서 다양한 프로젝트를 검색 실패한 하드 코딩 된 URL을 교체하지 않고도 URLconf의 코드를 수정할 때 우리는 안전하고 신뢰할 수있는 적응 메커니즘이 필요합니다. 장고는 솔루션 만 제공하는 URL에 이름 매개 변수를 , 당신은 쉽게 기억하고 직관적 인 문자열을 사용자 정의를 할당합니다.

 

URL을 해결하는 데 필요한 경우, 다른 수준, 장고 역방향 조회 URL에 대해 서로 다른 도구를 제공합니다 :

  • 에서 템플릿 사용 :이  url 템플릿 태그. (즉, 앞 페이지 쓰기)
  • 에서 파이썬 코딩 : 사용  reverse() 기능을. (즉, 기록시 뷰 함수의 경우 등)
  • 장고의 모델 인스턴스와 관련된 고급 URL 처리 코드에서 사용하는  get_absolute_url() 방법을. (즉, 모델 모델)

 

(1) 이름 매개 변수

으로 이름 매개 변수 , 당신은 할 수 있습니다 URL 조회 역 , 역 URL 매칭 , 역 URL 쿼리 또는 간단한 URL 역방향 조회를 .

다음 예는 다음과 같다 :

주 이름 URLconf :( 매개 변수 : 이름 = '뉴스 년간 아카이브')

from django.urls import path

from . import views

# 如果是app的urls,这里加上:app_name = '应用名'
urlpatterns = [
    #...
    path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
    #...
]

상기 내용을 토대로, 그리고 2020 년  해당 URL은입니다  /articles/2020/ .

 

다음과 같은 방법으로 당신이 사용할 수있는 템플릿 코드를 그들을 얻을 :

硬编码的链接(只能访问/articles/2012):<br/>
<a href="/articles/2012/">2012 Archive</a><br/>

解析动态生成链接(能访问 "articles/<int:year>/" 格式的路径):<br/>
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
{# Or with the year in a template context variable: #}

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

 

또는에서 파이썬 코드 내부 : django.urls에서 역방향 가져, 다음 사용  reverse() 기능을

from django.http import HttpResponseRedirect
from django.urls import reverse

def redirect_to_year(request):
    # ...
    year = 2020
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

를 통해 중심적인 역할을  name='news-year-archive' 참조 할 수있는 URL의 이름 .

두 개의 서로 다른 응용 프로그램은 하나의 URL에 대한 자신의 urlconf에 같은 이름을 가지고 있다면, 그것은 문제의 원인이됩니다. 당신이 사용할 수있는 네임 스페이스를 문제를 해결하기 위해.

 

(2) URL 네임 스페이스

URL 네임 스페이스는 같은 응용 프로그램의 사용을 다른 URL 이름 만 안티 URL을 찾을 수 있습니다 경우에도 보장 할 수 있습니다. 각 URL은 네임 스페이스와 사용자 지정 응용 프로그램을 사용하는 것이 좋습니다.

문서에 장고 예는, 예를 들어, 네임 스페이스 접근 방식은 매우 간단 달성하기 위해 urlconf 파일 추가 app_name = 'polls'namespace='author-polls'그와 유사한 정의를 .

권장되는 app_name = 'polls'방법입니다. 예를 들면 눈에 보이는 제목을 클릭, 공식 문서를 참조하십시오.

 

(3) 공간의 URL과 이름을 포함 URLconf

당신은 URLconf 두 가지 방법 등을 지정할 수 있습니다 응용 프로그램 네임 스페이스 .

은 첫 번째 (권장) :

URLconf는 모듈에서, 집합을 포함하는 app_name특성 이고, 동일한 수준 urlpatterns 속성 . 여야 실제 모듈 또는 모듈의 문자열 을 참조하여 전달  include(), 즉로서,  include()的参数대신에리스트 자체를 urlpatterns.

여론 조사 / urls.py : APP_NAME = '여론 조사'

from django.urls import path

from . import views

app_name = 'polls'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    ...
]

urls.py

from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
]

이 때, polls.urls URL에 정의 된 응용 프로그램 이름 공간을 갖는 여론 조사 (APP_NAME = '여론 조사'에 상당).

두 번째는 , 공식 문서를 참조하십시오.

 

개요

즉, 이러한 구성에있어서, 역방향 분석 동적 주목적 경로 URL을 생성 할 수있다.

역방향 조회를 사용합니다 :

  1. 에서 응용 프로그램을 urls.py를 전면 urlpatterns, 쓰기  APP_NAME = '응용 프로그램 이름을' ;
  2. 보기 URL을 쓰기의 각 응용 프로그램에 매개 변수 이름 : 같은, 경로 ( '인덱스', views.index, 이름 = '인덱스' ), (이 단계는 다이어트로 작동한다);
  3. 에서는 프로젝트 urls.py 에 urls.py 응용 프로그램을 포함 할 때, (가) 함수 등 의 파라미터를 작성하는 네임 스페이스 = '이름 지정' (리버스 룩업 스페이스 쓸 수 Django2.x 사실);

템플릿에서 : 사용할 수  {URL '응용 프로그램 이름 % (즉 APP_NAME) :보기 이름 (즉, 이름) '%}  형식 역 해상도, 링크를 생성,

如: <a href="{% URL 'booktest:index' %}">首页</a>를

보기에서 : 가져 오기 django.urls에서 가져 오기 역 ,

使用역방향 (view 이름은 urlconf 없음, 인수 = 없음, kwargs로 = 없음, CURRENT_APP = 없음 = 없음) [源代码]

(viewname URL 이름 패턴은보기 또는 같은 호출 개체 수 있습니다 보기 이름 ': "응용 프로그램 이름을 .

 다음과 같이 동적으로 링크를 생성 할 수 있습니다 :

from django.urls import reverse
...
# /test_redirect
def test_redirect(request):
    # 重定向到/index
    # return redirect('/index')  # 硬编码写死
    
    # 动态生成链接
    url = reverse('booktest:index')
    return redirect(url)

 

 

 

 

-----종료-----

게시 50 개 원래 기사 · 원의 찬양 (10) · 전망 6591

추천

출처blog.csdn.net/qq_23996069/article/details/104889157