Apa yang perlu dilakukan jika pengesahan keselamatan php api gagal

藏色散人
Lepaskan: 2023-03-14 07:10:01
asal
2747 orang telah melayarinya

Penyelesaian kepada kegagalan pengesahan keselamatan api PHP: 1. Gunakan fail PHP untuk menggantikan bahagian hadapan 2. Simulasikan permintaan GET melalui CURL 3. Terima data bahagian hadapan untuk pengesahan.

Apa yang perlu dilakukan jika pengesahan keselamatan php api gagal

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP7.1, Dell G3.

Apakah yang perlu saya lakukan jika pengesahan keselamatan php api gagal?

antara muka php api

dalam kerja sebenar, ia adalah biasa untuk menggunakan PHP untuk menulis antara muka API Selepas PHP menulis antara muka, meja depan boleh mendapatkan data yang disediakan oleh antara muka melalui pautan, dan data yang dikembalikan biasanya dibahagikan kepada dua situasi, xml dan json. pelayan tidak Saya tidak tahu apakah sumber permintaan itu. Mungkin ada orang lain yang secara haram memanggil antara muka kami untuk mendapatkan data, jadi pengesahan keselamatan diperlukan.

Prinsip pengesahan

Rajah skematik

Apa yang perlu dilakukan jika pengesahan keselamatan php api gagal

Prinsip

Ia boleh dilihat dengan jelas dari gambar bahawa jika meja depan ingin memanggil antara muka, ia perlu menggunakan beberapa parameter untuk menjana tandatangan.

  • Cop masa: masa semasa
  • Nombor rawak: nombor rawak yang dijana secara rawak
  • Kata Laluan: Semasa pembangunan bahagian hadapan dan belakang, pengecam yang diketahui oleh kedua-duanya pihak, bersamaan dengan Kata Laluan
  • Peraturan algoritma: Peraturan operasi yang dipersetujui Tiga parameter di atas boleh menggunakan peraturan algoritma untuk menjana tandatangan.

Halaman hadapan menjana tandatangan, dan apabila perlu untuk mengakses antara muka, cap waktu, nombor rawak dan tandatangan dihantar ke hujung belakang melalui URL. Selepas mendapat cap masa dan nombor rawak di latar belakang, ia mengira tandatangan melalui peraturan algoritma yang sama, dan kemudian membandingkannya dengan tandatangan yang diluluskan Jika ia adalah sama, data dikembalikan.

Peraturan Algoritma

Dalam interaksi front-end dan back-end, peraturan algoritma sangat penting bahagian depan dan belakang mesti mengira tandatangan melalui peraturan algoritma Mengenai cara merumuskan peraturan, lihat Datang sesuka hati.

Peraturan algoritma saya ialah

  • Setem masa, nombor rawak dan kata laluan diisih mengikut susunan huruf pertama

  • Kemudian Gabungkan menjadi rentetan

  • lakukan penyulitan sha1

  • dan kemudian lakukan penyulitan MD5

  • tukar kepada huruf besar .

Frontend

Saya tidak mempunyai frontend sebenar di sini, saya terus menggunakan fail PHP dan bukannya frontend, dan kemudian mensimulasikan DAPATKAN permintaan melalui CURL. Saya menggunakan rangka kerja TP dan format URL ialah format pathinfo.

Kod sumber

<?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;
    }
}
Salin selepas log masuk

Sebelah pelayan

Terima data bahagian hadapan untuk pengesahan

Kod sumber

<?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;
    }
}
Salin selepas log masuk

Keputusan

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

Ringkasan

Kaedah ini hanyalah salah satu daripada mereka Satu kaedah, sebenarnya terdapat banyak kaedah yang boleh digunakan untuk pengesahan keselamatan.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Apa yang perlu dilakukan jika pengesahan keselamatan php api gagal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan