Maison  >  Article  >  développement back-end  >  Comment développer un exemple de vérification de la sécurité de l'interface API avec PHP

Comment développer un exemple de vérification de la sécurité de l'interface API avec PHP

小云云
小云云original
2018-03-14 14:14:552095parcourir


Dans le travail réel, il est courant d'utiliser PHP pour écrire des interfaces API. Une fois que PHP a écrit l'interface, la réception peut obtenir les données fournies par l'interface via le lien, et le. les données renvoyées sont généralement divisées en Pour les deux cas, xml et json, au cours de ce processus, le serveur ne connaît pas la source de la requête. Il se peut que quelqu'un d'autre appelle illégalement notre interface pour obtenir des données, une vérification de sécurité doit donc être utilisée. .

Principe de vérification

Schéma schématique

Comment développer un exemple de vérification de la sécurité de linterface API avec PHP

Principe

On voit clairement sur la photo que la réception veut appeler l'interface, plusieurs paramètres doivent être utilisés pour générer une signature.

  • Horodatage : heure actuelle

  • Numéro aléatoire : nombre aléatoire généré aléatoirement

  • Mot de passe : Lors du développement front-end et back-end, un logo connu des deux parties équivaut à un code secret

  • Règles de l'algorithme : Règles de fonctionnement convenues, les trois paramètres ci-dessus peuvent utiliser les règles de l'algorithme pour générer une signature.

Le frontend génère une signature Lorsque l'accès à l'interface est requis, l'horodatage, le nombre aléatoire et la signature sont transmis au backend via l'URL. Après avoir obtenu l'horodatage et le nombre aléatoire en arrière-plan, il calcule la signature selon les mêmes règles d'algorithme, puis la compare avec la signature transmise. Si elle est identique, les données sont renvoyées.

Règles d'algorithme

Dans les interactions front-end et back-end, les règles d'algorithme sont très importantes. Le front-end et le back-end doivent calculer les signatures via des règles d'algorithme. les règles, cela dépend de la façon dont vous l'aimez.

Les règles de mon algorithme sont

  1. Les horodatages, les nombres aléatoires et les mots de passe sont triés dans l'ordre de la première lettre

  2. Ensuite, concaténer en une chaîne

  3. effectuez le cryptage sha1

  4. puis effectuez le cryptage MD5

  5. convertir en majuscules.

Réception

Je n'ai pas de véritable réception ici, j'utilise directement un fichier PHP à la place de la réception, puis je simule une requête GET via CURL. J'utilise le framework TP et le format URL est le format pathinfo.

Code source

<?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);">Côté serveur</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);">Accepter les données de premier plan pour vérification</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);">Code source</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;
    }
}

Résultat

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

Résumé

Cette méthode n'est que l'une d'entre elles. En fait, il existe de nombreuses méthodes qui peuvent être utilisées pour la vérification de sécurité.

Recommandations associées :

Partage PHP d'exemples d'interface API

Partage de code d'interface API de développement PHP

Comment utiliser PHP pour appeler l'interface API afin d'implémenter la fonction de requête météo

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