Heim  >  Artikel  >  Backend-Entwicklung  >  Was tun, wenn die Überprüfung der PHP-API-Sicherheit fehlschlägt?

Was tun, wenn die Überprüfung der PHP-API-Sicherheit fehlschlägt?

藏色散人
藏色散人Original
2021-11-26 10:16:102682Durchsuche

Lösungen für PHP-API-Sicherheitsüberprüfungsfehler: 1. Verwenden Sie eine PHP-Datei, um das Frontend zu ersetzen. 2. Simulieren Sie GET-Anfragen über CURL. 3. Akzeptieren Sie die Frontend-Daten zur Überprüfung.

Was tun, wenn die Überprüfung der PHP-API-Sicherheit fehlschlägt?

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP7.1, Dell G3.

Was soll ich tun, wenn die PHP-API-Sicherheitsüberprüfung fehlschlägt?

PHP-API-Schnittstelle

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 abrufen Die zurückgegebenen Daten werden im Allgemeinen in zwei Situationen unterteilt: XML und JSON. Bei diesem Vorgang kennt der Server möglicherweise nicht die Quelle der Anforderung, um Daten abzurufen erforderlich. .

Überprüfungsprinzip

Schematisches Diagramm

Was tun, wenn die Überprüfung der PHP-API-Sicherheit fehlschlägt?

Prinzip

Auf dem Bild ist deutlich zu erkennen, dass die Rezeption mehrere Parameter verwenden muss, um eine Schnittstelle zu generieren, wenn sie die Schnittstelle aufrufen möchte Unterschrift.

  • Zeitstempel: die aktuelle Zeit
  • Zufallszahl: eine zufällig generierte Zufallszahl
  • Passwort: Während der Front-End- und Back-End-Entwicklung eine beiden Parteien bekannte Kennung, äquivalent zu einem Passwort
  • Algorithmusregeln: Vereinbarter Betrieb Regeln: Die oben genannten drei Parameter können verwendet werden, um mithilfe algorithmischer Regeln eine Signatur zu generieren.

Das Frontend generiert eine Signatur, und wenn auf die Schnittstelle zugegriffen werden muss, 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. Sowohl das Front-End als auch das Back-End müssen Signaturen anhand von Algorithmusregeln berechnen wie es dir gefällt.

Die Regeln meines Algorithmus sind

  • Zeitstempel, Zufallszahl, Passwort werden in der Reihenfolge des ersten Buchstabens sortiert

  • und dann in eine Zeichenfolge gespleißt

  • für die SHA1-Verschlüsselung

  • und dann MD5-Verschlüsselung

  • In Großbuchstaben umwandeln.

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 < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return "z".$str;
    }

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

Serverseitig

Vordergrunddaten zur Überprüfung akzeptieren

Quellcode

<?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[&#39;name&#39;] = &#39;api&#39;;
        $arr[&#39;age&#39;] = 15;
        $arr[&#39;address&#39;] = &#39;zz&#39;;
        $arr[&#39;ip&#39;] = "192.168.0.1";
        echo json_encode($arr);
    }

    /**
     * @param $timeStamp 时间戳
     * @param $randomStr 随机字符串
     * @return string 返回签名
     */
    public function arithmetic($timeStamp,$randomStr){
        $arr[&#39;timeStamp&#39;] = $timeStamp;
        $arr[&#39;randomStr&#39;] = $randomStr;
        $arr[&#39;token&#39;] = 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 tatsächlich nur eine der Methoden Es gibt viele Methoden, die zur Sicherheitsüberprüfung verwendet werden können.

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas tun, wenn die Überprüfung der PHP-API-Sicherheit fehlschlägt?. 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