Maison  >  Article  >  développement back-end  >  Développement PHP de notes d'étude backend d'applications haute disponibilité et haute sécurité

Développement PHP de notes d'étude backend d'applications haute disponibilité et haute sécurité

不言
不言original
2018-04-08 09:33:535122parcourir

Cet article partage avec vous des notes d'étude sur le développement de backends d'applications à haute disponibilité et haute sécurité en PHP. Les amis dans le besoin peuvent se référer au contenu de l'article

Adresse de téléchargement du code source : https://. download.csdn .net/download/qq_21683643/10331534
Répertoire
1. Sécurité
2. Algorithme de signature du code d'autorisation
3. Le jeton est unique Support sexuel
5. Support de demande unique API
6. Haute disponibilité
7. API reposante
8. Similitudes et différences entre la connexion Web et la connexion APP
9. Alibaba Scénario de connexion complexe de l'application client de la solution de vérification SMS
10. Solution de version de l'interface API
11. Solution cohérente avec l'heure locale et l'heure du serveur
12. Solution d'exception interne imprévisible de l'API
13. 🎜>14. Utilisez Qiniu Cloud pour résoudre les capacités de base du service de traitement d'images
15. Encapsulation des bibliothèques de classes de base
16.Pénétration des modèles de conception PHP
17.
18. Interaction de données asynchrones entre PHP et ajax

1. API restful

Format de structure de données. 3. Le code d'état HTTP est implémenté à l'aide du propre json de TK
3. code de statut de l'entreprise
4. message d'invite
5. couche de données de données
Encapsulation des données de l'interface API universelle

Solution de sortie de données API d'exception interne imprévisible
function show($status, $message, $data=[], $httpCode=200) {
    $data = [        'status' => $status,        'message' => $message,        'data' => $data,
    ];    return json($data, $httpCode);
}
Configurez exception_handle pour remplir le chemin de classe d'exception


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. Solution de sécurité des données APP-API

La solution est un cryptage varié : MD5 AES (cryptage symétrique) RSA (asymétrique, faible efficacité) signe (heure de validité, unicité)

Solution pour la cohérence de l'heure côté application et serveur
/**
     * 生成每次请求的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;
    }
Solution 1 : obtenez l'heure côté serveur et le client obtient l'heure correcte du côté serveur à des fins de comparaison.

Solution 2 : Transmettre l'horodatage lors de l'initialisation de l'application, heure du client = horodatage du serveur + différence

3. Écriture du document de l'interface API (paramètre d'entrée API, format du paramètre de sortie)
Adresse de l'interface API Méthode de requête Format du paramètre d'entrée de publication Format du paramètre de sortie Code http
4. Développement commercial de mise à niveau de la version de l'application
Conception de la tableCRÉER UNE TABLE
(
ent_version int(10 ) unsigned NOT NULL,
id varchar(20) NOT NULL DEFAULT ” COMMENT 'type d'application tel que iOS Android',
app_type int(8) unsigned NOT NULL DEFAULT '0 ' COMMENT 'Version interne number',
version varchar(20) NOT NULL DEFAULT ” COMMENT 'Numéro de version externe tel que 1.2.3',
version_code tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Que ce soit forcer la mise à jour 0 non, 1 forcer la mise à jour',
is_force varchar(255) NON NULL PAR DÉFAUT ” COMMENTAIRE 'dernière adresse apk',
apk_url varchar(500) NON NULL PAR DÉFAUT ” COMMENTAIRE 'Invite de mise à niveau' ,
upgrade_point tinyint(1) NON NULL PAR DÉFAUT '0' COMMENTAIRE 'Statut',
status int(10) unsigned NON NULL PAR DÉFAUT '0',
create_time int (10) unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; update_time
5. Développement de connexion
1.1 Introduction au développement commercial de connexion d'application En général, les applications ont deux états : connecté et non connecté
Pourquoi devez-vous vous connecter ? Utilisateurs miniers, interagissant et communiquant
Comment se connecter à l'APP ? Imitez d'autres connexions à l'application
Autres méthodes de connexion : code de vérification du numéro de téléphone mobile sans mot de passe, mot de passe du compte
Méthodes de connexion tierces : autorisation QQ, autorisation WeChat, autorisation Weibo
1.2 Conception de la structure de la table de connexion de l'application
🎜> CREATE TABLE
(
ent_user int(10) unsigned NOT NULL COMMENT 'primary key',
id varchar(20) NOT NULL DEFAULT ” COMMENT 'username',
username char(32) NON NULL PAR DÉFAUT ” COMMENTAIRE 'Mot de passe',
password varchar(11) NON NULL PAR DÉFAUT ” COMMENTAIRE 'Numéro de téléphone portable',
phone varchar(100) NON NULL PAR DÉFAUT ” COMMENTAIRE 'jeton de commande',
token int(10) non signé NON NULL PAR DÉFAUT '0' COMMENTAIRE 'Délai d'expiration du jeton',
time_out varchar(200) NON NULL PAR DÉFAUT ” COMMENTAIRE 'avatar',
image tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Sexe 0 mâle 1 femelle',
sex varchar(200) NOT NULL DEFAULT ” COMMENT 'Signature personnelle',
signature int (10) non signé NON NULL PAR DÉFAUT '0' COMMENTAIRE 'Heure d'inscription',
create_time int(10) non signé NON NULL PAR DÉFAUT '0' COMMENTAIRE 'Heure de connexion',
update_time tinyint(1 ) NOT NULL DEFAULT '0' COMMENT 'Le statut est-il verrouillé'
) ENGINE=InnoDB DEFAULT CHARSET=utf8; status1.3 Introduction à la plateforme de services de communication Alibaba Cloud
Qu'est-ce qu'Alibaba
Alibaba fournit des services, notamment SMS , voix et autres services personnalisés
1.4 Développement de la fonction d'envoi de code de vérification SMS

1.5Algorithme d'unicité du jeton de connexion de l'application
L'application appelle la connexion, le serveur renvoie des informations de jeton cryptées, chaque fois que l'application demande l'interface, elle doit apporter le jeton
L'application génère un jeton unique et le crypte : jeton =jeton+horodatage 13 bits
1.6Connexion à l'application par mot de passe
Le nom d'utilisateur et le mot de passe doivent être cryptés et transmis au serveur

Anomalies côté application, surveillance des performances et positionnement. analyse
Situation de base des exceptions côté APP :
Crach Un crash soudain s'est produit lors de l'utilisation de l'App
Bégaiement et décalage d'écran
anomalie d'exception dans le programme
pop-up ANR boîte ne demandant aucune réponse (Android)
Plan de collecte de données :
Établir une table de performances d'exception et développer une interface API
id clé primaire
app_type type d'application
version_code numéro de version
Modèle d'appareil modèle
Est-ce que l'identifiant de l'appareil
type                                                                 en utilisant     utiliser  une plateforme tierce                              utiliser               utiliser             ‐                            pour Données statistiques, telles que : Umeng Statistics

7. Solution de service de transmission de messages APP

Sondage méthode : APP envoie régulièrement des requêtes http au serveur pour voir s'il y a un message
Plateforme tierce : Serveur->Plateforme tierce->app
Recommandations associées :

Quelques problèmes de sécurité de développement PHP compilés

PHP Explication détaillée des principes et de l'utilisation du développement de session

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn