以前因爲業務須要,涉及到一些爬蟲方面的工做, 發現一部分小衆產品在數據接口中存在安全性問題, 接口能夠被任意調用甚至能夠修改一部分數據(沒有一點安全措施啊)。爲了避免被‘祭天’。 因此就後臺接口安全結合本人工做中對其的理解進行記錄。後端
尤爲如今大部分項目都是先後端分離, 後臺接口安全更是重中之重。畢竟數據就是錢啊緩存
Token驗證是我在最開始作移動接口項目的時候用到的方式。安全
所謂Token驗證就是 當用戶使用帳號和密碼進行登陸操做後, 服務端給客戶端返回登陸後的Token, 並將Token和登陸用戶在緩存服務器中進行關聯(Redis
)並對其設置時限(通常爲30分鐘), 隨後客服端每次訪問都須要將Token傳到服務器端, 後臺對Token進行驗證, Token正確即經過驗證bash
關鍵代碼服務器
//驗證token
String token = request.getHeader("Token");
if(!jedisPoolService.exists(token))
throw new TokenException("token is invalid");
複製代碼
可是上述方式只能判斷當前Token是否存在, 可是若是存在的Token在作一些事情,就無法控制。(經過代碼長時間調用該接口)app
因此在Token驗證的基礎上加上了非法ip的判斷:前後端分離
IP黑名單:若是當前訪問的ip在一段時間內(1分鐘)訪問次數超過咱們限定的次數, 說明這個ip對應的訪問存在問題, 那麼禁止當前ip訪問並將該ip添加到黑名單中post
在訪問接口以前, 判斷ip是否ip黑名單中,若是在, 就禁止該ip訪問ui
關鍵代碼加密
//判斷ip
String ip = GlobalUtil.getIpAddr(request); //獲取當前IP
if(jedisPoolService.sismember(IP_BLOCK, ip)) {
throw new NoParamException("黑名單禁止訪問");
}
//判斷當前ip是否超過訪問次數
String key = IP_KEY.replace("{key}", ip);
int count = StringUtil.toInteger(jedisPoolService.get(key) != null ? jedisPoolService.get(key) : 0);
if(count > MAX_COUNT) {
jedisPoolService.putSet(IP_BLOCK, ip);
throw new NoParamException("超過訪問次數");
}
jedisPoolService.incrAtTime(key, MAX_COUNT);
複製代碼
在接觸到不少第三方支付後,就嘗試將本身的接口項目進行升級
在Token驗證的基礎上, 加上timestamp時間戳和sign簽名。 約定timestamp時間戳和當前時間超過規定的範圍(如:1分鐘) 即判斷當前訪問的接口有誤。
關於sign簽名操做
關鍵代碼
//時間戳
Object o = objectMap.get("timestamp");
if(o == null)
throw new NoParamException("參數timestamp爲空");
Long timestamp = StringUtil.toLong(o);
if (LocalDateUtils.nowTime().getTime() - timestamp >= 1 * 60 * 1000)
throw new NoParamException("timestamp已過時");
//sign
private String getSign2Map(Map<String, Object> map) {
StringBuffer sb = new StringBuffer();
ArrayList<String> list = new ArrayList<String>(map.keySet());
Collections.sort(list);
for (String key : list) {
Object value = map.get(key);
if (!key.equalsIgnoreCase("sign"))
sb.append(key).append("=").append(map.get(key)).append("&");
}
sb.deleteCharAt(sb.length() - 1);
return DigestUtil.getInstance().md5(sb.toString());
}
複製代碼
HTTPS: 基於HTTP協議,經過SSL或TLS提供加密處理數據、驗證對方身份以及數據完整性保護
Https的成本略高, SSL證書須要購買申請,功能越強大的證書費用越高
上述方式能很大程度的保證接口安全,可是也不是必定安全 (無聊的人呢仍是不少的)。-_-~~
理論不等於實戰,實際開發中仍是有不少細節的東西須要完善。 下一節來具體實現下上述的方式