<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                關于接口設計,需要注意區分**PC**,**WAP**,**APP**不同端的接口請求和通用性,以及實現**簽名鑒權**,**訪問控制**等功能。 ## **公共參數** 公共參數是每個接口都要攜帶的參數,描述每個接口的基本信息,用于統計或其他用途,放在 header 或者 url 參數中 * **timestamp** 毫秒級時間戳: 1. 客戶端的請求時間標示 2. 后端可以做請求過期驗證 3. 該參數參與簽名算法增加簽名的唯一性 * **app_key/source** 簽名公鑰(來源): 簽名算法的公鑰,后端通過公鑰可以得到對應的私鑰 * **sign** 接口簽名: 通過請求的參數和定義好的算法生成接口簽名,作用防止`中間人`篡改請求參數 * **did** 設備ID: 設備的唯一標示,生成規則例如 Android 的 MAC 地址的md5和 ios 曾今 udid(目前無法獲取)的md5。 1. 數據收集 2. 便于問題追蹤 3. 消息推送標示 * version 客戶端版本 * token 登錄令牌 * os 手機系統版本 * from 請求來源 * screen 手機尺寸 * model 機型 * net 網絡狀態 ## **響應數據** 響應數據會包含三個屬性,**狀態碼(code**,**信息描述(message**,**響應數據(data)**。 ~~~json { "code": 1, "message": "成功", "data": { "list": [] } } ~~~ ## **接口安全性** ### **過期驗證** 通過時間戳進行驗證 ~~~php if (microtime(true) * 1000 - $REQUEST['timestamp'] > 5000) { throw new \Exception(401, 'Expired request'); } ~~~ ### **簽名驗證(公鑰效驗省略,如果是 saas,密鑰可能不同)** 通過配對私鑰的加密算法產生簽名,請求中攜帶簽名進行鑒權。 ~~~php $params = ksort($_REQUEST); unset($params['sign']); $sign = md5(sha1(implode('-', $params) . $_REQUEST['app_key'])); if ($sign !== $_REQUEST['sign']) { throw new \Exception(401, 'Invalid sign'); } ~~~ ### **重放攻擊** 防止一次相同請求多次攻擊 API 服務器 ~~~php /** @params noise string 隨機字符串或隨機正整數,與 Timestamp 聯合起來, 用于防止重放攻擊 例如騰訊云是6位隨機正整數 */ $key = md5("{$_REQUEST['REQUEST_URI']}-{$_REQUEST['timestamp']}-{$_REQUEST['noise']}-{$_REQUEST['did']}"); if ($redisInstance->exists($key)) { throw new \Exception(401, 'Repeated request'); } ~~~ ### **限流** 防止統一ip頻繁訪問 API 服務器 ~~~php $key = md5("{$_REQUEST['REQUEST_URI']}-{$_REQUEST['REMOTE_ADDR']}-{$_REQUEST['did']}"); if ($redisInstance->get($key) > 60) { throw new \Exception(401, 'Request limit'); } $redisInstance->incre($key); ~~~ ### **轉義** 防止注入,XSS 攻擊 ~~~php $username = htmlspecialchars($_REQUEST['username']); ~~~ ## **接口的解耦設計** 1. 活用中間件、鉤子。 2. 借口多用 POST請求,少用 get 3. 廢棄的代碼及時刪除,或者注釋并標注 4. 接口文件合理切割(laravel,lumen等有接口文件的框架) 5. 服務間調用不要私鑰公鑰相同,免得一破百破 ## **接口的狀態碼** ~~~ 200 -> 正常 400 -> 缺少公共必傳參數或者業務必傳參數 401 -> 接口校驗失敗 例如簽名 403 -> 沒有該接口的訪問權限 499 -> 上游服務響應時間超過接口設置的超時時間 500 -> 代碼錯誤 501 -> 不支持的接口method 502 -> 上游服務返回的數據格式不正確 503 -> 上游服務超時 504 -> 上游服務不可用 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看