python 中的 csrf(xsrf: 在 tornado 中) 和 cors
csrf 跨站請求偽造
csrf( cross-site request forgery) 屬於一種跨站攻擊, 在 tornado 中被稱為 xsrf
不一定是站內輸入, 被偽造的請求可以使任何來源, 並非一定是站內輸入
產生背景
前後端完全分離;
跨域資源共享;
核心
偽造伺服器, 攻擊正常訪問網站的使用者
解決策略
過濾請求的處理者
1. client 端提交表格是增加隨機數 hash 值(用隱藏標籤的方式提交), 在 server 端進行驗證是否一致, 只有真正的 server 端擁有正確的 hash 值
2. 使用”認證令牌”, 身份認證從 cookies 變為 token
3. 增加驗證碼
4. 增加 http 中的 referer 標識, 來判斷是同域還是跨域, 跨域是否是允許的
cors 跨域資源共享
cors (cross-origin resource sharing) 是 W3C 提出的一個標準, 如今是較為主流的解決跨域資源請求方案. [ IE8+都可以相容 ]
產生背景
為了防止 csrf
»»»瀏覽器引入同源(同domain/ip, 同埠, 同協議)策略(sop)保證訪問安全, 愛能互相獲取資源
»»»前後端不能分離,不能操作 cookies, 不能傳送 ajax等問題
提出伺服器跨域 (使用反向代理 或 cors)
核心思想
通過一系列新增的 http 頭資訊來實現 server 和 client 之間的通訊, 所以, 要支援 cors, server 端要做一些相應的配置
此時, 瀏覽器會將 cors 請求分為兩類:
- 簡單請求: HEAD GET POST
- 非簡單請求: PUT DELETE OPTIONS
非簡單請求會觸發 cors preflight (預檢請求)觸發預檢請求也有其他情況:
- 傳輸的資料格式不是 application/x-www-form-urlencoded
- 操作 cookies
# 後端header配置(舉例: tornado中)
def set_default_headers (self):
self.set_header("Access-Control-Allow-Origin", self.request.headers.get("Origin", "*")) # 限定請求源
self.set_header("Access-Control-Allow-Headers", "x-requested-with,authorization") # 請求頭
self.set_header("Access-Control-Allow-Methods", "POST,GET") # 限定合法的請求方式
self.set_header("Access-Control-Allow-Credentials", "true") # 證書
self.set_header("Content-type", "application/json") # 限定請求資料格式
相關推薦
python 中的 csrf(xsrf: 在 tornado 中) 和 cors
csrf 跨站請求偽造 csrf( cross-site request forgery) 屬於一種跨站攻擊, 在 tornado 中被稱為 xsrf 不一定是站內輸入, 被偽造的請求可以使任何來源, 並非一定是站內輸入 產生背景 前後端完全分離;
Python之路66-Django中的Cookie和Session
python目錄一、Cookie二、Session一、Cookie1.獲取Cookie request.COOKIES["key"] request.get_signed_cookie(key, default=RAISE_ERROR, s, max_age=None) # 參數 # default:默認
pycharm中查看快速幫助和python官方幫助文檔
external img 查看 cnblogs image blog extern 技術分享 視圖 把光標放在要查詢的對象上,打開視圖菜單,quick definition查看對象的定義,quick documentation 快速文檔,這個是jet brains自己對py
python之enumerate函數:獲取列表中每個元素的索引和值
pytho pre highlight blog clas dex color int num 源碼舉例: 1 def enumerate_fn(): 2 ‘‘‘ 3 enumerate函數:獲取每個元素的索引和值 4 :return:打印
Python中對象的引用和共享引用
col 即使 列表 標簽 同一性 例子 垃圾回收 是否 垃圾 在Python中先創建一個對象,然後再將變量指向所創建的對象。 對於每個對象,都有一個頭部信息,在信息中就標記了這個對象的類型信息。每當一個變量名被賦予了一個新的對象,之前那個對象占用的空間就回被回收(如果此時這
python內置函數中的 IO文件系列 open和os
python io文件 open os 內置函數 本篇介紹 IO 中的 open 和 os基礎用法。本次用一個遊戲登陸 基礎界面做引子,來介紹。實現存儲的話,方式是很多的。 比如 存到字典 和列表了,可是字典、列表是臨時的,玩網頁遊戲一次還是可以,如果要是一個反復要用到的一個軟件的話,顯
python---session(tornado中使用)緩存
AC admin nta cli ssi gen set getitem -s session.py插件 # coding:utf8 # __author: Administrator # date: 2018/3/17 0017 # /usr/bin/env
python之requests模塊中的params和data的區別
技術分享 bubuko .com param ireader rec 之間 clas data params的時候之間接把參數加到url後面,只在get請求時使用: 1 import requests 2 url=‘https://api.ireaderm.net/a
python中的list()函數和tuple()函數
nbsp tro trac post span RR ive traceback strong tuple函數:將一個序列作為參數,並把它轉化為元組,如果參數是元組,將會原樣返回: >>> tuple([1,2,3]) (1, 2, 3) >>
在Python中使用aws的sns和sqs
github scribe bsp 情況下 分布式 int 方法 test devel 首先,sns = Simple Notification Service,sqs = Simple Queue Service sns與sqs有什麽不同? (ref:https://st
python中常用的文件和目錄操作(二)
工作目錄 environ win works ID ksh sys remove -s OS模塊 一. 概述 python os模塊提供了非常豐富的方法用來處理文件和目錄 二. 導入:import os 三. 常用方法 1. os.name 輸出字符串表示正在使用的平臺,如
python中的print(x, end=)和print(x, sep=)
拼接 \n 打印 code 默認打印 輸出 col clas range print(x, end=) for i in range(10): print(i) 輸出結果: 0 1 2 3 4 5 6 7 8 9 for i in range(10):
python類中的self參數和cls參數
ini ls參數 普通 直接 CM 更多 class pytho IV 1. self表示一個類的實例對象本身。如果用了staticmethod就無視這個self了,就將這個方法當成一個普通的函數使用了。 2. cls表是這個類本身。 # 代碼為證 class A
python 操作mysql數據中fetchone()和fetchall()
python AI 就是 ews 結果 mil 多個 null font fetchone() : 返回單個的元組,也就是一條記錄(row),如果沒有結果 則返回 None fetchall() : 返回多個元組,即返回多個記錄(rows),如果沒有結果 則返回 () 需
Python中print函數中中逗號和加號的區別
連接 ror container add col body code auto pan 先看看print中逗號和加號分別打印出來的效果.. 這裏以Python3為例 1 print("hello" + "world") helloworld
Python PEP8 編碼規範 表達式和語句中的空格
pytho 所有 set input 自己 避免 spam 語句塊 混亂 不能忍受的事情 在下列情況下,避免使用無關的空格: 緊跟在小括號,中括號或者大括號後。 Yes: spam(ham[1], {eggs: 2}) No: spam( ham[ 1 ], { e
python讀寫文件中read()、readline()和readlines()的用法
open getc 今天 print adl 習慣 ever 當前位置 int python中有三種讀取文件的函數: read() readline() readlines() 然而它們的區別是什麽呢,在平時用到時總會遇到,今天總結一下。 0. 前期工作 首先新建一個文
Python設計模式中單例模式的實現及在Tornado中的應用
實例 類變量 attribute rap all wrap 線程 ++ 出現 單例模式的實現方式 將類實例綁定到類變量上 class Singleton(object): _instance = None def new(cls, *args): if not isinst
python函數——形參中的:*args和**kwargs
拆分 默認 int 關鍵字 python valid col 關於 實參 多個實參,放到一個元組裏面,以*開頭,可以傳多個參數;**是形參中按照關鍵字傳值把多余的傳值以字典的方式呈現 *args:(表示的就是將實參中按照位置傳值,多出來的值都給args,且以元祖的方式呈現)
統計輸入任意的字符中中英文字母,空格和其他字符的個數 python
字符 -s dig digi else strong div dea 是否 這裏用到了三個函數: #判斷是否為數字:str.isdigit()#是否為字母:str.isalpha()#是否為空格:str.isspace() def tongji(str): alp