设计思想:以登陆接口为例
登陆安全接口设计
1.username = red_panda
2.password = 123456
3.时间戳 timestamp = 17988732
token = md5(api_md5(red_panda) + md5(123456) + md5(timestamp)_api);
service_token = md5(api_md5(red_panda) + md5(123456) + md5(timestamp)_api);
两个比较,如果不等。说明数据被篡改
问题:
1.防止大量访问 采用时间戳,time
2.防止修改数据 比对token
3.窃取信息 比如加密密码,自身加了md5,再接后缀pwd,再md5加密 md5(md5(123456)_pwd);
password = md5(md5(123456)_pwd)
代码如下:
1.共有common.php
<?phpnamespace app\api\controller;use think\Request;
use think\Controller;class Common extends Controller
{protected $request; //用来处理参数protected function _initialize(){parent::_initialize();$this -> request = Request::instance();// 判断传过来的时间戳是否超时$this -> check_time($this->request->only(['time']));// 验证token$p = $this->request->param();$this -> check_token($this->request->param());}/*** [check_time 验证是否超时]* @param [array] $arr [包含时间戳的参数数组]* @return [json] [检测结果]*/public function check_time($arr){if (!isset($arr['time'])||intval($arr['time'])<=1 ) {$this->return_msg(400,'时间戳不正确');}if (time()-intval($arr['time'])>60) {$this->return_msg(400,'请求超时');}}/*** [check_token 验证token(防止数据被篡改)]* @param [array] $arr [全部请求参数]* @return [json] [token验证结果]*/public function check_token($arr){// api 传过来的 tokenif(!isset($arr['token'])||empty($arr['token'])) {$this ->return_msg(400,'token 不能为空');}// api 请求端的token $app_token = $arr['token']; //api 传过来的token// 服务器端生成的 token :先从参数中剔除tokenunset($arr['token']);$service_token = '';foreach ($arr as $key => $value) {$service_token .= md5($value);}$service_token = md5('api_' . $service_token . '_api'); //服务端生成的token// dump($service_token);// 对比token,返回结果if ($app_token !== $service_token) {$this -> return_msg(400,'token不正确');}}/*** [return_msg api数据返回]* @param [int] $code [结果码 200:正常 / 4**:数据问题 5**:服务器问题]* @param string $msg [接口要返回的]* @param [array] $data [接口要返回的数据]* @return [string] [最终的json数据]*/public function return_msg($code,$msg='',$data=[]){/******** 组合数据 ********/$return_data['code'] = $code; $return_data['msg'] = $msg; $return_data['data'] = $data; /******** 返回信息并终止脚本 ********/echo json_encode($return_data);die;}
}
2.User.php 继承common.php
<?phpnamespace app\api\controller;use think\Controller;class User extends Common
{public function index(){echo "string.user/index..sssss<br/>";// dump($id);}public function login(){echo "user/login方法。。。。";}
}