La sécurité de l'interface est principalement conçue autour des trois mécanismes de Token, Timestamp et Sign pour garantir que les données de l'interface ne seront pas falsifiées et appelées à plusieurs reprises. ci-dessous :
(1) Mécanisme d'autorisation du jeton : (Le jeton est l'identifiant permettant au client d'accéder au serveur) --Après le L'utilisateur se connecte à l'aide du nom d'utilisateur et du mot de passe, le serveur renvoie un jeton au client (généralement UUID) et stocke Token-UserId dans le serveur de cache sous la forme de paires clé-valeur. Après avoir reçu la demande, le serveur effectue une vérification du jeton. Si le jeton n'existe pas, la demande n'est pas valide. (Apprentissage recommandé : Programmation PHP de l'entrée à la maîtrise)
(2) Mécanisme de délai d'expiration de l'horodatage : (Le mécanisme de signature garantit que les données ne seront pas falsifiées) Chaque utilisateur Chaque requête porte un horodatage de l'heure actuelle. Le serveur reçoit l'horodatage et le compare avec l'heure actuelle. Si le décalage horaire est supérieur à une certaine heure (par exemple 5 minutes), la requête est considérée comme invalide. Le mécanisme de délai d'expiration de l'horodatage est un moyen efficace de se défendre contre les attaques DOS.
(3) Mécanisme de signature : Ajoutez un jeton et un horodatage aux autres paramètres de la requête, puis chiffrez-le à l'aide de l'algorithme MD5 ou SHA-1 (vous pouvez ajouter du sel selon la situation). les données cryptées sont Pour la signature de cette requête, le serveur utilise le même algorithme pour obtenir la signature après réception de la requête, et la compare avec la signature actuelle. Si elle est différente, cela signifie que les paramètres ont été modifiés, et une erreur. L'ID est renvoyé directement.
/** * @desc 接受参数处理 */ private function dealParam(){ //接受header参数--系统参数 $systemParam=getAllHeadersParam(); //接受body数据--业务参数(json格式) $data=file_get_contents('php://input'); //读取配置文件中的私钥信息 $api_apiKey=C('api_apiKey'); $privatekey=$api_apiKey[$systemParam['token']]; $arr['token'] =$systemParam['token']; //服务端分配的标识(不同客户端需使用不同的标识) $arr['timestamp']=$systemParam['timestamp']; //时间戳,UTC时间,以北京时间东八区(+8)为准 $arr['version'] =$systemParam['version']; //版本号 $arr['sign'] =$systemParam['sign']; //签名 $arr['source'] =$systemParam['source']; //来源(0-安卓/1-IOS/2-H5/3-PC/4-php/5-java) $arr['data'] =json_decode($data,true); //业务参数json格式 $arr['method'] =$data['method']; //访问接口,格式:模型名.方法名 return $arr; }
/* * @desc 获取所有以HTTP开头的header参数 * @return array */ private function getAllHeadersParam(){ $headers = array(); foreach($_SERVER as $key=>$value){ if(substr($key, 0, 5)==='HTTP_'){ $key = substr($key, 5); $key = str_replace('_', ' ', $key); $key = str_replace(' ', '-', $key); $key = strtolower($key); $headers[$key] = $value; } } return $headers; }
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!