cookie與session,Django中間件,跨站請求僞造

cookie與session,Django中間件,跨站請求僞造

一.cookie與session

Cookie的由來html

由於HTTP協議是無狀態的,就是說你沒次訪問一個網站就像是第一次訪問.所以就誕生的Cookie.程序員

什麼是Cookie
Cookie具體指的是一小段信息,它是由服務器發出來的存儲在瀏覽器上的一組組的鍵值對,當你的瀏覽器下次再訪問時,就會攜帶這些信息,以便服務器來提取有用的信息.ajax

Cookiedjango

cookie的工做原理: 由服務器產生的內容,瀏覽器收到請求後保存在本地,當瀏覽器再次訪問時,瀏覽器會自動的帶上cookie,這樣服務器經過cookie來斷定,你是否是來過.瀏覽器

二.Django中操做Cookie

獲取Cookie安全

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

參數:服務器

  • default: 默認值
  • salt: 加密鹽
  • max_age: 後臺控制過時時間

設置Cookiecookie

rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None,...)

參數:session

  • key: 鍵
  • value: 值
  • max_age=None: 超時時間

刪除Cookie函數

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user") #刪除用戶瀏覽器上以前設置的usercookie值
    return rep

Cookie實現登陸認證

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'kang' and password == '123':
            old_path = request.GET.get('next')  # 拿到要訪問的頁面
            if old_path:
                obj = redirect(old_path)   #若是有就返回那個頁面
            else:
                obj = redirect('/home/')
            obj.set_cookie('name','kang')  # 讓客戶端瀏覽器記錄一個鍵值對
            return obj

    return render(request, 'login.html')

# 登陸裝飾器
from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args, **kwargs):
        if request.COOKIES.get('name'):  #判斷有沒有cookie,有的話直接返回
            res = func(request,*args, **kwargs)
            return res
        else:
            target_url = request.path_info # 沒有的跳轉到登陸頁,而且附帶上想要訪問的
            return redirect('/login/?next=%s'%target_url)
    return inner


@login_auth
def home(request):
    return HttpResponse('我是主頁面,登陸後查看')

@login_auth
def index(request):
    return HttpResponse('我是買東西頁面')

@login_auth
def play(request):
    return HttpResponse('我是玩遊戲頁面')

@login_auth
def logout(request):
    obj = redirect('/login/')
    obj.delete_cookie('name')
    return obj

Session

Session的由來

  1. Cookie雖然可以幫助咱們解決需求,可是他自己最大支持4096字節,由於他是存在客戶端的,因此也有可能被攔截或者竊取.所以出現了Session,它是存放在服務器端,而且有較高的安全性.
  2. 基於HTTP協議的無狀態特徵,服務器根本就不知道訪問者,那麼Cookie就起到了橋接的做用.
  3. 咱們能夠給沒個客服端的Cookie分配一個惟一的id,這樣在訪問時,經過Cookie,服務器就知道來的人是'誰',而後在根據不一樣的Cookie的id,在服務器上保存一段時間的信息.如"帳號密碼".
  4. Cookie彌補了HTTP無狀態的不足,讓服務器知道了來的人是誰,可是Cookie是以文本的形式保存在本地.自身安全性較差,因此咱們就經過Cookie識別不一樣的用戶,對應的在Session保存私密的信息以及超過4096的字節文本.
  5. 全部說,Cookie和Session是共通性的東西.

Django中的Session相關方法

# 設置,獲取,刪除session中的數據

#設置
request.session['username'] = 'kang'

#獲取
request.session.get('username')

#刪除
request.session.flush()

#設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
  若是value是個整數,session會在這些秒數後失效
  若是value是0,用戶關閉瀏覽器就會失效.

Session實現登陸認證

 

Django中間件

中間件的做用

  • 用戶訪問頻率限制
  • 用戶是不是黑名單,白名單
  • 全部用戶登陸校驗
  • 只要是涉及到網址全局的功能,你就應該考慮使用中間件.

django中間件暴露給程序員的五個能夠自定義的方法(五個方法都是在特定的條件下自定觸發的)

1.你要新建一個文件夾, 裏面能夠創建任意名稱的py文件
裏面寫類固定繼承
from django.utils.deprecation import MiddlewareMixin
class MyThink(MiddlewareMixin):
#五個方法:
須要掌握的:
1. process_request(******):請求來的時候 會從上往下依次通過每個中間件裏面process_request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了,會執行同一級別的process_response
             def process_request(self,request):
                 print('我是第一個自定義中間件裏面的process_request方法')
                 return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值")  # 直接原地返回
2.process_response(***):響應走的時候 會從下往上依次進過每個中間件裏面的process_response
              def process_response(self,request,response):  # response就是要返回給用戶的數據
                  print("我是第一個自定義中間件裏面的process_response方法")
                  return response
瞭解的:
                process_view:路由匹配成功以後執行視圖函數以前觸發
                process_exception:當視圖函數出現異常(bug)的時候自動觸發
                process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發

跨站請求僞造(釣魚網站)

就至關於你搭建了一個和充Q幣如出一轍的網站,用戶在你的網站進行充值的時候輸入的是本身的結果充給了你.

簡單的原理

  • 在你寫form表單的時候,用戶的用戶名,密碼都會真實的提交給Q幣後臺
  • 可是被充的人的帳戶卻不是用戶填的,你暴露給用戶的是一個沒有name屬性的input框
  • 你本身寫好了一個隱藏的帶有的name和value的input框

解決釣魚網站的策略

  • 只要是用戶想要提交post請求的頁面,我在返回給用戶的時候就提早設置好一個隨機字符串
  • 當用戶提交post請求的時候,我會自動先獲取查找是否有該隨機的字符串.
  • 若是有正常提交,不然直接報403

form表單

你在寫form表單的時候只須要加上
  {% csrf_token %}

ajax

第一種: 本身在頁面上先經過{% cstf_token %}獲取到隨機字符串,而後利用標籤查找
data: {'username':'kang','csrfmiddlewaretoke:$([name="csrfmiddlewaretoken"]').val()}

第二種:
data:{'username':'kang', 'csrfmiddlewaretoken':'{{ csrf_token }}'}

第三種
拷貝js文件

如何不校驗使用裝飾器

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator # 它做用於CBV

@csrf_exempt  # 避免校驗
def exem(request):
    return HttpResponse('exempt')

@csrf_protect  # 可單獨校驗
def pro(request):
    return HttpResponse('pro')



CBV
from django.views import View
# 第一種
# @method_decorator(csrf_exempt,name='dispatch')
@method_decorator(csrf_protect,name='post')
class MyCsrf(View):
    # 第二種
    # @method_decorator(csrf_exempt)
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)
    def get(self,request):
        return HttpResponse('hahaha')

    @method_decorator(csrf_protect)
    def post(self,request):
        return HttpResponse('post')
相關文章
相關標籤/搜索