首页 >后端开发 >php教程 >PHP开发高可用高安全app后端学习笔记

PHP开发高可用高安全app后端学习笔记

不言
不言原创
2018-04-08 09:33:535207浏览

本篇文章给大家分享的是PHP开发高可用高安全app后端的学习笔记 ,有需要的朋友可以参考一下文章的内容

源码下载地址:https://download.csdn.net/download/qq_21683643/10331534
目录
1.安全性
2.授权码sign算法
3.登录场景access_user_token算法
4.token唯一性支持
5.API一次性请求支持
6.高可用
7.Restful API
8.web登录和APP登录异同处
9.阿里大于短信验证解决客户端APP复杂登录场景
10.API接口版本解决方案
11.APP本地时间和服务器时间一致解决方案
12.不可预知的API内部异常解决方案
13.APP版本升级方案
14.利用七牛云解决图片处理基础服务能力
15.基础类库的封装
16.PHP设计模式的穿透
17.部分模块提供多种解决方案最后选择最优的方案
18.PHP和ajax的异步数据交互

1、restful api
数据结构格式
3. HTTP状态码使用TK自带的json实现
3. status 业务状态码  
4. message 提示信息
5. data 数据层
通用化API接口数据封装

function show($status, $message, $data=[], $httpCode=200) {
    $data = [        'status' => $status,        'message' => $message,        'data' => $data,
    ];    return json($data, $httpCode);
}

不可预知的内部异常api数据输出解决方案
config配置exception_handle填写异常类路径

class ApiHandleException extends  Handle {
    /**
     * http 状态码
     * @var int
     */
    public $httpCode = 500;    public function render(\Exception $e) {
        // 还原正常报错,上线后为flase(服务端开发)
        if(config('app_debug') == true) {            return parent::render($e);
        }        if ($e instanceof ApiException) {            $this->httpCode = $e->httpCode;
        }        return  show(0, $e->getMessage(), [], $this->httpCode);
    }
}class ApiException extends Exception {
    public $message = '';    public $httpCode = 500;    public $code = 0;    /**
     * @param string $message
     * @param int $httpCode
     * @param int $code
     */
    public function __construct($message = '', $httpCode = 0, $code = 0) {
        $this->httpCode = $httpCode;        $this->message = $message;        $this->code = $code;
    }
}

2、APP-API数据安全解决方案
解决方式就是各种的加密:MD5 AES(对称加密) RSA(非对称,效率较低)
sign (有效时间,唯一性)

/**
     * 生成每次请求的sign
     * @param array $data
     * @return string
     */
    public static function setSign($data = []) {
        // 1 按字段排序
        ksort($data);        // 2拼接字符串数据  &
        $string = http_build_query($data);        // 3通过aes来加密
        $string = (new Aes())->encrypt($string);        return $string;
    }/**
     * 检查sign是否正常
     * @param array $data
     * @param $data
     * @return boolen
     */
    public static function checkSignPass($data) {
        $str = (new Aes())->decrypt($data['sign']);        if(empty($str)) {            return false;
        }        // diid=xx&app_type=3
        parse_str($str, $arr);        if(!is_array($arr) || empty($arr['did'])
            || $arr['did'] != $data['did']
        ) {            return false;
        }        // 有效时间:时间间隔不能超过60s
        if(!config('app_debug')) {            if ((time() - ceil($arr['time'] / 1000)) > config('app.app_sign_time')) {                return false;
            }            //echo Cache::get($data['sign']);exit;
            // 唯一性判定
            if (Cache::get($data['sign'])) {                return false;
            }
        }        return true;
    }/**
     * 检查每次app请求的数据是否合法
     */
    public function checkRequestAuth() {
        // 首先需要获取headers
        $headers = request()->header();        // todo

        // sign 加密需要 客户端工程师 , 解密:服务端工程师
        // 1 headers body 仿照sign 做参数的加解密
        // 2
        //  3

        // 基础参数校验
        if(empty($headers['sign'])) {            throw new ApiException('sign不存在', 400);
        }        if(!in_array($headers['app_type'], config('app.apptypes'))) {            throw new ApiException('app_type不合法', 400);
        }        // 需要sign
        if(!IAuth::checkSignPass($headers)) {            throw new ApiException('授权码sign失败', 401);
        }
        Cache::set($headers['sign'], 1, config('app.app_sign_cache_time'));        // 1、文件  2、mysql 3、redis
        $this->headers = $headers;
    }

APP和服务器端时间一致性解决方案
解决1:获取服务端时间,客户端拿到服务端正确时间进行对比。
解决2:初始化app时传输时间戳,客户端时间=服务端时间戳+差值
3、API接口文档编写(API入参,出参的格式)
API接口地址   请求方式   post入参格式   出参格式  http code
4、APP版本升级业务开发
表的设计
CREATE TABLE ent_version (
id int(10) unsigned NOT NULL,
app_type varchar(20) NOT NULL DEFAULT ” COMMENT ‘app类型 比如 ios android’,
version int(8) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘内部版本号’,
version_code varchar(20) NOT NULL DEFAULT ” COMMENT ‘外部版本号比如1.2.3’,
is_force tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否强制更新0不,1强制更新’,
apk_url varchar(255) NOT NULL DEFAULT ” COMMENT ‘apk最新地址’,
upgrade_point varchar(500) NOT NULL DEFAULT ” COMMENT ‘升级提示’,
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘状态’,
create_time int(10) unsigned NOT NULL DEFAULT ‘0’,
update_time int(10) unsigned NOT NULL DEFAULT ‘0’
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
5、登录开发
1.1APP登录业务开发介绍
一般app有两种状态:登录态和未登录态
为什么要做登录?挖掘用户、互动、交流
如何做APP登录?模仿其他App登录
其他登录方式:免密手机号验证码、账号密码
第三方登录方式:qq授权、微信授权、微博授权
1.2App登录表结构的设计
CREATE TABLE ent_user (
id int(10) unsigned NOT NULL COMMENT ‘主键’,
username varchar(20) NOT NULL DEFAULT ” COMMENT ‘用户名’,
password char(32) NOT NULL DEFAULT ” COMMENT ‘密码’,
phone varchar(11) NOT NULL DEFAULT ” COMMENT ‘手机号’,
token varchar(100) NOT NULL DEFAULT ” COMMENT ‘令牌’,
time_out int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘令牌失效时间’,
image varchar(200) NOT NULL DEFAULT ” COMMENT ‘头像’,
sex tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘性别0男 1女’,
signature varchar(200) NOT NULL DEFAULT ” COMMENT ‘个性签名’,
create_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘注册时间’,
update_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘登录时间’,
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘状态是否锁定’
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.3阿里大于云通信服务平台介绍
什么是阿里大于
阿里大于提供了包括短信、语音等个性化的服务
1.4发送短信验证码功能开发

1.5App登录token唯一性算法
App调用登录,服务端返回加密的token信息,每次app请求接口都需要带token
App生成唯一的token并加密:token=token+13位时间戳
1.6App按密码方式登录
用户名和密码都需要加密传输给服务端

6、APP端异常、性能监控及定位分析
APP端异常基本情况:
Crach  在使用App的过程中突然发生闪退现象
卡顿 出现画面的卡顿
Exception  程序出现的异常
ANR 出现提示无响应弹框(Android)
数据收集方案:
建立异常性能表,开发API接口
id  主键
app_type  app类型
version_code  版本号
Model       设备机型
Did          设备id
type         异常类型
Description    描述
Line          出错的行数
create_time   创建时间
成熟的解决方案:
使用第三方平台,app客户端接入sdk即可统计数据,如:友盟统计
7、APP消息推送服务解决方案
轮询法:APP定时向服务端发送http请求是否有消息
第三方平台:服务端->第三方平台->app

相关推荐:

整理的一些PHP开发安全问题

PHP开发Session原理以及使用详解


以上是PHP开发高可用高安全app后端学习笔记 的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn