假如跨站偽造請求成功,怎麼保證 ajax 的資料安全性?
答主 bumfod 說的確實有道理。crsf
的成因在一定程度上確實是由於http有狀態的原因
(cookie維持狀態),並不是我之前所說的是http無狀態的原因
。
在此如果有人被誤導,我表示抱歉。
我們如果能驗證請求確實來是使用者確認(自願)發出的,而不是使用者誤導的情況下發出的,就能解決這個問題。
檢查referer標頭確實是一種方案,但是該標頭也有可能被篡改,而且瀏覽器的實現不一。
以restful服務為例。
我們假設有乙個資源books
我們現在要對books
資源進行post
動作(請求)。那如何保證該動作不會被csrf
。
通常的做法是
我們在請求 post 之前,要獲取到改對post
請求的token
。只要在post
請求時攜帶對應的 token 才可以 200, 否則 就是 403。 (token 的生成演算法多種多樣,主要看需求)
// 獲取 token
token = get_token(resource:'books')
// 請求
request(book).token(token).post()
傳統 form 表單提交,為了解決csrf
都會提供如下解決方案。
在開啟表單頁面的時候,會給表單生成乙個令牌(token),當表單提交的時候,就會根據令牌來驗證表單的合法性。
token 的演算法多種多樣,有依賴於session的,有依賴於請求指紋的,有依賴於ip的,還有依賴於cookie的 等等。具體看業務需求。大多數 web 框架的實現都是使用httponly cookie
,但是
restful服務框架都是依賴於請求指紋的。這些沒有什麼好壞之分。
請求指紋
: 乙個請求有很多指紋資訊,比如說請求的url和url中的資訊,('/books'),請求的ip,請求的ua,請求的標頭資訊,等等。請求指紋來計算token的話,可以保證無狀態特性。
依賴ip
: 對請求的客戶端 ip 值進行 hash 來作為 token;這樣是沒有狀態的。
依賴session
: 這種方法很適用於web**,就是當使用者登入後,對使用者的請求根據使用者的資訊生成 token 存放到 session 中。
例如:我們要修改系統至使用者的資訊。
/users
資源
在 post 之前我們需要先獲取 修改資源的 token。
請求 獲取 token
後端可以根據標頭中的authorization
, url 查詢字串中的 uid, scope, authorize。來生成access_token
比如使用 aes 堆成加密的base64字串。最後能夠再加點鹽。
(這裡標頭和查詢字串中都存在authorization
,可以自己取捨。)
返回 token
修改user的post請求
以上演示了如何組織乙個使用令牌來實現csrf的請求。
回到問題的開始 ajax 該怎麼做?
依然使用/user/1001
為例,我們使用指紋加密的方法生成token。
/access_token
為令牌資源
var $request = function(ajax_param1) ));
};}; var get_token = $request();
var create_book = function(book)).then(function(token)
})(book);
});} var book = ;
create_book(book).then(function(res));
將token放到url上還是放到標頭中,具體看開發者的喜好了。 如何保證資料安全性? 討論
1 是資料本身的安全。主要是指採用現代密碼演算法對資料進行主動保護,如資料保密 資料完整性 雙向強身份認證等 2 是資料防護的安全。主要是採用現代資訊儲存手段對資料進行主動防護,如通過磁碟陣列 資料備份 異地容災等手段保證資料的安全,資料安全是一種主動的包含措施,資料本身的安全必須基於可靠的加密演算...
java 如何保證介面的安全性
根據使用者名稱或者使用者id,結合使用者的ip或者裝置號,生成乙個token。在請求後台,後台獲取http的head中的token,校驗是否合法 和資料庫或者redis中記錄的是否一致,在登入或者初始化的時候,存入資料庫 redis 在使用base64方式的編碼後,token字串還是有20多位,有的...
測試人員如何保證業務安全性?
業務安全 某個平台上的業務是指該平台使用者在使用過程中涉及到的一系列流程,而業務安全就是保證這些流程按照預定的規則執行。下面先來看看常見的業務安全點 業務威脅 常見的業務安全點 由於網際網路企業的特性,其主要業務直接體現在其平台上。其中有不少通用的業務流程 a 註冊 b 登入 c 密碼找回 d 使用...