学习路之PHP–TP开发接口:接口安全设计

  • Post author:
  • Post category:php




设计思想:以登陆接口为例



登陆安全接口设计

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)
/**
 * 参数加密:如密码:用户名
 */
export function paramMd5(param=''){
	return md5('param_'+md5(String(param)));
}

代码如下:



1.公共有common.php

<?php
 
namespace 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 传过来的 token
		if(!isset($arr['token'])||empty($arr['token'])) {
			$this ->return_msg(400,'token 不能为空');
		}
		// api 请求端的token 
		$app_token = $arr['token'];   //api 传过来的token
		// 服务器端生成的 token  :先从参数中剔除token
		unset($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

<?php
 
namespace 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方法。。。。";
	}
}

另可参考文章

  1. https://www.jianshu.com/p/910198caf06f
  2. https://blog.csdn.net/TL_ATC/article/details/113092201
  3. https://blog.csdn.net/yifan_lion/article/details/105180779