最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python?flask是如何預防CSRF攻擊

 更新時間:2024年04月01日 09:41:01   作者:景天科技苑  
CSRF(Cross-site?request?forgery)攻擊是一種常見的網(wǎng)絡安全漏洞,它可以通過欺騙用戶執(zhí)行惡意請求來攻擊?Web?應用程序,本篇文章將介紹python?flask是如何預防CSRF攻擊,需要的朋友可以參考下

CSRF攻擊防范

詳述CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

攻擊者通過HTTP請求將數(shù)據(jù)傳送到服務器,從而盜取回話的cookie。盜取會話cookie之后,攻擊者不僅可以獲取用戶的信息,還可以修改該cookie關(guān)聯(lián)的賬戶信息。

跨站請求攻擊,簡單地說,是攻擊者通過一些技術(shù)手段欺騙用戶的瀏覽器去訪問一個自己曾經(jīng)認證過的網(wǎng)站并運行一些操作(如發(fā)郵件,發(fā)消息,甚至財產(chǎn)操作如轉(zhuǎn)賬和購買商品)。由于瀏覽器曾經(jīng)認證過,所以被訪問的網(wǎng)站會認為是真正的用戶操作而去運行。這利用了web中用戶身份驗證的一個漏洞:簡單的身份驗證只能保證請求發(fā)自某個用戶的瀏覽器,卻不能保證請求本身是用戶自愿發(fā)出的。

CSRF防范方式一:

同源檢測

Cookie的同源和瀏覽器的同源策略有所區(qū)別:

瀏覽器同源策略:協(xié)議、域名和端口都相同即同源;

  • Cookie同源策略:域名相同即同源;
    在HTTP協(xié)議中,每個異步請求都會攜帶兩個header,用來標記來源域名:
  • Origin Header
  • Referer Header
    這兩個Header在瀏覽器發(fā)起請求時,大多數(shù)情況會自動帶上,并且不能由前端修改,服務器接收到后可以根據(jù)這兩個Header確定來源的域名;

特殊情況: 如果Origin和Referer都不存在,建議直接進行阻止,特別是如果您沒有使用隨機CSRF Token(參考下方)作為第二次檢查。

另外,CSRF大多數(shù)情況下來自第三方域名,但并不能排除本域發(fā)起。如果攻擊者有權(quán)限在本域發(fā)布評論(含鏈接、圖片等),那么它可以直接在本域發(fā)起攻擊,這種情況下同源策略無法達到防護的作用。

CSRF防范方式二:

添加校驗token

由于CSRF的本質(zhì)在于攻擊者欺騙用戶去訪問自己設置的地址,所以如果要求在訪問敏感數(shù)據(jù)請求時,要求用戶瀏覽器提供不保存在cookie中,并且攻擊者無法偽造的數(shù)據(jù)作為校驗,那么攻擊者就無法再運行CSRF攻擊。這種數(shù)據(jù)通常是窗體中的一個數(shù)據(jù)項。服務器將其生成并附加在窗體中,其內(nèi)容是一個偽隨機數(shù)。當客戶端通過窗體提交請求時,這個偽隨機數(shù)也一并提交上去以供校驗。正常的訪問時,客戶端瀏覽器能夠正確得到并傳回這個偽隨機數(shù),而通過CSRF傳來的欺騙性攻擊中,攻擊者無從事先得知這個偽隨機數(shù)的值,服務端就會因為校驗token的值為空或者錯誤,拒絕這個可疑請求

CSRF: 跨域請求偽造攻擊。flask預防CSRF攻擊需要下載包,flask_wtf。這個就是基于token校驗來防范CSRF攻擊的。

插件下載

pip install flask_wtf

flask_wtf本身提供了生成表單HTML頁面的功能(基于wtforms提供),常用于開發(fā)前后端不分離的表單頁面,同時Flask-wtf 擴展模塊還提供了一套完善的 csrf 防護體系,對于我們開發(fā)者來說,使用flask_wtf模塊就可以非常簡單解決CSRF攻擊問題。

工作流程

1 在表單響應的頁面中加入{% csrf_token %}標簽,那么在進行模板渲染是會生成如下標簽

<input type="hidden" name="csrfmiddlewaretoken" value="ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj">

2 并且在響應還有這個{% csrf_token %}標簽的頁面時,會添加cookie鍵值對,如下
csrftoken:lsMQeJgVbIKKxlfz6umgYM8WOWx1Njr77cHzM0L4xtXoApsnhFXXk1OGzwb1dd0G

3 當用戶從該頁面提交數(shù)據(jù)時,會攜帶csrfmiddlewaretoken:ppwN8yg1wVEyXDxtMpVIrc4zV3gHiDKKb9rwGPLaSGRc0HKhXAwpNrKjGDUHIxjj和cookie鍵值對

4 取出cookie中的csrftoken值和請求數(shù)據(jù)部分的csrfmiddlewaretoken的值,兩者進行比較,這個隨機字符串叫做token字符串.flask如果在請求數(shù)據(jù)部分找tokne值,如果這個鍵對應的值和cookie中csrftoken對應的值相同,也能通過認證.

具體配置

設置應用程序的 secret_key,用于加密生成的 csrf_token 的值

#1. session加密的時候已經(jīng)配置過了.如果沒有在配置項中設置,則如下:
app.secret_key = "#此處可以寫隨機字符串#"

#2. 也可以寫在配置類中。
class Config(object):
    DEBUG = True
    SECRET_KEY = "dsad32DASSLD*13%^32"
    
"""加載配置"""
app.config.from_object(Config)

導入 flask_wtf 中的 CSRFProtect類,進行初始化,并在初始化的時候關(guān)聯(lián) app

# 方式1:
from flask_wtf import CSRFProtect
csrf = CSRFProtect() # 這塊代碼可能在文件中。
app = Flask(import_name=__name__, template_folder="templates")
# 項目配置代碼之后
csrf.init_app(app) # 避免出現(xiàn)引用導包,所以提供了init_app的用法

# 方式2:
# from flask_wtf import CSRFProtect
# app = Flask(import_name=__name__, template_folder="templates")
# 項目配置代碼之后
# CSRFProtect(app)

完整視圖代碼

from flask import Flask, render_template

from flask_wtf import CSRFProtect
csrf = CSRFProtect() # 這塊代碼可能在文件中。
app = Flask(import_name=__name__, template_folder="templates")

# 項目配置代碼之后
csrf.init_app(app) # 將插件注冊到app中去


#設置應用程序的 secret_key,用于加密生成的 csrf_token 的值
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'


@app.route("/user")
def user():
    title = "用戶中心"
    html = render_template("index12.html", **locals())
    return html

@app.route("/transfer", methods=["post"])
def transfer():
    return "轉(zhuǎn)賬成功!"

if __name__ == '__main__':
    app.run(debug=True)

在表單中使用 CSRF 令牌

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <form action="http://127.0.0.1:5000/transfer" method="post">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    賬號:<input type="text" name="username"><br><br>
    密碼:<input type="text" name="password"><br><br>
    <input type="submit" value="轉(zhuǎn)賬">
  </form>
</body>
</html>

瀏覽器訪問/user頁面,表單里面會多一個隱藏的input標簽,

在這里插入圖片描述

當我們點擊轉(zhuǎn)賬時,form表單中只要添加了{%csrf_token%},頁面就會自動添加個隱藏的input標簽,每次請求得到的的value值都不相同

在這里插入圖片描述

只要手動改下這個隱藏的input里面的value值,再提交數(shù)據(jù)就會forbidden。這個值只有是后臺給的才能通過鑒權(quán)

在這里插入圖片描述

點擊轉(zhuǎn)賬,校驗失敗,數(shù)據(jù)提交不成功

在這里插入圖片描述

這樣,第三方請求在提交表單時,就算猜到csrf_token的變量名,也無法猜測到服務器傳來的值,所以,就可以防范csrf攻擊

總結(jié)

簡單總結(jié)一下本文flask中CSRF攻擊的防護策略:

自動防護策略:同源檢測(Origin和Referer驗證);

主動防護策略:token驗證以及配合SameSite設置;

為了更好的防御CSRF,最佳實踐應該是結(jié)合上面總結(jié)的防御措施方式中的優(yōu)缺點來綜合考慮,結(jié)合當前Web應用程序自身的情況做合適的選擇,才能更好的預防CSRF的發(fā)生。

以上就是詳解python flask是如何預防CSRF攻擊的詳細內(nèi)容,更多關(guān)于python flask預防CSRF攻擊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python?selenium?webdriver?基本使用代碼分享

    Python?selenium?webdriver?基本使用代碼分享

    這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下
    2022-11-11
  • 基于OpenCV的仿射變換實現(xiàn)方法

    基于OpenCV的仿射變換實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于基于OpenCV的仿射變換實現(xiàn)方法,仿射變換相當于將二維平面上的每個坐標點與一個2x3的矩陣相乘,得到新的坐標,而透視變換則是與3x3的矩陣相乘,需要的朋友可以參考下
    2024-01-01
  • python 利用PyAutoGUI快速構(gòu)建自動化操作腳本

    python 利用PyAutoGUI快速構(gòu)建自動化操作腳本

    我們經(jīng)常遇到需要進行大量重復操作的時候,比如:網(wǎng)頁上填表,對 web 版本 OA 進行操作,自動化測試或者給新系統(tǒng)首次添加數(shù)據(jù)等,今天就利用PyAutoGUI構(gòu)建自動化操作腳本完成這些重復的需求
    2021-05-05
  • 詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)和算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 詳解Python中的字符串常識

    詳解Python中的字符串常識

    這篇文章主要為大家介紹了Python中的字符串常識,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python 使用os.remove刪除文件夾時報錯的解決方法

    Python 使用os.remove刪除文件夾時報錯的解決方法

    下面小編就為大家?guī)硪黄狿ython 使用os.remove刪除文件夾時報錯的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • python3中pip3安裝出錯,找不到SSL的解決方式

    python3中pip3安裝出錯,找不到SSL的解決方式

    今天小編就為大家分享一篇python3中pip3安裝出錯,找不到SSL的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python Pandas list列表數(shù)據(jù)列拆分成多行的方法實現(xiàn)

    Python Pandas list列表數(shù)據(jù)列拆分成多行的方法實現(xiàn)

    這篇文章主要介紹了Python Pandas list(列表)數(shù)據(jù)列拆分成多行的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Python實現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例

    Python實現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例

    本文主要介紹了Python實現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • 如何在PyCharm中配置使用Anaconda環(huán)境

    如何在PyCharm中配置使用Anaconda環(huán)境

    這篇文章主要介紹了如何在PyCharm中配置使用Anaconda環(huán)境,圖文講解寫的非常詳細簡單易懂,還不會的小伙伴快來看看吧
    2023-03-03

最新評論

广宁县| 长宁区| 工布江达县| 延庆县| 宜兰市| 东平县| 河源市| 彭山县| 内丘县| 江津市| 陆良县| 西城区| 台安县| 罗源县| 紫阳县| 陵水| 鹤山市| 漯河市| 武川县| 荥经县| 凯里市| 商河县| 玉门市| 金沙县| 岳阳市| 铜川市| 普兰店市| 合水县| 晋中市| 赣榆县| 潞西市| 罗甸县| 贵德县| 宝鸡市| 屏山县| 渑池县| 益阳市| 依兰县| 阿瓦提县| 乐安县| 江阴市|