常见的安全问题以及解决方案
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 , 用证书对数据进行加密, 即使数据被截取, 对黑客也没有意义