ホームページ  >  記事  >  バックエンド開発  >  高可用性と高セキュリティのアプリ バックエンドの PHP 開発学習メモ

高可用性と高セキュリティのアプリ バックエンドの PHP 開発学習メモ

不言
不言オリジナル
2018-04-08 09:33:535122ブラウズ

この記事では、PHP での高可用性と高セキュリティのアプリ バックエンドの開発に関する学習メモを共有します。必要な方は、記事の内容を参照してください。

ソース コードのダウンロード アドレス: https://download.csdn.net/ download/qq_21683643 /10331534
ディレクトリ
1. セキュリティ
2. 認証コード署名アルゴリズム
3. ログインシナリオ access_user_token アルゴリズム
4. トークンの一意性のサポート
5. API ワンタイムリクエストのサポート
6. 高可用性
7. Restful API
8. Web ログインと APP ログインの類似点と相違点
9. Alibaba SMS 検証は、複雑なクライアント APP ログイン シナリオを解決します
11. APP のローカル時間とサーバー時間の一貫性のあるソリューション
12. 予測できない API 内部例外解決策
13. APP バージョンのアップグレード計画
14. Qiniu Cloud を使用して基本的な画像処理サービス機能を解決する
16. いくつかのモジュールはさまざまな解決策を提供します。最適なソリューションを選択します
18. PHP と ajax 間の非同期データ対話


1. Restful API

データ構造形式 3. HTTPステータスコードはTK独自のjsonを使用して実装されます 3. ステータス ビジネスステータスコード
4.メッセージプロンプトメッセージ
5. データ データ レイヤー
ユニバーサル API インターフェイス データのカプセル化

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

予測できない内部例外 API データ出力ソリューション
例外クラス パスを埋めるための例外ハンドルの設定

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: アプリの初期化時にタイムスタンプを送信、クライアント時刻 = サーバーのタイムスタンプ + 差分


3. API インターフェースのドキュメントの記述 (API 入力パラメーター、出力パラメーターの形式)

API インターフェースのアドレス リクエストメソッド post 入力パラメーターの形式 出力パラメーターの形式 httpコード 4. APP バージョン アップグレード ビジネス開発

テーブル設計 CREATE TABLE ent_version (id int(10) unsigned NOT NULL,
app_type code> varchar(20) NOT NULL DEFAULT ” COMMENT 'ios android などのアプリの種類', <br><code>version int(8) unsigned NOT NULL DEFAULT '0' COMMENT '内部バージョン番号 ', 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 ‘登录时间’,
statusversion_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 'status'、
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 ログイン ビジネスの概要🎜 一般に、アプリにはログインと未ログインの 2 つの状態があります 🎜 なぜログインする必要があるのですか?ユーザーを発見し、交流し、コミュニケーションを図ります 🎜アプリにログインするにはどうすればよいですか?他のアプリのログインを模倣する🎜その他のログイン方法: パスワード不要の携帯電話番号認証コード、アカウントのパスワード🎜サードパーティのログイン方法: QQ 認証、WeChat 認証、Weibo 認証🎜1.2 アプリのログイン テーブル構造の設計🎜CREATE TABLE ent_user ( 🎜<code>id int(10) unsigned NOT NULL COMMENT '主キー', 🎜username varchar(20) NOT NULL DEFAULT ” COMMENT 'username', 🎜password char(32) NOT NULL DEFAULT ” COMMENT 'パスワード', 🎜phone varchar(11) NOT NULL DEFAULT ” COMMENT '携帯電話番号', 🎜token varchar(100) NOT NULL DEFAULT ” COMMENT 'トークン', 🎜<code>time_out int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'トークンの有効期限', 🎜image code> varchar(200) NOT NULL DEFAULT ” COMMENT 'avatar', 🎜<code>sex tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '性別 0 男性 1 女性', 🎜signature varchar(200) NOT NULL DEFAULT ” COMMENT '個人署名', 🎜<code>create_time int(10) unsigned NOT NULL DEFAULT '0' COMMENT '登録時刻', 🎜update_time code> int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'ログイン時間', 🎜<code>status tinyint(1) NOT NULL DEFAULT '0' COMMENT 'ステータスはロックされています' 🎜) ENGINE=InnoDB DEFAULT CHARSET=utf8; 🎜1.3 Alibaba Cloud コミュニケーションサービスプラットフォームの紹介 🎜Alibaba とは 🎜Alibaba は SMS、音声、その他のサービスを含むパーソナライズされたサービスを提供します 🎜1.4 SMS 認証コード送信機能の開発 🎜

1.5アプリログイントークンの一意性アルゴリズム
アプリはログインを呼び出し、サーバーは暗号化されたトークン情報を返します。アプリがインターフェースをリクエストするたびに、トークンを取得する必要があります
アプリは一意のトークンを生成し、暗号化します: token=token+13-digitタイムスタンプ
1.6App パスワードによるログイン
ユーザー名とパスワードの両方を暗号化してサーバーに送信する必要があります

6. APP 側の例外、パフォーマンスの監視と位置分析
APP 側の例外の基本的な状況:
Crachアプリ使用中に突然クラッシュが発生
画面にカクつきが発生
プログラムで例外異常が発生
ANR による応答なしのポップアップ ボックスが表示される (Android)
データ収集計画:
例外パフォーマンス テーブルの確立と API インターフェイスの開発
id 主キー
app_type アプリの種類
version_code バージョン番号
Model デバイスモデル
Did デバイス ID
type 例外タイプ
Description 説明
Line エラー行数
create_time 作成時間
成熟したソリューション:
サードパーティプラットフォームを使用し、アプリクライアントは、Umeng Statistics などの統計データの SDK にアクセスできます
7. APP メッセージ プッシュ サービス ソリューション ポーリング方法: アプリはメッセージがあるかどうかを確認するためにサーバーに定期的に http リクエストを送信します
サードパーティ プラットフォーム: サーバー -> サードパーティ プラットフォーム -> アプリ

関連する推奨事項:

PHP 開発のセキュリティ問題をいくつかまとめました

PHP セッション開発の原則と使用法の詳細な説明


以上が高可用性と高セキュリティのアプリ バックエンドの PHP 開発学習メモの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。