2018年2月

接口安全设计

常见的安全问题以及解决方案

1 接口被大规模调用消耗系统资源,影响系统的正常访问,甚至系统瘫痪

  • 解决方案: 获取 timestamp (时间戳), 设置接口失效时间
***验证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, '请求超时!');
    }
}

2 接口数据被黑客篡改(伪造请求)

  • 解决方案: 对参数加密, 生成 token , 判断 token 是否正确
***验证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不能为空!');
    }
    $app_token = $arr['token']; // api传过来的token
 
    /*********** 服务器端生成token  ***********/
    unset($arr['token']);
    $service_token = '';
    foreach ($arr as $key => $value) {
        $service_token .= md5($value);
    }
    $service_token = md5('api_' . $service_token . '_api'); // 服务器端即时生成的token
 
    /*********** 对比token,返回结果  ***********/
    if ($app_token !== $service_token) {
        $this->return_msg(400, 'token值不正确!');
    }
}

3 数据被黑客截取

  • 解决方案: 使用 https , 用证书对数据进行加密, 即使数据被截取, 对黑客也没有意义