本文共 3190 字,大约阅读时间需要 10 分钟。
在实际开发中,PHP被广泛用于构建API接口。API接口的数据返回通常有两种形式:XML 和 JSON。然而,作为服务器端,我们无法确切知道请求来源,因此需要采取安全验证措施,防止接口被非法调用。
为了确保接口的安全性,我们需要前台在请求接口时提供一系列参数来生成签名。这些参数包括:
签名生成过程:
算法规则是接口安全性的核心。我们可以采用以下步骤:
在本示例中,前台使用 PHP 文件模拟请求,通过 CURL 模拟 GET 请求。具体实现如下:
namespace Client\Controller;use Think\Controller;class ClientController extends Controller{ const TOKEN = 'API'; public function getDataFromServer() { $timeStamp = time(); $randomStr = $this->createNonceStr(); $signature = $this->arithmetic($timeStamp, $randomStr); $url = "http://www.apitest.com/Server/Server/respond/t/$timeStamp/r/$randomStr/s/$signature"; $result = $this->httpGet($url); dump($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 $str; } private function arithmetic($timeStamp, $randomStr) { $arr = [ 'timeStamp' => $timeStamp, 'randomStr' => $randomStr, 'token' => self::TOKEN ]; sort($arr, SORT_STRING); $str = implode('', $arr); $signature = sha1($str); $signature = md5($signature); return strtoupper($signature); } 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; }} 服务器端接收前台传递的参数并进行验证:
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', 'age' => 15, 'address' => 'zz', 'ip' => "192.168.0.1" ]; echo json_encode($arr); } public function arithmetic($timeStamp, $randomStr) { $arr = [ 'timeStamp' => $timeStamp, 'randomStr' => $randomStr, 'token' => self::TOKEN ]; sort($arr, SORT_STRING); $str = implode('', $arr); $signature = sha1($str); $signature = md5($signature); return strtoupper($signature); }} 通过上述验证机制,前台请求成功验证后,服务器返回以下数据:
{ "name": "api", "age": 15, "address": "zz", "ip": "192.168.0.1"} 这种双重加密机制确保了API接口的安全性,防止了非法调用和数据窃取。
转载地址:http://jptfk.baihongyu.com/