⑴ 前端登陸獲取保存token再添加到請求頭中
登陸獲取token保存在本地,在請求頭添加參數
登陸:
$.ajax({
url : 'http://119.254.155.151:8768/yq/dy/login',// 獲取自己系統後台用戶信息介面
data :data,
type : "post",
dataType: "json",
success : function(data) {
const token = data.data.token
window.localStorage.setItem('yq_token', token)
}
})
內部頁面添加請求頭:
var userToken = window.localStorage.getItem("yq_token");
$.ajax({
headers: {
"token":userToken//此處放置請求到的用戶token
},
type: "get",
url: "http://119.254.155.151:8768/yq/important/data?schemeId=247248",//請求url
contentType: "application/x-www-form-urlencoded",
success: (data) => {
}
})
⑵ TokenX.Group發起人趙大偉:研判Token經濟系統的7個層面
在Token經濟里,最重要的是社會企業家和通證經濟設計師。
上周六,區塊鏈捕手舉辦了第一期捕手沙龍,本次沙龍邀請到四位 Token 經濟
的行業專家圍繞著「如何設計一個 Token 經濟系統」分享自己的實踐或研究心
得,本文是沙龍系列分享內容的第二篇,希望能對關注 Token 經濟的你有所啟
發。
本文是趙大偉的分享內容。趙大偉是區塊鏈項目TokenX.Group發起人,區塊鏈早
期項目投資人,區塊鏈與Token 經濟學研究者,和君咨詢前合夥人,暢銷書《互
聯網思維獨孤九劍》作者。
現在很多人都去做區塊鏈和發幣了,但不知道大家有沒有想過,區塊鏈是否真的
代表著未來?如果是曇花一現,我們是不是成了笑話?如果不是曇花一現,背後
的支撐邏輯在哪兒?我嘗試著回答下這個問題。
人類歷史上進化的根本動力是什麼?教科書是這么講的,人類歷史不斷前進的動
力是生產關系和生產力不可調和的矛盾,後者翻譯過來就是財富創造機制。因
此,
那麼財富的本質是什麼?財富的本質是一種權利,一種可支配資產和勞動的權
利,只不過它在不同的時代具有不同的表現形式,資產是財富的表現形式,貨幣
是財富的表達符號。在農業時代,財富體現為食物、作物,在工業時代,財富體
現為設備、廠房,那麼區塊鏈時代呢?
對於Token,不同的人會賦予不同的權益,如果想讓這個Token更有價值,一定要
把這個組織獲得的利益盡可能多地投射進去。
所以我認為,
�
首先它要有使用權的屬性,
當它的專屬使用權放在價值網路當中兌換成通用使用權時,它的本質屬性就是貨
幣了;當這種使用權根據總量恆定邏輯,把股權投射進來,它就具有了股權的屬
性。這種「具有穿透效應」的Token,是一種超越股權、債權的資產。
我認為只有這樣設計的Token才更加具備激勵價值,
這樣的邏輯是什麼?消費者和投資者互相接盤,這在原來很難
做到,但是在Token時代就可以做到,這是更為柔性的權利,這也是Token的魅力
所在。
接下來我來講講區塊鏈世界的第一個Token:比特幣,通過我們最熟悉的比特
幣,來看一個Token經濟系統的邏輯。
讓我們先來回顧一下紙幣的發展歷史。
現代意義上的紙幣起始於1696年成立的英格蘭股份制銀行。在英法之間發生「九
年戰爭」期間,英國王室入不敷出,不斷向富人們借錢,又無法及時償還,於是
英國王室就自行印製政府債券,用這些政府債券來抵押貸款,承諾債券的利息,
還承諾這些債券可以用於交稅。
但英國的富人們覺得這其實是在讓富人們為政府的戰爭和赤字承擔風險和責任,
他們認為這些風險應該讓全體國民共同承擔,於是集體成立了英格蘭銀行,由
1208位股東共同出資,再由該銀行將股東們集資的120萬英鎊借給政府,條件是
允許這家銀行發行的債券作為正式的貨幣流通,取代或部分取代原來金銀貨幣的
流通。
不再用真金白銀來鑄幣,而是用白紙來印製貨幣,這意味著什麼?在硬通貨幣時
代,鑄幣者充其量可以通過減少金銀幣的成色來取巧,從中謀取「鑄幣稅」。如
今政府通過印鈔來可以瘋狂攫取「鑄幣稅」,只要政府打個借條,銀行就可以開
始印錢,印了錢就可以買東西。
此時的貨幣,支撐其價值的不再是財富,而是政府的信用。只要大家相信政府的
債券貨幣(借條)值錢,它就值錢。盡管政府可能打了太多的借條,並因此不斷
地將真實的財富往政府手裡集中,而百姓手裡的債券貨幣只不過是一種財富符號
而已。
這實際上這是一種剝削制度,怎麼體現呢?
第一個案例,比如說政府要發行紙幣,A銀行因為其是銀行所以可以先得到這筆
貨幣,然後其以高於央行的貸款利率貸給貸款人。假如此時央行的貸款利率是
1%,那麼A銀行一定會以大於1%的利率貸款給實際貸款人,假設為3%,此時實際
貸款的利率就是4%。
商人以追求利潤為目的,那麼當他把這筆貸款投資到商品生產後,其商品銷售價
格自然要把這4%算在內,於是位於鏈條終端的老百姓必須為這4%的貸款利率買
單。
第二個案例,假設有一個小島,你用1000元可以買到這個島上所有的商品和服
務,此時每個單位貨幣對應的商品服務是一定的,如果這個島上的政府再增發一
千元貨幣,相當於每個人手上持有的貨幣就貶值了,原來的10塊錢可以買到10塊
錢的東西,但現在1隻能買到5塊錢的東西,這意味著購買力下降了,那麼誰得到
了好處?
這也是一種剝削模型,這個模型被當時的英國政府無限復制和放大,每佔領一個
殖民地,英國就立刻把英鎊的貨幣制度導進去,不斷印錢,把當地的財富源源不
斷地轉移到英國政府。英國政府為什麼成了後來的「日不落帝國」?從根本上
講,債券貨幣功不可沒。
兩次世界大戰之後,美元取代昔日的英鎊成為了世界貨幣,這意味著美國政府開
始打借條印發美元這種債券貨幣了。
布雷頓森林體系建立之初,為了確立美元的霸權,美國政府曾經對全世界做出承
諾,把各國的貨幣鎖定美元,而美元鎖定黃金,即每35美元兌換1盎司黃金。
但是情況沒有那麼簡單。美國在二戰之後愚蠢地接連捲入朝鮮戰爭和越南戰爭,
這兩場戰爭使美國耗費巨大財力,尤其是越南戰爭期間,美國差不多花費了八千
億美元的軍費。當時每35美元對應1盎司黃金,美金流失也意味著黃金要流失
的。
當時法國的戴高樂總統說,我不再相信美元了,要求把黃金換回來。於是其它國
家相繼效仿法國把黃金換回來,這樣逼得美國當時無路可走。最後在1971年8月
15日,時任美國總統尼克松宣布關閉黃金窗口,美元與黃金脫鉤。
從這一天開始,我們進入到一個真正的紙幣時代,美元的背後不再有貴金屬,它
完全以美國政府的信用作為支撐並從全世界獲利。簡單地說,美國人可以用印刷
一張綠紙的方式從全世界獲得實物財富。人類歷史上從來沒有過這樣的事情。
人類歷史上獲得財富的方式很多,要麼用貨幣交換,要麼用黃金或者白銀交換,
再要麼用戰爭的方式去掠奪,但是戰爭的成本非常巨大。
2008年的美國金融危機再次沖擊了全球經濟,仰仗著美元的全球購買力和融資能
力,美國以極低的成本刺激經濟,很快從金融危機的陰霾中復甦,但全球經濟至
今沒有回到2008年前的增長水平。
比特幣就是在這個背景下誕生的。比特幣的創世區塊里寫著當天的《泰晤士報》
頭版標題——「The Times03/Jan/2009 ,Chancellor on brink of second
loutfor banks」(2009年1月,財政大臣在對銀行進行第二次救助的邊
緣)。
如果要設計一個生態系統,這個生態的使命是什麼?幫助什麼人群解決了什麼問
題?這是生態最根本、最基礎的問題。當這些基礎問題明確了,生態系統的設計
就容易多了.
在傳統的貨幣制度中,黃金作為實物貨幣,流通成本較高(分割麻煩,攜帶不
便),且容易被暴力機關控制,而比特幣在效仿黃金的邏輯設定的同時,
同時,比特幣作為一種點對點的電子現金系統,不需要中心化的機構去做信用背
書,所有交易登記讓所有參與網路的礦工去進行。比特幣的設計還包括怎樣防止
偽造、依據什麼樣的邏輯和規則去激勵等等,它目前的共識機制還比較簡單,後
面還會有越來越多的共識機制。
比特幣是區塊鏈世界的第一個Token,這樣的一套經濟系統的設計值得所有區塊
鏈項目參考。
目前市場上有兩個項目,它們在還沒有Token的時候,就已經做了相應的事情,
而且成績不錯。
第一個是趣頭條,它在2016年6月上線,距今不到兩年。這個項目是我老媽推薦
給我的,很多趣頭條的用戶都是四、五線的城市居民,他們為什麼願意看?因為
他們看完一篇文章後可以獲得50個金幣,你把文章轉發到朋友圈,如果有人通過
這篇文章注冊你也會獲得50個金幣,同時趣頭條還有一個叫做收徒弟的裂變機
制,當你下一級的徒弟看文章時,你也會有對應的金幣激勵,而金幣是可以兌換
成現金的。
通過這些金幣激勵方式,趣頭條獲得了非常成功的成績,2017年年底數據顯示,
趣頭條APP注冊用戶超過七千萬,每月活躍用戶達到三千萬,日活躍用戶達到一
千萬,現在還准備赴美IPO。
另外一個項目是崑山服裝企業,每年有幾個億的營收。這個企業內部有一個米票
系統,這個米票系統會面向內部員工和上下游合作夥伴發行,很多的消費者和代
理商也持有米票,米票代表著分紅權,每年公司會拿出一定的利潤按照米票持有
金額進行分紅。
那怎樣的行為可以獲得米票呢?比如某部門要組織一次培訓活動,但是內部資源
不夠,該部分可以在拿一百個米票懸賞,哪個部門願意提供一個場地,哪個部門
願意提供講師,那麼一百個米票就給誰。通過這個方式,這個企業的業績幾年時
間翻了好多倍。在這個案例匯總,其實米票也可看做一個Token,唯一的區別就
是流動能力沒有Token強。
以上兩個例子就向我們證明:
在設計一個Token經濟系統前,我們首先要思考自己想解決什麼問題、解決多大
的問題?對這個問題的思考不能局限於商業的視角,更要用社會的視角去看待。
基於一些宏大的願景,我認為一共有7個層次的問題需要思考:
1. 解決什麼問題——解決多大的問題,就能成就多大的事業(不局限於商
業視角,社會企業家);
2. 生態演化路徑——業務成長邏輯,有哪些關鍵項目支撐;
3. 參與角色梳理——有哪些參與者:生產者、消費者、投資者、傳播者;
4. 定義協作規則——各角色之間如何展開協作;
5. 貢獻度設定——不同參與者的貢獻權重,在不同時間軸上的分布;
6. 多層次激勵機制——參與者的回報不局限於物質利益,根據需要設計多
層次回報體系(可以設置不同的Token);
7. 激勵兌現方式——如何保障激勵可以不折不扣被兌現。
為什麼是多層次激勵機制呢?因為不是所有人的動力都是利益層面的激勵。
比如有些人看中金錢,有些人看中名望,不同的層次的匯報可以體現為不同
的Token。
舉個例子,假設一個區塊鏈媒體想發行Token並用Token的方式去運作,按照我們
剛才講的7層次,大家可以思考下它解決了哪些問題?比原來的模式好多少?我
這里不完全展開,只講講重點。
如果這個區塊鏈媒體要給讀者發Token,讀者讀得越多,獲得的Token就越多。那
請問這些讀者是為了領Token才來看這個媒體的嗎?他來這里的第一目的是什
么?媒體能幫到讀者什麼?比如說讀者想通過區塊鏈媒體提升對區塊鏈盲區的認
知,那一定需要有認知的人給這個媒體做貢獻,才能滿足讀者的需求。
Token的絕大部分應該給這些內容的創造者,很少的部分才能給到讀者,這是權
重的問題,如果權重設計偏了,很可能這個生態就成長不起來。
⑶ vue+flask前後端分離解決csrf token問題
是攻擊者通過跨站請求,以合法的用戶身份進行非法操作(如轉賬或發帖等)。CSRF的原理是利用瀏覽器的Cookie或伺服器的Session,盜取用戶身份
防範CSRF的主要手段是識別請求者的身份,通過在表單中添加令牌(token)。
前後端分離實現過程:
後端寫入令牌
為了能夠讓所有的視圖函數受到 CSRF 保護,需要開啟 CsrfProtect 模塊:
生成token值並利用請求鉤子設置cookie,然後前端就能獲取到cookie值
在前端請求時帶上 csrf_token 值
根據登錄和注冊的業務邏輯,當前採用的是 ajax 請求
所以在提交登錄或者注冊請求時,需要在請求頭中添加 X-CSRFToken 的鍵值對
原文鏈接: https://blog.csdn.net/paul0926/article/details/94544048
⑷ XLNet 詳解
BERT 訓練時將部分單詞 mask 起來,使模型能夠利用句子雙向的信息,在很多 NLU 任務上取得很好的效果。但是 BERT 忽略了 mask 單詞之間的關系,且微調過程與預訓練過程不一致 (微調時沒有 mask 的單詞)。XLNet 採用了 PLM (Permutation Language Model) ,將句子隨機排列,然後用自回歸的方法訓練,從而獲得雙向信息並且可以學習 token 之間的依賴關系。另外 XLNet 使用了 Transformer-XL,使用了更廣闊的上下文信息。
XLNet 論文中首先提出了一種比較有意思的觀點,將當前預訓練模型分為了兩類 AR (Auto Regression,自回歸) 和 AE (Auto Encoder,自編碼器)。
GPT 就是一種 AR 方法,不斷地使用當前得到的信息預測下一個輸出 (自回歸)。而 BERT 是一種 AE 方法,將輸入句子的某些單詞 mask 掉,然後再通過 BERT 還原數據,這一過程類似去噪自編碼器 (Denoising AutoEncoder,DAE)。不熟悉 GPT 和 BERT 的童鞋可以參考前面的文章, 《OpenAI GPT 和 GPT2 模型詳解》 和 《徹底理解 Google BERT 模型》 。
AR 的方法可以更好地學習 token 之間的依賴關系,而 AE 的方法可以更好地利用深層的雙向信息。因此 XLNet 希望將 AR 和 AE 兩種方法的優點結合起來,XLNet 使用了 Permutation Language Model (PLM) 實現這一目的。
Permutation 指排列組合的意思,XLNet 將句子中的 token 隨機排列,然後採用 AR 的方式預測末尾的幾個 token。這樣一來,在預測 token 的時候就可以同時利用該 token 雙向的信息,並且能學到 token 間的依賴,如下圖所示。
接下來介紹 XLNet 中的實現細節,其中 XLNet 為了實現 PLM,提出了 Two-Stream Self-Attention 和 Partial Prediction。另外 XLNet 還使用了 Transformer-XL 中的 Segment Recurrence Mechanism 和 Relative Positional Encoding,不熟悉 Transformer-XL 的童鞋可以參考前面的文章, 《Transformer-XL 語言模型》 。
PLM (Permutation Language Model) 是 XLNet 的核心思想,首先將句子的 token 隨機排列,然後採用 AR 的方式預測句子末尾的單詞,這樣 XLNet 即可同時擁有 AE 和 AR 的優勢。
XLNet 中通過 Attention Mask 實現 PLM,而無需真正修改句子 token 的順序。 例如原來的句子是 [1,2,3,4],如果隨機生成的序列時 [3,2,4,1],則輸入到 XLNet 的句子仍然是 [1,2,3,4],但是掩碼需要修改成下圖。
圖中的掩碼矩陣,紅色表示不遮掩,白色表示遮掩。第 1 行表示 token 1 的掩碼,可以看到,1 是句子的最後一個 token,因此可以看到之前的所有 token (3,2,4)。3 是句子的第一個 token,看不到句子的任何信息,因此第 3 行都是白色的 (表示遮掩)。
Two-Stream 概念
XLNet 打亂了句子的順序,這時在預測的時候 token 的位置信息會非常重要,同時在預測的時候也必須將 token 的內容信息遮掩起來 (否則輸入包含了要預測的內容信息,模型就無法學到知識)。 也就是說 XLNet 需要看到 token 的位置信息,但是又不能看到 token 的內容信息 ,因此 XLNet 採用了兩個 Stream 實現這一目的:
Query Stream 計算
Query Stream 用 g 表示,Content Stream 用 h 表示,使用 Query Stream 對要預測的位置進行預測的時候,Q (Query) 向量是用 g 計算得到的,包含該位置的位置信息,而 K (Key) 和 V (Value) 是用 h 計算的,包含其他 token 的內容信息。下圖展示了如何通過當前層的 g 計算下一層 g 的過程,圖中的排列是 [3,2,4,1],計算的 token 是 1。
可以看到在計算 token 1 的 Q 向量時,只使用了 token 1 的 Query Stream g ,即模型只得到 token 1 的位置信息。而向量 K,V 使用 token 3, 2, 4 進行計算,所以模型可以得到 token 3, 2, 4 的內容信息。因為 token 1 是排列 [3,2,4,1] 的最後一位。這一個過程的掩碼矩陣和上一節的是一樣的 ,對角線上都為白色,即遮掩當前預測位置的內容信息 h 。
Content Stream 計算
Content Stream 包含了 token 的內容信息,因為 XLNet 的層數很多,需要將 token 的內容傳遞到下一層。這一層的 Q, K, V 都是利用 h 計算的。Content Stream 的計算如下圖所示。
可以看到,在計算下一層的 h1 時,也會利用 token 1 當前的內容信息,這樣就可以將 token 的內容傳遞到下一層,但是注意 XLNet 在預測時只是用 g (Query Stream)。計算 Content Stream 時候的掩碼矩陣如下圖所示。
和 Query Stream 的掩碼矩陣區別在於對角線,Content Stream 不遮掩對角線,使得當前 token 的信息可以傳遞到下一層。
Query Stream 和 Content Stream 組合
XLNet 將 Query Stream 和 Content Stream 組合在一起,如下圖所示。
圖中最下面的一層是輸入層,其中 e(x) 是單詞的詞向量,表示輸入的 Content Stream,而 w 表示輸入的位置信息,即 Query Stream。
XLNet 將句子重新排列,然後根據排列後的順序使用 AR 方式預測,但是由於句子是隨機排列的,會導致優化比較困難且收斂速度慢。因此 XLNet 採用了 Partial Prediction (部分預測) 的方式進行訓練,對於排列後的句子,只預測句子末尾的 1/K 個 token。
例如 K=4,就是只預測最後 1/4 的 token。給定句子 [1,2,3,4,5,6,7,8] 和一種隨機排列 [2,8,3,4,5,1,7,6],則只預測 7 和 6。論文中訓練 XLNet-Large 時使用的 K 為 6,大約是預測末尾 14.3% 的 token。
XLNet 使用了 Transformer-XL 中的 Segment Recurrence Mechanism (段循環) 和 Relative Positional Encoding (相對位置編碼) 進行優化。
Segment Recurrence Mechanism 段循環的機制會將上一段文本輸出的信息保存下來,用於當前文本的計算,使模型可以擁有更廣闊的上下文信息。
在引入上一段信息後,可能會有兩個 token 擁有相同的位置信息,例如上一段的第一個單詞和當前段的第一個單詞位置信息都是一樣的。因此 Transformer-XL 採用了 Relative Positional Encoding (相對位置編碼) ,不使用固定的位置,而是採用單詞之間的相對位置進行編碼。在之前的文章《Transformer-XL 語言模型》中有比較詳細的介紹,感興趣的童鞋可以參考一下。
XLNet 使用了 Transformer-XL 後如下圖所示。 mem 表示的就是前一個 XLNet 段的內容信息,而 XLNet 中輸入的 Query Stream 為 w,保存位置信息,採用的是 Relative Positional Encoding。
XLNet 希望像 BERT 一樣採用 [A, SEP, B, SEP, CLS] 的形式處理句子任務,在 BERT 中有兩個表徵向量 EA 和 EB 分別表示句子 A 和 B。但是 XLNet 採用 Transformer-XL 的段循環機制後會出現問題,兩個段都有句子 A 和 B,則兩個句子 A 屬於不同的段,但是卻會有相同的 Segment 向量。
XLNet 提出了 Relative Segment Encodings,對於每一個 attention head 都添加 3 個可訓練的向量 s+ , s- , b ,然後利用以下公式計算 attention score。
其中 q 就是 Query 向量,這個計算得到的 attention score 會加到原來的 attention score 上,再計算 softmax。Relative Segment Encodings 加上了一個偏置向量 b ,同時 Relative Segment Encodings 也可以用於一些超過兩段輸入句子的任務上。
XLNet 的核心思想是 PLM,排列原來的句子,然後預測末尾的單詞。這樣可以學習到單詞之間的依賴關系,而且可以利用 token 前後向的信息。
XLNet PLM 的實現需要用到 Two-Stream Self-Attention,包含兩個 Stream,Query Stream 用於預測,只包含當前位置的位置信息。而 Content Stream 保存了 token 的內容。
XLNet 還使用了 Transformer-XL 的優化方式。
XLNet: Generalized Autoregressive Pretraining for Language Understanding
⑸ csrf_token的了解
django中寫form表單時csrf_token的作用: https://blog.csdn.net/up1012/article/details/81032368
Django下的CSRF預防機制
https://www.cnblogs.com/freely/p/6928822.html
CSRF預防機制
CSRF的防禦可以從服務端和客戶端兩方面著手,防禦效果是從服務端著手效果比較好,現在一般的CSRF防禦也都在服務端進行。
token防禦的整體思路是:
第一步:後端隨機產生一個token,把這個token保存在SESSION狀態中;同時,後端把這個token交給前端頁面;
第二步:下次前端需要發起請求(比如發帖)的時候把這個token加入到請求數據或者頭信息中,一起傳給後端;
第三步:後端校驗前端請求帶過來的token和SESSION里的token是否一致;
1、Django下的CSRF預防機制
django 第一次響應來自某個客戶端的請求時,會在伺服器端隨機生成一個 token,把這個 token 放在 cookie 里。然後每次 POST 請求都會帶上這個 token,
這樣就能避免被 CSRF 攻擊。
在 templete 中, 為每個 POST form 增加一個 {% csrf_token %} tag. 如下:
在返回的 HTTP 響應的 cookie 里,django 會為你添加一個 csrftoken 欄位,其值為一個自動生成的 token
在所有的 POST 表單模板中,加一個{% csrf_token %} 標簽,它的功能其實是給form增加一個隱藏的input標簽,如下
,而這個csrf_token = cookie.csrftoken,在渲染模板時context中有context['csrf_token'] = request.COOKIES['csrftoken']
在通過表單發送POST到伺服器時,表單中包含了上面隱藏了crsrmiddlewaretoken這個input項,服務端收到後,django 會驗證這個請求的 cookie 里的 csrftoken 欄位的值和提交的表單里的 csrfmiddlewaretoken 欄位的值是否一樣。如果一樣,則表明這是一個合法的請求,否則,這個請求可能是來自於別人的 csrf 攻擊,返回 403 Forbidden.
在通過 ajax 發送POST請求到伺服器時,要求增加一個x-csrftoken header,其值為 cookie 里的 csrftoken 的值,服務湍收到後,django會驗證這個請求的cookie里的csrftoken欄位與ajax post消息頭中的x-csrftoken header是否相同,如果相同,則表明是一個合法的請求
具體實現方法
django為用戶實現防止跨站請求偽造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求偽造功能有分為全局和局部。
全局:
中間件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,為當前函數強制設置防跨站請求偽造功能,即便settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求偽造功能,即便settings中設置了全局中間件。
註:from django.views.decorators.csrf import csrf_exempt,csrf_protect
1、原理
在客戶端頁面上添加csrftoken, 伺服器端進行驗證,伺服器端驗證的工作通過'django.middleware.csrf.CsrfViewMiddleware'這個中間層來完成。在django當中防禦csrf攻擊的方式有兩種:
1.在表單當中附加csrftoken
2.通過request請求中添加X-CSRFToken請求頭。
注意:Django默認對所有的POST請求都進行csrftoken驗證,若驗證失敗則403錯誤侍候。
Django 設置 cookie 中的 csrftoken
http://www.mamicode.com/info-detail-2062660.html
VUE向django發送post返回403:CSRF Failed: CSRF token missing or incorrect解決方案:
https://blog.csdn.net/LoHiauFung/article/details/80792334
http://www.cnblogs.com/wangwei916797941/p/9283776.html
⑹ CSRF攻擊簡介
CSRF(Cross Site Request Forgery),中文翻譯為跨站請求欺騙攻擊,是一種利用了瀏覽器漏洞的一種攻擊手段,常被黑客用作刷介面的手段。
Cookie是保存在瀏覽器本地的一些數據,通常伺服器會將和用戶有關的數據,如登錄token存放在Cookie中。瀏覽器有一套對Cookie的保護措施,比如Cookie按域(domain)存儲,Cookie在別的域下是不可見的。
瀏覽器中的Cookie按照域(Domain)存儲,不同域下的Cookie彼此不可見。但是從別的域下發來的請求卻能帶上這個域的Cookie。帶上Cookie是好事,但不可避免的產生一些壞結果,因為Cookie中往往存儲了用戶的登錄token,這使得來自別的域的請求自動處於登錄狀態,這意味著別的域的請求能模擬用戶做出任何事情,比如批量發帖,批量刪帖等。
小明是某某社區的用戶
雖然跨域請求能帶上Cookie,但請求前卻無法看到Cookie中的內容,那麼我們只要在Cookie中加上一個欄位(X-CSRF-TOKEN)並在別的地方如Header中加上一個一模一樣的欄位,在伺服器收到請求時校驗這兩個欄位是否一致,便能防禦CSRF攻擊。
生成X-CSRF-TOKEN有兩種策略:
1.在登錄時由伺服器下發給Cookie。
2.前端通過隨機數生成,當發送請求時,發現Cookie中沒有X-CSRF-TOKEN欄位,便給Cookie加上該欄位。
實踐時我採用了前端隨機生成Token的方法,實現過程中也遇到了一些問題。
1.如何生產Token
通過隨機數生成的Token實際上就是時間戳。這種隨機數是可以被碰撞攻擊的。比如用戶生成了Token就被CSRF,那CSRF中攜帶的Token完全可能與我們生成的Token一致。解決方法是通過伺服器下發的登錄Token+時間戳做一個md5作為X-CSRF-TOKEN。
但這由帶來了另一個問題,像登錄Token這種重要的數據應該設置為http only,即js不可見,這樣才能避免另外一些攻擊,因此最好的辦法實際是採用伺服器下發Token的方式。
2.token放在header中還是放在body里
將Token放在Header中當然是最好的,但在實踐中,使用自定義的Header會帶來一些跨域的問題。瀏覽器在遇到跨域並且請求中有自定義Header時,首先它會向伺服器發送一個Options請求來獲取伺服器的跨域策略,即response中的那幾個header:
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Credentials
Access-Control-Allow-Headers
因此在服務端我們要在Access-Control-Allow-Methods中加上Options,在Access-Control-Allow-Headers中加上X-CSRF-TOKEN。
然而這還不夠,發送Options請求很有可能會失敗,如果你有nginx的話。nginx可能會直接將Options請求給攔下來,導致之後的請求無法執行。
⑺ 前後端分離項目——登錄Token校驗思路
對token的校驗分為前端和後端
前端: Vue-Cli 2.x + axios
後端:SpringBoot 2.3.4
這里的話,userToken和userId放到sessionStorage是關鍵步驟
後端主要是使用攔截器來進行請求的攔截和校驗
解釋一下思路:
這里的話,針對需要攔截的路徑和需要放行的路徑進行配置就行
關於redisTemple的引入這里就不再贅述。
到這里為止,前後端的token就都做完了,後面就再講講前端的一些其他思路吧
對於登錄狀態的判斷,前端可以在router.foreach上對路由進行狀態判定,從而實現頁面程度的攔截(具體可以參考最後的參考文章2)
在使用攔截器後,會發現前端部分請求會無法正常到達後端,網路後發現是因為 axios發送正式請求前會先發送一個嗅探請求 ,而嗅探請求是不攜帶我們封裝的header的,所以會導致部分請求會無法成功,解決的方式有很多種,這里的話是選擇了在後端去直接處理
參考文章
1、SpringBoot加了攔截器後出現的跨域問題解析
https://blog.csdn.net/mrkorbin/article/details/104066979
2、Vue項目中實現用戶登錄及token驗證
https://www.cnblogs.com/web-record/p/9876916.html
⑻ java怎樣傳遞x auth token在頭信息中
簡單的就是把token放到session里,如果會話過期,token也就會過期
使用的時候只要判斷當前會話是否有效,token是否與客戶端傳過來的token等就可以了
⑼ vue中怎樣添加自定義請求頭x-auth-token
axios.create({
baseURL:"https://some-domain.com/api/",
timeout:1000,
headers:{'x-auth-token':'Yourtoken'}
});