(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接口怎样保证安全性的细致内容,更多请关注ki4网别的相干文章!