API開發之介面安全(三)----sign有效時間
阿新 • • 發佈:2019-08-16
之前生成的sign和校驗sign我們已經完全掌握了、但是僅僅憑藉這樣的sign是無法滿足我們的需求的,如果一個黑客通過抓包抓到你的資料 他可以去修改你的header為這樣的 body為那樣的 也是可以通過sign校驗的 那麼我們怎麼解決呢 下面將詳細的 為大家解說
首先想到這樣的一個問題 我麼首先應當考慮到的就是sign的時效性問題 如果 我們的sign只有十秒的時間 那就算抓包 他也只能在這十秒裡使用 那麼有了這個想法之後 我們是否應當在 生成sign之前加入 time引數呢 這個time具體怎麼加入呢?
我們先建立一個 Time 類 來生成我們sign所需要的time
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/8/16 * Time: 10:20 */ namespace app\common\lib; /*** * 生成以時間戳拼接的13位字串 * Class Time * @package app\common\lib */ class Time { public static function get13TimeStamp(){ list($t1, $t2) = explode(' ', microtime()); ##*1000增加唯一性 避免重複 return $t2 . ceil($t1*1000); } }
建立好我們時間生成類之後 我們需要在 生成sign的時候加入 time 引數
'time' => Time::get13TimeStamp(),
然後生成sign
IAuth::setSign($data)
生成之後 我們就會獲得到 加入 time 引數之後 返回的 sign了
下來我們拿到這個sign之後進行校驗
我們需要修改下我們的校驗方法 checkSignPass 使time引數參與進來
新增判斷
##乘除1000增加唯一性 if((time() - ceil($arr['time']/1000)) > config('app.app_sign_time')){ return false; }
其中 config("app.app_sign_time") 是我在配置檔案中配置的
return [ 'aeskey' => 'asdasd4wq5646', #AES祕鑰 服務端必須和客戶端保持一致 'method' => 'AES-128-ECB', 'iv' => '', 'options' => '0', 'app_types' => [ 'ios', 'android', ], 'app_sign_time' => 60, ];
這樣 我們就成功的將時間加入到了 sign 中 但是 這樣的話 還是不能保證我們資料的 安全性 我們需要進一步的 是sign有更高一級的安全性(唯一性)才行 那麼怎麼做呢 下章我們繼續解刨