App開放介面api安全性的設計與實現

2022-11-24 22:37:04 字數 3284 閱讀 9162

那麼這就需要使用者提供一些資訊,比如使用者名稱密碼等,但是為了安全起見讓使用者暴露的明文密碼次數越少越好,我們一般在web專案中,大多數採用儲存的session中,

對於敏感的api介面,需使用https協議

https是在http超文字傳輸協議加入ssl層,它在網路間通訊是加密的,所以需要加密證書。https協議需要ca證書,一般需要交費。

使用者登入後向伺服器提供使用者認證資訊(如賬戶和密碼),伺服器認證完後給客戶端返回一個pid令牌,使用者再次獲取資訊時,

① 時間戳:timestamp

② pid令牌:pid(在這我們給定義為pid)

然後將所有使用者請求的引數(包括timestamp,pid),然後更具md5加密(可以加點鹽),生成動態的url。

然後登陸後每次呼叫使用者資訊時,帶上timestamp,pid引數。

加上時間戳和pid後的url:

就變成一個動態的而且相對的具有高安全的,保證資料安全的訪問。

1. api請求客戶端想伺服器端一次傳送用使用者認證資訊(使用者名稱和密碼),伺服器端請求到改請求後,驗證使用者資訊是否正確。

如果正確:則返回一個唯一不重複的字串,然後在redis(任意快取伺服器)中維護這個使用者資訊關係,以便其他api對pid的校驗。

如果錯誤:則返回錯誤碼。

2.伺服器設計一個url請求攔截規則

①判斷是否包含timestamp,pid引數,如果不含有返回錯誤碼。

②根據使用者請求的url引數,伺服器端按照同樣的規則生成動態的url,對比請求的動態url與服務端生成的是否相等,相等則放行允許訪問。

③判斷伺服器接到請求的時間和引數中的時間戳是否相差很長一段時間(時間自定義如十秒),如果超過則說明該url已經過期。

④記錄下每次請求的動態url,規定一個動態的url只能訪問一次,檢測每次請求的url是否請求過,去過存在就返回錯誤**(處理url被攔截並且在十秒內請求的訪問)。

⑤此url攔截只需對獲取身份認證的url放行(如登陸url),剩餘所有的url都需攔截。

3.定期處理儲存下來的動態請求url

服務端規定的規則

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import tornado.ioloop

import tornado.web

import hashlib

import time

access_record = # 建立第一次登入過url列表

pid_list = [ # pid列表

'qwe',

'ioui',

'234s',

]class mainhandler(tornado.web.requesthandler):

def get(self):

# 獲取url中全部資料

pid = self.get_argument('pid', none)

# 獲取變數

m5, client_time, i = pid.split('|') # 獲得資料,以“|”分割開

print(m5, client_time, i)

server_time = time.time() # 服務端的當前時間

# 時間超過10s禁止

if server_time > float(client_time) + 10: # 服務端的當前時間大於客戶端當前時間加10秒,表示過期不允許訪問

self.write('gun')

return

# 處理10s內容重複的請求

if pid in access_record: # 如果客戶端請求的動態url在第一次登入過的url列表中

self.write('gun')

return

pid = pid_list[int(i)] # 獲得客戶端發來的pid後面攜帶的數字

ramdom_str = "%s|%s" % (pid, client_time) # 把客戶的pid與當前時間戳拼接

h = hashlib.md5() # md5加密值

h.update(bytes(ramdom_str, encoding='utf-8')) # 把客戶的pid與當前時間戳拼接一個字串再盡心md5加密

server_m5 = h.hexdigest() # 服務端生成的動態url

# print(m5,server_m5)

if m5 == server_m5: # 客戶生成的與服務端生成的進行對比

self.write("hello, world")

else:

self.write('gun')

(r"/index", mainhandler),

])if __name__ == "__main__":

tornado.ioloop.ioloop.instance().start()

客戶端按規則生成符合的

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import time

import requests

import hashlib

pid = 'qwe' # 客戶的pid

current_time = time.time() # 當前時間戳

ramdom_str = "%s|%s" % (pid, current_time) # 把pid與當前時間戳拼接成一個字串

h = hashlib.md5() # md5加密

h.update(bytes(ramdom_str, encoding='utf-8')) # 把pid與當前時間戳拼接成一個字串再進行md5加密

uid = h.hexdigest() # 加密後的字串

q = "%s|%s|0" % (uid, current_time) # 在把這個字串後面拼接一個數值 0

url = '' % q # 生成最後生成的動態url

print(url)

ret = requests.get(url)

print(ret.text)

測試效果**

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

ret = requests.get('')

print(ret.text)

這是比較粗超的api認證機制,可以初步瞭解。

zhuan :