1. 程式人生 > >CSRF保護和驗證

CSRF保護和驗證

什麼是CSRF?
CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack“或者Session Riding,通常縮寫為CSRF或XSRF,是一種對網站的惡意攻擊。是一種依賴web瀏覽器的、被混淆過的代理人攻擊。
常見特性

  • 依靠使用者標識危害網站
  • 利用網站對使用者表識的信任
  • 欺騙使用者的瀏覽器傳送HTTP請求給目標站點
  • 可以通過IMG標籤會觸發一個GET請求,可以利用它來實現CSRF攻擊。

攻擊
CSRF通過第三方偽造表單資料,post到應用伺服器上。受害伺服器以為這些資料來自於自己的網站,於是大意中招。
1.使用者C開啟瀏覽器,訪問受信任網站A,輸入使用者名稱和密碼請求登入網站A;
2.在使用者資訊通過驗證後,網站A產生Cookie資訊並返回給瀏覽器,此時登入使用者網站A成功,可以正常傳送請求到網站A;
3.使用者未退出網站A之前,在同一瀏覽器中,開啟一個TAB頁訪問網站B;
4.網站B接收到使用者請求後,返回一些攻擊性的程式碼,併發送一個請求要求訪問第三方A;
5.瀏覽器在接收到這些攻擊程式碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie資訊,向網站A傳送請求。網站A並不知道該請求其實是B發起的,所以會根據使用者C的Cookie資訊以C的許可權處理該請求,導致來自網站B的惡意程式碼被執行。
這裡寫圖片描述


防禦
WTForms在渲染每個表單時生成一個獨一無二的token,這個token將在POST請求中隨表單資料一起傳遞,並且會在表單被接受之前進行驗證。關鍵在於token的值取決於儲存在使用者會話cookeis中的一個值,而且會在一定時間之後過時(預設30分鐘)。這樣只有登入了頁面的人才能提交一個有效的表單,而且僅僅是在登入頁面30分鐘之內才能這麼做。
如何使用CSRF防護?

  • 檢視函式中form.validate_on_submit( ),如果已經submits了,這個函式返回True並且用定義在forms.py中的驗證函式來驗證表單。如果一個表單已經提交併且通過驗證,我們可以開始處理登入邏輯的部分了。如果它還沒提交,需要傳遞這個表單物件給模板來進行渲染。
  • 模板中使用CSRF防護
{{ form.csrf_token }}

將渲染一個隱藏的包括防禦CSRF的特殊token域,而WTForms會在驗證表單時查詢這個域,所以我們不用擔心新增的任何特殊的驗證token正確性的邏輯。
金鑰驗證
需要應用程式去配置一個加密金鑰。Flask-WTF使用這個金鑰去生成加密令牌用於驗證請求表單的資料的真實性。

app=Flask(__name__)
app.config['SECRET_KEY']='westos'
  • app. config字典通常是框架、擴充套件或應用程式自身存放配置變數的地方,可以使用標準字典語法新增配置值到app.config中。配置物件提供方法從檔案或環境匯入配置值。
  • SECRET_KEY配置變數作為Flask和一些第三方擴充套件的通用加密金鑰。加密強度取決於這個變數的值。給你構建的每個應用程式選擇不同的金鑰,並確保這個字串不被其他任何人知道。