Maison >développement back-end >Problème PHP >Que faire si la vérification de la sécurité de l'API PHP échoue
Solutions à l'échec de la vérification de la sécurité de l'API PHP : 1. Utilisez un fichier PHP pour remplacer le frontend ; 2. Simulez les requêtes GET via CURL 3. Acceptez les données du frontend pour vérification.
L'environnement d'exploitation de cet article : système Windows 7, PHP7.1, Dell G3.
Que dois-je faire si la vérification de la sécurité de l'API PHP échoue ?
Dans le travail réel, il est courant d'utiliser PHP pour écrire des interfaces API Une fois que PHP a écrit l'interface, la réception peut obtenir les données fournies par l'interface via. le lien. Les données renvoyées sont généralement divisées en deux situations, xml et json. Dans ce processus, le serveur ne connaît pas la source de la demande. Il se peut que quelqu'un d'autre appelle illégalement notre interface pour obtenir des données, une vérification de sécurité est donc nécessaire. requis. .
On voit clairement sur l'image que si la réception veut appeler l'interface, elle doit utiliser plusieurs paramètres pour générer un signature.
Le frontend génère une signature, et lorsqu'il est nécessaire d'accéder à l'interface, l'horodatage, le nombre aléatoire et la signature sont transmis au backend via l'URL. Après avoir obtenu l'horodatage et le nombre aléatoire en arrière-plan, il calcule la signature selon les mêmes règles d'algorithme, puis la compare avec la signature transmise. Si elle est identique, les données sont renvoyées.
Dans les interactions front-end et back-end, les règles d'algorithme sont très importantes. Le front-end et le back-end doivent calculer les signatures via des règles d'algorithme. Quant à la façon de formuler les règles, cela dépend. comme tu l'aimes.
Les règles de mon algorithme sont
L'horodatage, le nombre aléatoire et le mot de passe sont triés dans l'ordre de la première lettre
Puis épissés en une chaîne
Cryptage SHA1
Ensuite Cryptage MD5
Convertir en majuscules.
Je n'ai pas de véritable réception ici, j'utilise directement un fichier PHP à la place de la réception, puis je simule une requête GET via CURL. J'utilise le framework TP et le format URL est le 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; } }
Accepter les données de premier plan pour vérification
<?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"}"
Cette méthode Juste une des méthodes, en fait , de nombreuses méthodes peuvent être utilisées pour la vérification de sécurité.
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!