什麼是csrf
瀏覽器在傳送請求的時候,會自動帶上當前網域名稱對應的cookie內容,傳送給服務端,不管這個請求是**a**還是其它**,只要請求的是a**的鏈結,就會帶上a**的cookie。瀏覽器的同源策略並不能阻止csrf攻擊,因為瀏覽器不會停止js傳送請求到服務端,只是在必要的時候攔截了響應的內容。或者說瀏覽器收到響應之前它不知道該不該拒絕。
攻擊過程
使用者登陸a**後,攻擊者自己開發乙個b**,這個**會通過js請求a**,比如使用者點選了某個按鈕,就觸發了js的執行。
防止攻擊
攻擊者是利用cookie隨著http請求傳送的特性來攻擊。但攻擊者不知道 cookie裡面是什麼。
django中是在表單中加乙個隱藏的 csrfmiddlewaretoken,在提交表單的時候,會有 cookie 中的內容做比對,一致則認為正常,不一致則認為是攻擊。由於每個使用者的 token 不一樣,b**上的js**無法猜出內容,對比必然失敗,所以可以起到防範作用。
和上面的類似,但不使用 cookie,服務端的資料庫中儲存乙個 session_csrftoken,表單提交後,將表單中的 token 和 session 中的對比,如果不一致則是攻擊。
這個方法實施起來並不困難,但它更安全一些,因為**即使有 xss 攻擊,也不會有洩露token的問題。
django使用csrfviewmiddleware中介軟體進行csrf校驗,預設開啟防止csrf(跨站點請求偽造)攻擊,在post請求時,沒有攜帶csrf欄位,導致校驗失敗,報403錯誤。那麼我們如何解決這種403錯誤呢?
解決方法
1. 去掉專案的csrf驗證
注釋掉此段**即可,但是不推薦此方式,將導致我們的**完全無法防止csrf攻擊。
2. 前端表單中增加csrf資訊
一定要注意後端使用render而不要使用render_to_response進行渲染,這樣前端就會有csrf_token變數,前端cookies中也會出現csrftoken資料,然後在html中使用即可。這種方式只限制在form表單中使用,ajax請求不支援。
3. 指定請求去掉csrf校驗
可以只針對指定的路由去掉csrf校驗,這也分為兩種情況:
fbv:以函式實現路由處理
# 匯入,可以使此次請求忽略csrf校驗
from django.views.decorators.csrf import csrf_exempt
# 在處理函式加此裝飾器即可
cbv:以類實現路由處理
或者用下面的方式,把裝飾器放在類外面
from django.views import view
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators afozoshyimport method_decorator
@method_decorator(csrf_exempt, name='dispatch')
class indexview(view):
def get(self, request, *args, **k程式設計客棧wargs):
4. 為所有請求新增csrf校驗資料(推薦)
以上方式都有限制,適用範圍比較窄,我們需要一種可以一勞永逸的方式:讓所有請求都攜帶csrf資料。因為我們是使用django模板渲染前端頁面的,所以一般會先定義乙個base.html,其他頁面通過來引入使用,那麼在base.html中新增ajax的全域性鉤子,在請求時新增csrf資料即可。
首頁css/base.css'%}">
HTTP的幾種認證方式
基礎認證簡單的使用base64對密碼 使用者名稱進行加密,並將加密後的資訊放在header中,本質上還是明文傳輸使用者名稱 密碼等,基本流程 摘要認證使用隨機數 md5加密雜湊函式來對使用者名稱 密碼進行加密,在上述第二步時伺服器返回隨機字串nonnce,之後客戶端傳送摘要 md5 ha1 nonc...
CSRF認證的幾種方法
在使用django框架編寫網頁,使用ajax技術進行前後端資料互動的時候會遇到csrf cross site request forgery跨站請求偽造 問題,get請求不影響,post就需要csrf認證。在登陸表單中新增csrf方法 action method post type text nam...
個人實名認證的幾種方案
實名認證包含身份證實名認證,手機號實名認證,銀行卡實名認證,人臉實名認證等,根據不同業務需求可選擇相應的實名認證方式。雲市場實名認證api,認證方式示例 用友企業雲服務api,示例 採用純服務端接入無需移動端,純服務端接入 適用於接入方自行完成認證資料的採集,希望實人認證服務對這些資料進行校驗的場景...