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.
Persekitaran pengendalian artikel ini: sistem Windows 7, PHP7.1, Dell G3.
Apakah yang perlu saya lakukan jika pengesahan keselamatan php api gagal?
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.
Ia boleh dilihat dengan jelas dari gambar bahawa jika meja depan ingin memanggil antara muka, ia perlu menggunakan beberapa parameter 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.
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 .
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.
<?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 = 'API'; //模拟前台请求服务器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['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; } }
Terima data bahagian hadapan untuk pengesahan
<?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 = 'API'; //响应前台的请求 public function respond(){ //验证身份 $timeStamp = $_GET['t']; $randomStr = $_GET['r']; $signature = $_GET['s']; $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; } }
string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"
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!