Heim  >  Artikel  >  Backend-Entwicklung  >  So entwickeln Sie ein Beispiel für die Sicherheitsüberprüfung einer API-Schnittstelle mit PHP

So entwickeln Sie ein Beispiel für die Sicherheitsüberprüfung einer API-Schnittstelle mit PHP

小云云
小云云Original
2018-03-14 14:14:552095Durchsuche


In der tatsächlichen Arbeit wird häufig PHP zum Schreiben von API-Schnittstellen verwendet. Nachdem PHP die Schnittstelle geschrieben hat, kann die Rezeption die von der Schnittstelle bereitgestellten Daten über den Link abrufen Die zurückgegebenen Daten werden im Allgemeinen in XML und JSON unterteilt. Während dieses Vorgangs kennt der Server die Quelle der Anforderung nicht. Möglicherweise ruft jemand anderes illegal unsere Schnittstelle auf, um Daten abzurufen. Daher muss eine Sicherheitsüberprüfung durchgeführt werden .

Verifizierungsprinzip

Schematische Darstellung

So entwickeln Sie ein Beispiel für die Sicherheitsüberprüfung einer API-Schnittstelle mit PHP

Prinzip

Auf dem Bild ist deutlich zu erkennen, dass die Rezeption Wenn Sie die Schnittstelle aufrufen möchten, müssen mehrere Parameter verwendet werden, um eine Signatur zu generieren.

  • Zeitstempel: aktuelle Zeit

  • Zufallszahl: zufällig generierte Zufallszahl

  • Passwort: Während der Front-End- und Back-End-Entwicklung entspricht ein beiden Parteien bekanntes Logo einem Geheimcode

  • Algorithmusregeln: Vereinbarte Betriebsregeln, die oben genannten drei Parameter können Algorithmusregeln verwenden eine Signatur erstellen.

Das Frontend generiert eine Signatur. Wenn ein Zugriff auf die Schnittstelle erforderlich ist, werden der Zeitstempel, die Zufallszahl und die Signatur über die URL an das Backend übergeben. Nachdem der Zeitstempel und die Zufallszahl im Hintergrund abgerufen wurden, berechnet er die Signatur anhand derselben Algorithmusregeln und vergleicht sie dann mit der übergebenen Signatur. Wenn sie identisch sind, werden die Daten zurückgegeben.

Algorithmusregeln

Bei Front-End- und Back-End-Interaktionen sind Algorithmusregeln sehr wichtig. Das Front-End und das Back-End müssen Signaturen anhand von Algorithmusregeln berechnen Die Regeln, es kommt darauf an, wie es dir gefällt.

Die Regeln meines Algorithmus sind

  1. Zeitstempel, Zufallszahlen und Passwörter werden in der Reihenfolge der Groß- und Kleinschreibung sortiert

  2. Dann In eine Zeichenfolge verketten

  3. SHA1-Verschlüsselung durchführen

  4. und dann MD5-Verschlüsselung durchführen

  5. konvertieren in Großbuchstaben.

Rezeption

Ich habe hier keine echte Rezeption, ich verwende direkt eine PHP-Datei anstelle der Rezeption und simuliere dann eine GET-Anfrage über CURL. Ich verwende das TP-Framework und das URL-Format ist das Pathinfo-Format.

Quellcode

<?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);">Serverseite</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);">Vordergrunddaten zur Überprüfung akzeptieren</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);">Quellcode</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;
    }
}

Ergebnis

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

Zusammenfassung

Diese Methode ist nur eine davon. Tatsächlich gibt es viele Methoden, die zur Sicherheitsüberprüfung verwendet werden können.

Verwandte Empfehlungen:

PHP-Sharing über API-Schnittstellenbeispiele

PHP-Entwicklungs-API-Schnittstellencode-Sharing

So rufen Sie mit PHP die API-Schnittstelle auf, um die Wetterabfragefunktion zu implementieren

Das obige ist der detaillierte Inhalt vonSo entwickeln Sie ein Beispiel für die Sicherheitsüberprüfung einer API-Schnittstelle mit PHP. 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