Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Entwicklung von Hochverfügbarkeits- und Hochsicherheits-App-Backend-Studiennotizen

PHP-Entwicklung von Hochverfügbarkeits- und Hochsicherheits-App-Backend-Studiennotizen

不言
不言Original
2018-04-08 09:33:535121Durchsuche

In diesem Artikel erhalten Sie Studienhinweise zur Entwicklung von Hochverfügbarkeits- und Hochsicherheits-App-Backends in PHP. Freunde in Not können sich auf den Inhalt des Artikels beziehen

Download-Adresse des Quellcodes: https://. download.csdn .net/download/qq_21683643/10331534
Verzeichnis
1. Sicherheit
2. Autorisierungscode-Zeichenalgorithmus
4. Token ist einzigartig. Sexuelle Unterstützung
5. API-Unterstützung für einmalige Anfragen
6. Hohe Verfügbarkeit
7. Restful API
8. Ähnlichkeiten und Unterschiede zwischen Web-Login und APP-Login
9. Alibabas Komplexes Anmeldeszenario für die SMS-Überprüfungslösung
11. Lösung für die lokale Zeit- und Serverzeitkonsistenz der APP
13 🎜>14. Verwenden Sie Qiniu Cloud, um grundlegende Bildverarbeitungsdienstfunktionen zu lösen
16. Durchdringung von PHP-Entwurfsmustern
17
18. Asynchrone Dateninteraktion zwischen PHP und Ajax


1. Restful API

Datenstrukturformat

3. Der HTTP-Statuscode wird mit TKs eigenem JSON

implementiert 3. Status Geschäftsstatuscode 4. Nachrichtenaufforderungsnachricht 5. Datenschicht
Universelle API-Schnittstellen-Datenkapselung


Unvorhersehbare interne Ausnahme-API-Datenausgabelösung
Konfigurieren Sie „Exception_Handle“, um den Ausnahmeklassenpfad auszufüllen

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

2. APP-API-Datensicherheitslösung

Die Lösung besteht aus verschiedenen Verschlüsselungen: MD5 AES (symmetrische Verschlüsselung) RSA (asymmetrisch, geringe Effizienz)
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;
    }
}
Zeichen (Gültigkeitszeit, Eindeutigkeit)

Lösung für APP- und serverseitige Zeitkonsistenz
Lösung 1: Holen Sie sich die serverseitige Zeit, und der Client erhält zum Vergleich die richtige Zeit von der Serverseite.
Lösung 2: Zeitstempel beim Initialisieren der App übertragen, Clientzeit = Serverzeitstempel + Differenz

/**
     * 生成每次请求的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;
    }
3. API-Schnittstellendokument schreiben (API-Eingabeparameter, Ausgabeparameterformat)


API-Schnittstellenadresse Anforderungsmethode Post-Eingabeparameterformat Ausgabeparameterformat http-Code

4. APP-Versions-Upgrade-Geschäftsentwicklung Tabellendesign
TABELLE ERSTELLEN
( int(10 ) unsigned NOT NULL,

varchar(20) NOT NULL DEFAULT ” COMMENT 'App-Typ wie iOS Android', ent_version
int(8) unsigned NOT NULL DEFAULT '0 ' COMMENT 'Interne Version number', id
varchar(20) NOT NULL DEFAULT ” COMMENT 'Externe Versionsnummer wie 1.2.3', app_type
tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Ob Update erzwingen 0 nein, 1 Update erzwingen', version
varchar(255) NOT NULL DEFAULT ” KOMMENTAR 'apk neueste Adresse', version_code
varchar(500) NOT NULL DEFAULT ” KOMMENTAR 'Upgrade-Eingabeaufforderung' , is_force
tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Status', apk_url
int(10) unsigned NOT NULL DEFAULT '0', upgrade_point
int (10) unsigned NOT NULL DEFAULT '0' status) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
create_time5. Login-Entwicklung
update_time1.1 Einführung in die APP-Login-Geschäftsentwicklung
Apps haben zwei Zustände: angemeldet und nicht angemeldet.
Warum müssen Sie sich anmelden? Benutzer abbauen, interagieren und kommunizieren Wie melde ich mich bei der APP an? Imitieren Sie andere App-AnmeldungenAndere Anmeldemethoden: passwortfreier Bestätigungscode für die Mobiltelefonnummer, Kontopasswort
Anmeldemethoden von Drittanbietern: QQ-Autorisierung, WeChat-Autorisierung, Weibo-Autorisierung
1.2 Design der App-Login-Tabellenstruktur
TABELLE ERSTELLEN
(

int(10) unsigned NOT NULL COMMENT 'primary key',

varchar(20) NOT NULL DEFAULT ” COMMENT 'username', ent_user
char(32) NOT NULL DEFAULT ” KOMMENTAR 'Passwort', id
varchar(11) NOT NULL DEFAULT ” KOMMENTAR 'Mobiltelefonnummer', username
varchar(100) NOT NULL DEFAULT ” KOMMENTAR 'Bestelltoken', password
int(10) unsigned NOT NULL STANDARD '0' KOMMENTAR 'Token-Ablaufzeit', phone
varchar(200) NICHT NULL STANDARD ” KOMMENTAR 'Avatar', token
tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Geschlecht 0 männlich 1 weiblich', time_out
varchar(200) NOT NULL DEFAULT ” COMMENT 'Persönliche Signatur', image
int (10) unsigned NOT NULL DEFAULT '0' COMMENT 'Registrierungszeit', sex
int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Login-Zeit', signature
tinyint(1 ) NOT NULL DEFAULT '0' COMMENT 'Ist der Status gesperrt' create_time) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.3 Einführung in die Alibaba Cloud Communication Service Platformupdate_timeWas ist Alibaba?
Alibaba bietet Dienste an SMS-, Sprach- und andere personalisierte Dienstestatus1.4 Entwicklung der Funktion zum Senden von SMS-Bestätigungscodes

1.5App-Login-Token-Eindeutigkeitsalgorithmus
App ruft Login auf, der Server gibt verschlüsselte Token-Informationen zurück, jedes Mal, wenn die App die Schnittstelle anfordert, muss sie das Token mitbringen
App generiert ein eindeutiges Token und verschlüsselt es: Token =Token+13-Bit-Zeitstempel
1.6App-Anmeldung per Passwort
Sowohl Benutzername als auch Passwort müssen verschlüsselt und an den Server übertragen werden

6. APP-seitige Anomalien, Leistungsüberwachung und Positionierung Analyse
Grundlage der Ausnahmen auf der APP-Seite:
Crach Bei der Nutzung der App ist ein plötzlicher Absturz aufgetreten
Stottern und Bildschirmverzögerung
Ausnahmeanomalie im Programm
ANR-Popup Box fordert keine Antwort auf (Android)
Datenerfassungsplan:
Erstellen Sie eine Ausnahmeleistungstabelle und entwickeln Sie eine API-Schnittstelle
ID-Primärschlüssel
app_type App-Typ
version_code Versionsnummer
Modellgerät Modell
Hat die Geräte-ID
Typ                                                                                                verwenden               verwenden            ‐                                                     zu statistischen Daten, wie zum Beispiel: Umeng Statistics

7. APP-Nachrichten-Push-Service-Lösung

Umfrage Methode: APP sendet regelmäßig http-Anfragen an den Server, um zu sehen, ob eine Nachricht vorliegt
Drittanbieterplattform: Server->Drittanbieterplattform->app
Verwandte Empfehlungen:

Einige PHP-Entwicklungssicherheitsprobleme zusammengestellt

PHP Detaillierte Erläuterung der Prinzipien und Verwendung der Sitzungsentwicklung

Das obige ist der detaillierte Inhalt vonPHP-Entwicklung von Hochverfügbarkeits- und Hochsicherheits-App-Backend-Studiennotizen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn