ホームページ  >  記事  >  バックエンド開発  >  PHPによるAPIインターフェースのセキュリティ検証例の開発方法

PHPによるAPIインターフェースのセキュリティ検証例の開発方法

小云云
小云云オリジナル
2018-03-14 14:14:552051ブラウズ


実際の業務では、PHP を使用して API インターフェイスを記述するのが一般的です。PHP がインターフェイスを作成した後、フロントデスクはインターフェイスによって提供されるデータをリンク経由で取得でき、返されるデータは通常 2 つの状況に分けられます。このプロセスでは、サーバーはリクエストのソースを知りません。他の誰かがデータを取得するために当社のインターフェースを不正に呼び出している可能性があるため、セキュリティ検証を使用する必要があります。

検証原理

概略図

PHPによるAPIインターフェースのセキュリティ検証例の開発方法

原理

フロントデスクがインターフェイスを呼び出したい場合、署名を生成するためにいくつかのパラメーターを使用する必要があることが、図からはっきりとわかります。

  • タイムスタンプ: 現在時刻

  • 乱数: ランダムに生成された乱数

  • パスワード: フロントエンドとバックエンドの開発中に、双方が認識している、秘密コードに相当するロゴ

  • アルゴリズム ルール: 合意された適切なアルゴリズム ルール。上記の 3 つのパラメーターはアルゴリズム ルールを使用して署名を生成できます。

インターフェースにアクセスする必要がある場合、フロントエンドは署名を生成し、タイムスタンプ、乱数、署名が URL を通じてバックエンドに渡されます。バックグラウンドでタイムスタンプと乱数を取得した後、同じアルゴリズム ルールに従って署名を計算し、渡された署名と比較し、同じであればデータを返します。

アルゴリズム ルール

フロントエンドとバックエンドの相互作用では、アルゴリズム ルールはフロントエンドとバックエンドの両方でアルゴリズム ルールを通じて署名を計算する必要があります。いいね。

私のアルゴリズムのルールは

  1. タイムスタンプ、乱数、パスワードを最初の文字の大文字・小文字の順にソート

  2. して、sha1暗号化用の文字列

  3. につなぎます

  4. 次に MD5 暗号化の場合

  5. 大文字に変換します。

フロントデスク

ここには実際のフロントデスクがありません。PHP ファイルを直接使用してフロントデスクを置き換え、CURL を介して GET リクエストをシミュレートします。 TP フレームワークを使用しており、URL 形式は pathinfo 形式です。

ソースコード

<?php /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 15:56
 */
namespace Client\Controller;
use Think\Controller;

class ClientController extends Controller{
    const TOKEN = &#39;API&#39;;
    //模拟前台请求服务器api接口
    public function getDataFromServer(){
        //时间戳
        $timeStamp = time();
        //随机数
        $randomStr = $this -> createNonceStr();
        //生成签名
        $signature = $this -> arithmetic($timeStamp,$randomStr);
        //url地址
        $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}";
        $result = $this -> httpGet($url);
        dump($result);
    }

    //curl模拟get请求。
    private function httpGet($url){
        $curl = curl_init();

        //需要请求的是哪个地址
        curl_setopt($curl,CURLOPT_URL,$url);
        //表示把请求的数据已文件流的方式输出到变量中
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);

        $result = curl_exec($curl);
        curl_close($curl);
        return $result;
    }

    //随机生成字符串
    private function createNonceStr($length = 8) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i <h2 style="padding:0px;font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);">サーバー側</h2><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);">検証のためにフォアグラウンドデータを受け入れる</p><h3 style="padding:0px;font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);">ソースコード</h3><pre style="white-space:pre-wrap;padding:10px;font-size:14px;line-height:22px;background-color:rgba(128,128,128,.05);border:1px solid rgba(128,128,128,.075);" class="brush:php;toolbar:false;"><?php /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/3/16 0016
 * Time: 16:01
 */
namespace Server\Controller;
use Think\Controller;

class ServerController extends Controller{
    const TOKEN = &#39;API&#39;;

    //响应前台的请求
    public function respond(){
        //验证身份
        $timeStamp = $_GET[&#39;t&#39;];
        $randomStr = $_GET[&#39;r&#39;];
        $signature = $_GET[&#39;s&#39;];
        $str = $this -> arithmetic($timeStamp,$randomStr);
        if($str != $signature){
            echo "-1";
            exit;
        }
        //模拟数据
        $arr['name'] = 'api';
        $arr['age'] = 15;
        $arr['address'] = 'zz';
        $arr['ip'] = "192.168.0.1";
        echo json_encode($arr);
    }

    /**
     * @param $timeStamp 时间戳
     * @param $randomStr 随机字符串
     * @return string 返回签名
     */
    public function arithmetic($timeStamp,$randomStr){
        $arr['timeStamp'] = $timeStamp;
        $arr['randomStr'] = $randomStr;
        $arr['token'] = self::TOKEN;
        //按照首字母大小写顺序排序
        sort($arr,SORT_STRING);
        //拼接成字符串
        $str = implode($arr);
        //进行加密
        $signature = sha1($str);
        $signature = md5($signature);
        //转换成大写
        $signature = strtoupper($signature);
        return $signature;
    }
}

結果

string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"

概要

このメソッドは、実際には多くのメソッドに使用できます。安全性が確認されました。

関連する推奨事項:

API インターフェースの例の共有に関する PHP

PHP 開発 API インターフェースのコード共有

PHP を使用して API インターフェースを呼び出して天気クエリ関数を実装する方法

以上がPHPによるAPIインターフェースのセキュリティ検証例の開発方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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