>백엔드 개발 >PHP 튜토리얼 >PHP로 API 인터페이스 보안 검증 예제를 개발하는 방법

PHP로 API 인터페이스 보안 검증 예제를 개발하는 방법

小云云
小云云원래의
2018-03-14 14:14:552108검색


실제 작업에서는 PHP를 사용하여 API 인터페이스를 작성하는 것이 일반적입니다. PHP가 인터페이스를 작성한 후 프런트 데스크는 링크를 통해 인터페이스에서 제공하는 데이터를 얻을 수 있으며 반환되는 데이터는 일반적으로 두 가지 상황으로 나뉩니다. , xml 및 json 이 프로세스에서 서버는 요청의 소스를 알지 못합니다. 다른 사람이 데이터를 얻기 위해 불법적으로 인터페이스를 호출할 수 있으므로 보안 확인을 사용해야 합니다.

검증 원리

개략도

PHP로 API 인터페이스 보안 검증 예제를 개발하는 방법

Principle

프론트 데스크가 인터페이스를 호출하려면 여러 매개 변수를 사용하여 서명을 생성해야 한다는 것을 그림에서 명확하게 볼 수 있습니다.

  • 타임스탬프: 현재 시간

  • 난수: 무작위로 생성된 난수

  • 비밀번호: 프런트엔드 및 백엔드 개발 시 양측 모두에게 알려진 비밀 코드에 해당하는 로고

  • 알고리즘 규칙: 좋은 알고리즘 규칙에 동의했습니다. 위의 세 가지 매개변수는 알고리즘 규칙을 사용하여 서명을 생성할 수 있습니다.

프런트엔드는 서명을 생성하고 인터페이스에 액세스해야 할 때 타임스탬프, 난수 및 서명이 URL을 통해 백엔드로 전달됩니다. 백그라운드에서 타임스탬프와 난수를 가져온 후 동일한 알고리즘 규칙을 통해 서명을 계산한 다음 전달된 서명과 비교하여 동일하면 데이터를 반환합니다.

알고리즘 규칙

프런트엔드와 백엔드 상호 작용에서는 알고리즘 규칙이 매우 중요합니다. 프런트엔드와 백엔드 모두 알고리즘 규칙을 통해 서명을 계산해야 합니다. 좋아요.

내 알고리즘의 규칙은

  1. 타임 스탬프, 임의의 숫자, 비밀번호는 첫 글자의 경우 순서로 정렬된 다음

  2. 한 다음 sha1 암호화를 위해 문자열

  3. 으로 연결됩니다.

  4. 그런 다음 MD5 암호화

  5. 대문자로 변환하세요.

프론트 데스크

여기에는 실제 프론트 데스크가 없습니다. PHP 파일을 사용하여 프론트 데스크를 직접 교체한 다음 CURL을 통해 GET 요청을 시뮬레이션합니다. 저는 TP 프레임워크를 사용하고 있으며 URL 형식은 pathinfo 형식입니다.

소스 코드

<?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);">서버 측</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);">확인을 위해 포그라운드 데이터 허용</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);">소스 코드</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;
    }
}

Result

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

요약

이 방법은 실제로 그 중 하나일 뿐입니다. 보안이 확인되었습니다.

관련 권장 사항:

API 인터페이스 예제 공유에 대한 PHP

PHP 개발 API 인터페이스 코드 공유

PHP를 사용하여 API 인터페이스를 호출하여 날씨 쿼리 기능을 구현하는 방법

위 내용은 PHP로 API 인터페이스 보안 검증 예제를 개발하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.