PHP開發中保證接口安全

模擬客戶端請求:

<?php
namespace Home\Controller;
use Think\Controller;

class ClientController extends Controller{const TOKEN = 'API';
    //模擬前臺請求服務器api接口
    public function getDataFromServer(){//時間戳
        $timeStamp = time();
        //隨機字符串
        $randomStr = $this -> createNonceStr();
        //生成簽名
        $signature = $this -> arithmetic($timeStamp,$randomStr);
        //url地址
        $url = "http://www.tp3.com/Home/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['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;
    }
}

服務端響應請求:

<?php
namespace Home\Controller;
use Think\Controller;

class ServerController extends Controller{const TOKEN = 'API';

    //響應前臺的請求
    public function respond(){//驗證身份
        $timeStamp = $_GET['t'];
        $randomStr = $_GET['r'];
        $signature = $_GET['s']; // $signature 客戶端請求地址中攜帶的簽名,與服務端生成的簽名進行比對
        $str = $this -> arithmetic($timeStamp,$randomStr);//$str 服務端根據客戶端請求過來的數據生成的簽名
        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;
    }
}

服務端根據客戶端傳遞過來的時間戳和隨機字符串,來按照約定好的生成簽名的算法生成簽名,并與客戶端傳遞過來的簽名進行對比

如果相同,則返回數據,如果不相同,則不返回數據


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL遠程訪問報錯解決

2019獨角獸企業重金招聘Python工程師標準>>> 我之前的一篇博客講了MySQL配置遠程訪問的方法&#xff0c;但是可能配置了賬戶以后還是不能訪問&#xff0c;這可能是防火墻的原因&#xff0c;在CentOS里&#xff0c;我們修改一下防火墻設置就可以了 1. 進入防火墻配置…

jssdk.php

/*** Created by PhpStorm.* Date: 17/8/19* Time: 下午2:24*/ class JSSDK {private $appId;private $appSecret;public function __construct($appId, $appSecret) {$this->appId $appId;$this->appSecret $appSecret;}public function getSignPackage() {$jsapiTick…

GNU/Linux與開源文化的那些人和事

一、計算機的發明 世上本無路&#xff0c;走的人多了&#xff0c;就有了路。世上本無計算機&#xff0c;琢磨的人多了……沒有計算機&#xff0c;一切無從談起。 三個人對計算機的發明功不可沒&#xff0c;居功至偉。阿蘭圖靈&#xff08;Alan Mathison Turing&#xff09;、阿…

PHP使用PHPMailer發送郵件

1. 首先下載phpmailer插件,并將插件復制到目錄下 下載地址: http://download.csdn.net/download/m_nanle_xiaobudiu/10261269 2. home/view/user/mail_chck.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

python學習記錄2

一、兩個模塊&#xff08;sys和os&#xff09; 1 #!/usr/bin/env python2 # _*_ coding: UTF-8 _*_3 # Author:taoke4 import sys5 print(sys.path)#打印環境變量6 print(sys.argv[0])#當前文件相對路徑,sys.argv是一個列表&#xff0c;第一個元素為程序本身的相對路徑&#xf…

cordova-config.xml配置應用圖標

1. <icon src"res/icon/ios/browser.png"/> 2.規格&#xff1a; iphone平臺一般要求3種規格的圖片&#xff1a;1x、2x、3x&#xff0c;也是就Icon.png、Icon2x.png、Icon3x.png. 注意&#xff1a;iOS所有圖標的圓角效果由系統生成&#xff0c;給到的圖標本身不…

將 Figma 設計轉換為 .NET MAUI Graphics 代碼

原文鏈接&#xff1a;https://github.com/jsuarezruiz/figma-to-maui-graphics原文作者&#xff1a;jsuarezruiz翻譯&#xff1a;沙漠盡頭的狼(谷歌翻譯加持)&#xff0c;翻譯別扭&#xff0c;建議直接閱讀原文使用FigmaSharp.Maui.Graphics將Figma設計轉換為 .NET MAUI Graphi…

Android之上下文context

Context&#xff0c;中文直譯為“上下文”&#xff0c;SDK中對其說明如下&#xff1a; 1、它描述的是一個應用程序環境的信息&#xff0c;即上下文。 2、該類是一個抽象(abstract class)類&#xff0c;Android提供了該抽象類的具體實現類。 3、通過它我們可以獲取應用程序的資…

論壇中,無限分類的原理

1.創建數據表 CREATE TABLE category( cat_id SMALLINT unsigned not null auto_increment comment 類別id, cat_name VARCHAR(30) not null default comment 類別名稱, par_id SMALLINT unsigned not null default 0 comment 類別父id, PRIMARY KEY (cat_id) )enginemyisam …

mooc- 基本程序設計方法week1,week2

學習了第一單元我們幾本可以寫出10行左右的代碼。 week1:python編程之基本方法 1、從計算機到程序設計語言&#xff1a; 理解計算機&#xff1a;計算機是能夠根據一組指令操作數據的機器。 功能性&#xff1a;可以進行數據計算 可編程性&#xff1a;根據一系列指令來執行 計算機…

Windows 11 的 2022 更新為每個人帶來了新的東西

Windows 網站發布博客&#xff0c;宣布今天在 190 多個國家/地區推出 Windows 11 2022 更新。微軟在過去一年中對 Windows 11 進行了非常大的改進&#xff0c;感覺每個月都有一次更新。對于之前的 Windows 11&#xff0c;相信很多人在使用過程中也遇到過或大或小的問題。而一部…

goaccess_nginx日志分析工具

在控制臺分析nginx日志goaccess -f b.log生成html文件分析nginx日志vi ~/.goacce***ctime-format %Tdate-format %d/%b/%Ylog-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"各參數詳解&#xff1a; man goaccess或Nginx Variable …

HTML5 Canvas 繪制六葉草

注意&#xff1a; context.arc(橫坐標,縱坐標,弧半徑,起始角度,終止角度,逆順時針);這個函數挺難用&#xff0c;主要原因是最后參數和角度的關系。不管文檔怎么說&#xff0c;按我的實際經驗&#xff0c;逆順時針false時&#xff0c;是逆時針旋轉&#xff1b;逆順時針true時&am…

tp框架中執行事務

function tran() {//定義事務成功失敗的標志$mark true;//1. 實例化模型$model D(student);//2. 開啟事務處理$model->startTrans();//3. ls減少2000$sql "update student set moneymoney-2000 where unamels";$result $model->execute($sql);//判斷sql執行…

哪些聽起來像段子一樣的故事?

杭州海底世界&#xff0c;一個小走廊兩邊都是各種爬行動物展覽。有兩只蜥蜴當時是這個樣子人還年輕&#xff0c;還比較猥瑣&#xff0c;看到一個趴在另一個身上就覺得在做什么羞羞的事。于是就拍下來&#xff0c;發到群里&#xff0c;然后說了句交配中。然后一天就光拍照&#…

Event 事件 - 基礎

事件驅動三要素 事件源&#xff1a;即觸發事件的元素 事件&#xff1a;被JavaScript檢測到的行為。例如&#xff1a; 鼠標點擊 鍵盤按鍵 選輸入框 事件處理函數&#xff1a;事件發生時要進行的操作&#xff0c;又叫做“事件句柄”或“事件監聽器” 事件分類&#xff1a; 鼠標事…

String 與 StringBuilder 區別與用法

String用final修飾&#xff0c;實際上是不可更改的。我們平常用的“”來連接&#xff0c;實際執行過程中是將原字符串連接之后生成新的對象重新賦值給這個名字的字符串。Testpublic void myStrTest(){String s "str_s";System.out.println(s);String ss s.toUpperC…

防跳墻訪問

出現場景: 1. 沒有登錄&#xff0c;也能訪問網頁 2. 沒有相關權限&#xff0c;也能訪問對應的控制器和方法 解決方案: 定義一個CommonController,其他控制器繼承CommonController,在CommonController中定義初始化方法_initialize 注:這里用的是tp3.2框架,如果我們直接在Commo…

windows編譯libevent時報告“缺少print_winsock_errors.obj”的解決

一、綜述 Libevent 是一個用C語言編寫的、輕量級的開源高性能事件通知庫。 在libevent官網(http://libevent.org)下載源碼包&#xff0c;在Windows平臺編譯時&#xff0c;會報缺少“print_winsock_errors.obj”的錯誤。 二、原因及解決 經檢查&#xff0c;這是因為源碼包中缺少…

7.python之正則表達式re模塊

一.正則表達式中常用元字符的復習。通配符系列.(點)匹配任意一個除換行符以外的字符。*(星號)用來匹配*星號前面的字符或者一組字符0到無窮次。可以寫為0(加號)匹配加號前面的一個字符或者一組字符1到無窮次。可以寫為1?(問號)匹配問號前面的一個字符或者一組字符0到1次。可以…