PHP API介面 安全篇

2021-10-19 22:46:07 字數 2759 閱讀 1476

一般的解決方案如下:

1、token授權認證,防止未授權使用者獲取資料;

2、時間戳超時機制;

3、url簽名,防止請求引數被篡改;

4、防重放,防止介面被第二次請求,防採集;

5、採用https通訊協議,防止資料明文傳輸;

一、token授權認證

http協議是無狀態的,一次請求結束,連線斷開,下次伺服器再收到請求,它就不知道這個請求是哪個使用者發過來的,但是對我們有許可權訪問限制的模組而言,它是需要有狀態管理的,以便服務端能夠準確的知道http請求是哪個使用者發起的,從而判斷他是否有許可權繼續這個請求。

token的設計方案是使用者在客戶端使用使用者名稱和密碼登入後,伺服器會給客戶端返回乙個token,並將token以鍵值對的形式存放在快取(一般是redis)中,後續客戶端對需要授權模組的所有操作都要帶上這個token,伺服器端接收到請求後進行token驗證,如果token存在,說明是授權的請求。

token生成的設計要求:

1、應用內一定要唯一,否則會出現授權混亂,a使用者看到了b使用者的資料;

2、每次生成的token一定要不一樣,防止被記錄,授權永久有效;

4、要設定token的過期時間,過期後需要客戶端重新登入,獲取新的token,如果token有效期設定較短,會反覆需要使用者登入,體驗比較差,我們一般採用token過期後,客戶端靜默登入的方式,當客戶端收到token過期後,客戶端用本地儲存的使用者名稱和密碼在後台靜默登入來獲取新的token,還有一種是單獨出乙個重新整理token的介面,但是一定要注意重新整理機制和安全問題;

根據上面的設計方案要求,我們很容易得到token=md5(使用者id+登入的時間戳+伺服器端秘鑰)這種方式來獲得token,因為使用者id是應用內唯一的,登入的時間戳保證每次登入的時候都不一樣,伺服器端秘鑰是配置在伺服器端參與加密的字串(即:鹽),目的是提高token加密的破解難度,注意一定不要洩漏;

二、時間戳超時機制

客戶端每次請求介面都帶上當前時間的時間戳timestamp,服務端接收到timestamp後跟當前時間進行比對,如果時間差大於一定時間(比如:1分鐘),則認為該請求失效。時間戳超時機制是防禦dos攻擊的有效手段。

例:http://url/getinfo?id=1&timetamp=1559396263

三、url簽名

首先我們需要分配給客戶端乙個私鑰用於url簽名加密,一般的簽名演算法如下:

1、首先對通訊的引數按key進行字母排序放入陣列中(一般請求的介面位址也要參與排序和簽名,那麼需要額外新增url=http://url/getinfo這個引數);

2、對排序完的陣列鍵值對用&進行連線,形成用於加密的引數字串;

3、在加密的引數字串前面或者後面加上私鑰,然後用md5進行加密,得到sign,然後隨著請求介面一起傳給伺服器。

例如:http://url/getinfo?id=1&timetamp=1559396263&sign=e10adc3949ba59abbe56e057f20f883e

伺服器端接收到請求後,用同樣的演算法獲得伺服器的sign,對比客戶端的sign是否一致,如果一致請求有效;

四、防重放

客戶端第一次訪問時,將簽名sign存放到伺服器的redis中,超時時間設定為跟時間戳的超時時間一致,二者時間一致可以保證無論在timestamp限定時間內還是外 url都只能訪問一次,如果被非法者截獲,使用同乙個url再次訪問,如果發現快取伺服器中已經存在了本次簽名,則拒絕服務。如果在快取中的簽名失效的情況下,有人使用同乙個url再次訪問,則會被時間戳超時機制攔截,這就是為什麼要求sign的超時時間要設定為跟時間戳的超時時間一致。拒絕重複呼叫機制確保url被別人截獲了也無法使用(如抓取資料)。

以上方案流程如下:

1、客戶端通過使用者名稱密碼登入伺服器並獲取token;

2、客戶端生成時間戳timestamp,並將timestamp作為其中乙個引數;

3、客戶端將所有的引數,包括token和timestamp按照自己的簽名演算法進行排序加密得到簽名sign

4、將token、timestamp和sign作為請求時必須攜帶的引數加在每個請求的url後邊

例:http://url/request?token=h40adc3949bafjhbbe56e027f20f583a&timetamp=1559396263&sign=e10adc3949ba59abbe56e057f20f883e

5、服務端對token、timestamp和sign進行驗證,只有在token有效、timestamp未超時、快取伺服器中不存在sign三種情況同時滿足,本次請求才有效;

五、採用https通訊協議

眾所周知http協議是以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者擷取了客戶端和伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此http協議不適合傳輸一些敏感資訊,比如信用卡號、密碼等。

為了解決http協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議https,為了資料傳輸的安全,https在http的基礎上加入了ssl協議,ssl依靠證書來驗證伺服器的身份,並為客戶端和伺服器之間的通訊加密。

https也不是絕對安全的,如下圖所示為中間人劫持攻擊,中間人可以獲取到客戶端與伺服器之間所有的通訊內容。

中間人擷取客戶端傳送給伺服器的請求,然後偽裝成客戶端與伺服器進行通訊;將伺服器返回給客戶端的內容傳送給客戶端,偽裝成伺服器與客戶端進行通訊。

通過這樣的手段,便可以獲取客戶端和伺服器之間通訊的所有內容。

使用中間人攻擊手段,必須要讓客戶端信任中間人的證書,如果客戶端不信任,則這種攻擊手段也無法發揮作用。

php api介面安全設計 sign

一.url請求的引數包括 timestamp,token,username,sign 1.timestamp 時間戮2.token 登陸驗證時,驗證成功後,生成唯一的token 可以為uuid 並把token儲存到快取 redis 裡 鍵為username,值為token 3.username 使用...

php API介面入門

1.簡述 api介面開發,其實和平時開發邏輯差不多 但是也有略微差異 平時使用mvc開發 的思路一般是都 由控制器 去 呼叫模型,模型返回資料,再由控制器把資料放到檢視中,展現給使用者 api開發是 使用控制器 去呼叫模型,模型返回資料,在有控制器 輸出 json格式字串 或者 xml 字串 2.邏...

Google翻譯介面 PHP API

google翻譯php介面 官成文 2009 03 28 注意 如果翻譯文字為utf 8編碼,則要刪去mb convert encoding函式 class google api translator public url public text 翻譯文字 public out 翻譯輸出 funct...