摘要:總結(jié)一下數(shù)據(jù)保護的技術(shù)點參數(shù)傳輸使用密文,可以使用對稱加密非對稱加密或者兩者的結(jié)合,比如請求就是屬于兩者結(jié)合的方式。安全性一些常用的安全問題都要考慮到,并且在項目框架底層進行防范,例如攻擊注入問題單用戶或者單的訪問頻率控制來進行防攻擊。
App所有數(shù)據(jù)都來源于服務(wù)器,App和服務(wù)器交互普遍是采用http請求接口的方式,那么在搭建和維護一個后端Api項目時候需要注意哪些問題呢?
1. 數(shù)據(jù)保護數(shù)據(jù)保護做的好不好,有兩個原則來驗證:
第一,可以控制讓誰來讀取數(shù)據(jù),
對于任何一個Api項目其實就是只允許產(chǎn)品App本身訪問,這就需要用密文傳輸請求數(shù)據(jù),做到即使被人用抓包工具抓到請求數(shù)據(jù)也沒有辦法解析出參數(shù)的意義。
把安全做到更近一步,可以在加密之前引入timestamp參數(shù),在服務(wù)端通過比較timestamp和當前時間戳可以做到對于抓取到的鏈接也不能重復(fù)調(diào)用。
密文的安全性取決于參數(shù)的加密方式,使用對稱加密、非對稱加密或者兩者結(jié)合取決于團隊自己的選擇,當然如果接口域名已經(jīng)配了證書支持https,就不用自己寫代碼來做這些事情了。
如果密文傳輸已經(jīng)做到絕對安全不可破解,那就安全了嗎?當然不是,你要相信安全永遠是相對的。試想一下如果App源碼被反編譯成功,那他就可以按照代碼邏輯去拼出正常的請求?另外一般業(yè)務(wù)除了有app之外也會有使用相同接口的h5版,任意一個開發(fā)者通過瀏覽器的調(diào)試模式很容易能分析出請求的Url以及相關(guān)參數(shù)。對于這兩種情況怎么辦呢?
第二,對于可以獲取數(shù)據(jù)的端,也可以控制其可以獲取哪些數(shù)據(jù)
既然客戶端不能做到完全可靠,那就讓服務(wù)端多承擔(dān)一些任務(wù),在app啟動時或者用戶登錄時服務(wù)端先向每個客戶端分發(fā)一個有固定有效期的secret,并且在服務(wù)端數(shù)據(jù)庫庫中存儲客戶端唯一標示或者uid和secret的對應(yīng)關(guān)系,之后每次客戶端調(diào)用都要用secret對于參數(shù)組合進行一次簽名,并且確保參數(shù)包含uid,服務(wù)端接收到請求后根據(jù)uid找出對應(yīng)的secret,然后按照和客戶端相同的簽名方式得出簽名,進而和客戶端傳過來的簽名進行比較。
因為secret是服務(wù)端分發(fā)的,即使破解了源碼,再即使從本地解析出了保存的secret,那也只能獲取這個secret對應(yīng)的數(shù)據(jù),再加上secret本身會有更新機制,這就使得通過破解接口來抓取大量數(shù)據(jù)變得大大的困難。
但是對于向第三方開放的api接口情況就不太一樣,它不存在密文傳輸?shù)膯栴},大體思路也是使用secret進行簽名認證,只是分發(fā)secret的方式不一樣,它是通過合作的方式,api提供商會給使用方分發(fā)一個key和一個secret,兩者可以當成一個鍵值對。調(diào)用方每次調(diào)用時用secret進行參數(shù)的簽名,參數(shù)包含key,服務(wù)端接收到請求,根據(jù)key參數(shù)取出secret,然后進行相同方式的簽名,并且和客戶端傳入的簽名進行對比來完成驗證。
總結(jié)一下數(shù)據(jù)保護的技術(shù)點:
參數(shù)傳輸使用密文,可以使用對稱加密、非對稱加密、或者兩者的結(jié)合,比如https請求就是屬于兩者結(jié)合的方式。
app端要盡量加大反編譯的難度,盡量保護源碼安全。
通過參數(shù)id=>secret的方式進行簽名來進行用戶身份認證,調(diào)用方保存自己的secret,服務(wù)端保存id和secret的對應(yīng)關(guān)系,secret用于簽名,后續(xù)的每次請求都要帶著id參數(shù)。
在第三步的基礎(chǔ)上,加上timestamp參數(shù)來防止連接重復(fù)調(diào)用。
2. 安全性一些常用的安全問題都要考慮到,并且在api項目框架底層進行防范,例如xss攻擊、sql注入問題、單用戶或者單ip的訪問頻率控制來進行防cc攻擊。
3. 舊版本兼容互聯(lián)網(wǎng)產(chǎn)品版本迭代很快,對于同一個功能新舊版本在參數(shù)或者返回值上會有差別。對于這種問題會有不同觀點的解決方案,一種方案是在url中加入版本信息,比如http://api.demo.com/v1/test , 每個版本對應(yīng)一個Action,具體的業(yè)務(wù)邏輯不要寫在Action層,要封裝到下面的邏輯層,這樣Action只需要在主業(yè)務(wù)的基礎(chǔ)上根據(jù)需求進行擴展。另外一種觀點是,這樣代碼重復(fù)度太高,會有大量的action文件,一個功能只提供一個唯一的url,但是要帶上一個表示版本的參數(shù),在代碼框架中只有一個action,對于新舊版本的細小差別可以使用參數(shù)默認值等兼容方式進行處理,對于比較大的改動就通過邏輯判斷語句進行不同處理即可。
另外比較重要的一點是,在設(shè)計之初要對業(yè)務(wù)進行足夠的抽象化,讓設(shè)計本身能盡量支持變化,比如以后此接口是否會增加某個分類屬性,返回結(jié)果的格式是否再多包裝一層就可以應(yīng)對萬一后面版本要增加另一塊數(shù)據(jù)。
當然不可能同時維護所有舊的版本,要做到可以檢測每個版本的使用情況,而且可以根據(jù)版本使客戶端強制升級。對于功能的修改,同時維護舊版本是一件特別麻煩的事情,甚至有些情況不得不強制升級所有版本。
總結(jié)一下就是:
要能區(qū)分不同版本,通過url或者參數(shù)
設(shè)計時候盡量考慮之后擴展,足夠抽象化
支持根據(jù)版本進行強制升級
4. 盡可能把所有業(yè)務(wù)邏輯都放到服務(wù)端很容易理解,服務(wù)端不用發(fā)版,服務(wù)端沒有處理不了的問題,很簡單一個例子:用戶登錄功能,會有"密碼錯誤","還沒有注冊"等各種異常情況的提示。那具體的文案是在客戶端定義,還是從服務(wù)端直接返回給客戶端比較好呢,顯然是后者。因為以后提示語內(nèi)容要做修改的話,放在服務(wù)端就可以很簡單進行處理,放在客戶端只能重新發(fā)版。
5. 返回字段可定制,可幫用戶節(jié)省流量A、B兩個功能都需要獲取用戶信息,兩者調(diào)用同一個接口,但是A只需要獲取用戶名和電話,就沒有必要把其它信息返回給A。
6. 格式統(tǒng)一,易讀uri統(tǒng)一化,不一定說非要用restful格式,但一定要有統(tǒng)一的規(guī)范。
響應(yīng)結(jié)果格式也統(tǒng)一,建議在最外層節(jié)點至少包含:code,msg,result,response_time等字段,具體的業(yè)務(wù)功能數(shù)據(jù)封裝在result中。
nginx公眾號也會推送好文,主要聊聊后端技術(shù),掃描或者搜索nginx即可添加。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/11355.html
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實踐的重點是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點學(xué)習(xí) JavaScript 作為一種獨立的語言,如...
摘要:組件監(jiān)聽自定義事件。組件觸發(fā)自定義事件。生命周期鉤子函數(shù),后組件的所有的事件監(jiān)聽器會被移除。技術(shù)點總結(jié)組件設(shè)計的思想包括單數(shù)據(jù)流事件中心,核心是組件通信。完善給彈出日期面板和關(guān)閉日期面板增加組件自定義事件即調(diào)用觸發(fā)和事件。預(yù)覽 組件庫官網(wǎng) github地址 如果喜歡各位小哥哥小姐姐給個小星星鼓勵一下哈, 請勿在生產(chǎn)環(huán)境中使用,供學(xué)習(xí)&交流~~ showImg(https://user...
摘要:導(dǎo)語本期采訪對象黃允松,青云創(chuàng)始人及。作為一個純粹的工具理性主義者,黃允松致力于打造優(yōu)良的工具,大幅降低的復(fù)雜性,讓一切變得更加平滑和簡單,這是他讓世界變得美好起來的方式。 showImg(http://segmentfault.com/img/bVbYfe);文:Gracia 攝影:周振邦(本文為原創(chuàng)內(nèi)容,部分或全文轉(zhuǎn)載均需經(jīng)過作者授權(quán),并保留完整的作者信息和技術(shù)人攻略介紹。) ...
摘要:第一部分介紹了如何使用和開發(fā)接口。由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。當您第一次得知有預(yù)處理器和后處理器時,你很有可能在任何地方已經(jīng)使用它們。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識。 我記得我剛開始學(xué)習(xí)前端開發(fā)的時候。我看到了很多文章及資料,被學(xué)習(xí)的資料壓得喘不過氣來,甚至不知道從哪里開始。 本指南列出前端學(xué)習(xí)路線,并提供了平時收藏的一些...
閱讀 2384·2021-11-11 16:54
閱讀 2640·2021-09-26 09:47
閱讀 3992·2021-09-08 09:36
閱讀 2743·2021-07-25 21:37
閱讀 934·2019-08-30 15:54
閱讀 2548·2019-08-30 14:22
閱讀 3257·2019-08-30 13:57
閱讀 2610·2019-08-29 17:17