介面的安全性主要圍繞在Token、Timestamp和Sign三個機制展開設計,確保介面的資料不會被竄改和重複呼叫,以下具體來看:
(1)Token授權機制:(Token是客戶端存取服務端的憑證)--使用者使用使用者名稱密碼登入後伺服器給客戶端回傳一個Token (通常是UUID),並將Token-UserId以鍵值對的形式存放在快取伺服器中。服務端接收到請求後進行Token驗證,如果Token不存在,表示請求無效。 (推薦學習:PHP程式設計從入門到精通)
(2)時間戳逾時機制:(簽章機制保證了資料不會被竄改)使用者每次請求都帶著目前時間的時間戳timestamp,服務端接收到timestamp後跟當前時間進行比對,如果時間差大於一定時間(例如5分鐘),則認為該請求失效。時間戳超時機制是防禦DOS攻擊的有效手段。
(3)簽章機制:將 Token 與 時間戳 加上其他請求參數再用MD5或SHA-1演算法(可視情況加點鹽分)加密,加密後的資料就是本次請求的簽名sign,服務端接收到請求後以相同的演算法得到簽名,並跟當前的簽名進行比對,如果不一樣,說明參數被更改過,直接返回錯誤標識。
/** * @desc 接受参数处理 */ private function dealParam(){ //接受header参数--系统参数 $systemParam=getAllHeadersParam(); //接受body数据--业务参数(json格式) $data=file_get_contents('php://input'); //读取配置文件中的私钥信息 $api_apiKey=C('api_apiKey'); $privatekey=$api_apiKey[$systemParam['token']]; $arr['token'] =$systemParam['token']; //服务端分配的标识(不同客户端需使用不同的标识) $arr['timestamp']=$systemParam['timestamp']; //时间戳,UTC时间,以北京时间东八区(+8)为准 $arr['version'] =$systemParam['version']; //版本号 $arr['sign'] =$systemParam['sign']; //签名 $arr['source'] =$systemParam['source']; //来源(0-安卓/1-IOS/2-H5/3-PC/4-php/5-java) $arr['data'] =json_decode($data,true); //业务参数json格式 $arr['method'] =$data['method']; //访问接口,格式:模型名.方法名 return $arr; }
/* * @desc 获取所有以HTTP开头的header参数 * @return array */ private function getAllHeadersParam(){ $headers = array(); foreach($_SERVER as $key=>$value){ if(substr($key, 0, 5)==='HTTP_'){ $key = substr($key, 5); $key = str_replace('_', ' ', $key); $key = str_replace(' ', '-', $key); $key = strtolower($key); $headers[$key] = $value; } } return $headers; }
/* * @desc 签名校验 * @param $token string 服务端分配的标识(不同客户端需使用不同的标识) * @param $timestamp string 时间戳,UTC时间,以北京时间东八区(+8)为准 * @param $version string 版本号 * @param $sign string 签名 * @param $source int 来源(0-安卓/1-IOS/2-H5/3-PC/4-php/5-java) * @param $privatekey string 私钥 * @param $data 业务参数json格式 * @return bool */ private function checkAuth($token,$timestamp,$version,$sign,$source,$privatekey,$data){ //参数判断 if(empty($token)){ E('token不能为空!'); } if(empty($timestamp)){ E('时间戳不能为空!'); } if(empty($version)){ E('版本号不能为空!'); } if(empty($data)){ E('业务参数不能为空!'); } if(empty($source) && $source<>'0'){ E('来源不能为空!'); } if(empty($sign)){ E('签名不能为空!'); } if(empty($privatekey)){ E('私钥不能为空!'); } //时间校验 $expire_second=C('expire_second',null,10); $timestamp_t=$timestamp+$expire_second; if($timestamp_t<time()){ E('请求已经过期!'); } $public= D('public'); $datas=$this->original; //系统参数 $paramArr=array( 'token'=>$token, 'timestamp'=>$timestamp, 'version'=>$version, 'source'=>$source, 'data'=>$data, ); //按规则拼接为字符串 $str = $this->createSign($paramArr,$this->privatekey); if($str != $this->sign){ E('验签错误!'); } return true; }
以上是php接口怎麼保證安全性的詳細內容。更多資訊請關注PHP中文網其他相關文章!