標準WebAPI基本維度保障安全開發規範總結

2021-09-13 02:49:10 字數 3183 閱讀 5796

乙個標準的api介面開發需要從以下幾個維度考慮保障其安全性:

在剛接觸介面開發時,可能腦子裡壓根就沒有這個介面呼叫安全性的原則,但常識性的經驗告訴我們,每乙個請求都應該有原則地保障安全性。

舉乙個簡單例子:例如這個介面   這個獲取使用者列表資訊的請求總不能在位址列一輸入就直接顯示資訊(雖然有點誇張,不至於阿貓阿狗的資訊這麼容易get吧),在寫webapi介面原則性的基本要求必須得保證資料的安全性和請求的有效性在這裡我就使用token+引數簽名+時間戳  這三個系統引數來**請求的有效性(即時100%請求有效,也不能說100%也安全了)。

引數名 

必選型別

作用token    

是string

呼叫方標識,保障其身份是來自本系統認證過的,有效識別使用者身份

sign    

否string

介面引數的key,value的記錄,防止引數值被篡改,防止偽裝請求

timestamp    

否int

時間戳,防止重放攻擊

1.token 如何生成?作用是什麼?

2.引數簽名如何生成?作用是什麼?

3.時間戳的作用是什麼?

看了這篇文章你就知道了。這三個系統引數是如何保證請求的有效性,一定程度上提高資料的安全性

1.token如何生成的?作用是什麼?

token生成:一般的api基本上主要分為兩種客戶端訪問api的token和需要使用者登入之後的token,這裡我就來說一下後者,(簡單通俗做法)使用者登入輸入使用者名稱、密碼,訪問api,驗證資料庫成功。這個時候可以產生token,失敗直接返回。問題又來了!

1.token生成的方式是什麼?2.token存在**?3.token如何驗證是否正確

在驗證資料成功之後可以獲取唯一使用者標識(使用者名稱也行),就以username:zhanglin為例吧,對這個標識進行加密(des,md5、其他的也行,關鍵資料必須得加密),這個加密之後的字串就可以做為乙個token了。

2.token每次請求都需要進行傳遞,推薦存在cookie,也可以持久化到客戶端。現在有這樣乙個api介面

這個encryptzhanglinstr就是登入成功後加密的username返回的給客戶端,客戶端用什麼儲存這裡就不多介紹了,只需要知道返回給客戶端乙個使用者訪問的token類即可,到了伺服器端方法驗證的時候再進行解密,獲取到字串zhanglin,然後將這個zhanglin與系統使用者(可採用快取資料庫、快取token的值)對比,如果對比存在,則說明有許可權去訪問api,反之非法的請求。

還是**來實現一下吧。**比較容易理解,就是為了把這個原理說清楚一點

[route("login")]

public bool login(string account, string pwd)

else

}

token的產生就是登陸之後根據使用者標識儲存在cookie裡,這樣在客戶端每次傳送請求的時候都會帶上token這個引數,如下:

}3.這樣就可以驗證token是否正確,一般都是用快取。

token的作用的就是判斷請求是否是系統使用者發出的,這樣能有效識別請求使用者的身份資訊

2..引數簽名如何生成?作用是什麼?

引數簽名sign:為了提高傳參過程中,防止引數被惡意修改,在請求介面的時候加上sign可以有效防止引數被篡改,那麼sign是如何起作用的呢?

看看它的生成方法就明白了

比如有這樣乙個介面http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signvalue

第一步:拼接引數字串,除去sign引數本身和為空值的p3,那麼剩下的就是字串type=zl&p1=value1&p2=value2,然後按引數名字元公升(降)序,得到字串

p1=value1&p2=value2&type=zl

第二步:然後做引數名和值的拼接,得到字串p1value1p2value2type=zl,注意編碼,不能出現這種" ,要轉碼後「後拼接

第三步:將字串進行des加密,假設p1value1p2value2type=zl進行des加密後的結果是abc123,最終得到的字串abc123就是引數sign的值signvalue

第四步:在介面中我們會接收到引數名sign的引數值abc123,然後解密得到字串p1value1p2value2type=zl,再與介面中引數拼接排序後進行比較,如果不一樣則說明引數的循序不一樣,引數的值就一定是被修改過了。

總結:1.介面的呼叫方和介面的提供方統一約定引數加密演算法

2.引數簽名就是對引數key ,value的乙個記錄。引數如果被修改肯定對不上引數簽名,就不會呼叫請求

3.時間戳的作用?

在api請求的介面,客戶端請求的發生時間便是時間戳,這個引數到了伺服器,與伺服器端時間對比,如果時間間隔較長則無效。

在asp.net mvc的開發webapi介面時,可以使用mvc的過濾器進行以上三個關鍵引數的攔截過濾。以下**是在.net core中實現的,方法還是一樣的,都是在進入方法前進行攔截,這是乙個登入的api。

返回api結果是乙個類apiresult.cs,序列化成json物件,該類包含兩個泛型方法請求成功的ok方法,請求失敗的error方法

public class myfilterattribute : microsoft.aspnetcore.mvc.filters.actionfilterattribute

catch (exception ex)

//var accountname = context.routedata.values["accountname"].tostring()

var expires_minute = (timespan - datetime.now.ticks) / 60000000000;

if (expires_minute> 10||expires_minute<-10)

var ok = ("account" + account + "password" + password).contains(signature);//todo 加密解密

if (ok == false)

base.onactionexecuting(context);

}}

Web API 基本認知

作用 就是使用 js 去操作 html 和瀏覽器 分類 dom 文件物件模型 bom 瀏覽器物件模型 概念 dom document object model 文件物件模型 是用來呈現以及與任意 html 或 xml文件互動的api dom document object model 是將整個 ht...

webapi的基本操作

自定義屬性 可以在使用dom操作元素的時候,可以給元素新增一些其原本沒有的屬性,來記錄一些資料 元素物件.屬性名 獲取屬性值 元素物件.getattribute 屬性名 獲取屬性值 區別 通過物件名點屬性名獲取到的是元素的屬性值,並且對css屬性以css形式返回。不能獲取到自定義屬性的值 通過get...

Web APi入門之基本操作(一)

最近學習了下webapi,webapi是restful風格,根據請求方式決定操作。以部落格的形式寫出來,加深印象以及方便以後檢視和複習。1 首先我們使用vs建立乙個空的webapi專案 2 新建實體以及控制器類 1 public class product 2 4 public string nam...