(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接口怎么保证安全性的详细内容。
