日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 接口安全解决方案,php接口数据安全解决方案(一)

發布時間:2025/3/11 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 接口安全解决方案,php接口数据安全解决方案(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

目的:

1.實現前后端代碼分離,分布式部署

2.利用token替代session實現狀態保持,token是有時效性的滿足退出登錄,token存入redis可以解決不同服務器之間session不同步的問題,滿足分布式部署

3.利用sign,前端按照約定的方式組合加密生成字符串來校驗用戶傳遞的參數跟后端接收的參數是否一直,保障接口數據傳遞的安全

4.利用nonce,timestamp來保障每次請求的生成sign不一致,并將sign與nonce組合存入redis,來防止api接口重放

目錄介紹

├── Core

│?? ├── Common.php(常用的公用方法)

│?? ├── Controller.php (控制器基類)

│?? └── RedisService.php (redis操作類)

├── config.php (redis以及是否開啟關閉接口校驗的配置項)

├── login.php (登錄獲取token入口)

└── user.php(獲取用戶信息,執行整個接口校驗流程)

登錄鑒權圖

接口請求安全性校驗整體流程圖

代碼展示

common.php

namespace Core;

/**

* @desc 公用方法

* Class Common

*/

class Common{

/**

* @desc 輸出json數據

* @param $data

*/

public static function outJson($code,$msg,$data=null){

$outData = [

'code'=>$code,

'msg'=>$msg,

];

if(!empty($data)){

$outData['data'] = $data;

}

echo json_encode($outData);

die();

}

/***

* @desc 創建token

* @param $uid

*/

public static function createToken($uid){

$time = time();

$rand = mt_rand(100,999);

$token = md5($time.$rand.'jwt-token'.$uid);

return $token;

}

/**

* @desc 獲取配置信息

* @param $type 配置信息的類型,為空獲取所有配置信息

*/

public static function getConfig($type=''){

$config = include "./config.php";

if(empty($type)){

return $config;

}else{

if(isset($config[$type])){

return $config[$type];

}

return [];

}

}

}

RedisService.php

namespace Core;

/*

*@desc redis類操作文件

**/

class RedisService{

private $redis;

protected $host;

protected $port;

protected $auth;

protected $dbId=0;

static private $_instance;

public $error;

/*

*@desc 私有化構造函數防止直接實例化

**/

private function __construct($config){

$this->redis = new \Redis();

$this->port = $config['port'] ? $config['port'] : 6379;

$this->host = $config['host'];

if(isset($config['db_id'])){

$this->dbId = $config['db_id'];

$this->redis->connect($this->host, $this->port);

}

if(isset($config['auth']))

{

$this->redis->auth($config['auth']);

$this->auth = $config['auth'];

}

$this->redis->select($this->dbId);

}

/**

*@desc 得到實例化的對象

***/

public static function getInstance($config){

if(!self::$_instance instanceof self) {

self::$_instance = new self($config);

}

return self::$_instance;

}

/**

*@desc 防止克隆

**/

private function __clone(){}

/*

*@desc 設置字符串類型的值,以及失效時間

**/

public function set($key,$value=0,$timeout=0){

if(empty($value)){

$this->error = "設置鍵值不能夠為空哦~";

return $this->error;

}

$res = $this->redis->set($key,$value);

if($timeout){

$this->redis->expire($key,$timeout);

}

return $res;

}

/**

*@desc 獲取字符串類型的值

**/

public function get($key){

return $this->redis->get($key);

}

}

Controller.php

namespace Core;

use Core\Common;

use Core\RedisService;

/***

* @desc 控制器基類

* Class Controller

* @package Core

*/

class Controller{

//接口中的token

public $token;

public $mid;

public $redis;

public $_config;

public $sign;

public $nonce;

/**

* @desc 初始化處理

* 1.獲取配置文件

* 2.獲取redis對象

* 3.token校驗

* 4.校驗api的合法性check_api為true校驗,為false不用校驗

* 5.sign簽名驗證

* 6.校驗nonce,預防接口重放

*/

public function __construct()

{

//1.獲取配置文件

$this->_config = Common::getConfig();

//2.獲取redis對象

$redisConfig = $this->_config['redis'];

$this->redis = RedisService::getInstance($redisConfig);

//3.token校驗

$this->checkToken();

//4.校驗api的合法性check_api為true校驗,為false不用校驗

if($this->_config['checkApi']){

// 5. sign簽名驗證

$this->checkSign();

//6.校驗nonce,預防接口重放

$this->checkNonce();

}

}

/**

* @desc 校驗token的有效性

*/

private function checkToken(){

if(!isset($_POST['token'])){

Common::outJson('10000','token不能夠為空');

}

$this->token = $_POST['token'];

$key = "token:".$this->token;

$mid = $this->redis->get($key);

if(!$mid){

Common::outJson('10001','token已過期或不合法,請先登錄系統 ');

}

$this->mid = $mid;

}

/**

* @desc 校驗簽名

*/

private function checkSign(){

if(!isset($_GET['sign'])){

Common::outJson('10002','sign校驗碼為空');

}

$this->sign = $_GET['sign'];

$postParams = $_POST;

$params = [];

foreach($postParams as $k=>$v) {

$params[] = sprintf("%s%s", $k,$v);

}

sort($params);

$apiSerect = $this->_config['apiSerect'];

$str = sprintf("%s%s%s", $apiSerect, implode('', $params), $apiSerect);

if ( md5($str) != $this->sign ) {

Common::outJson('10004','傳遞的數據被篡改,請求不合法');

}

}

/**

* @desc nonce校驗預防接口重放

*/

private function checkNonce(){

if(!isset($_POST['nonce'])){

Common::outJson('10003','nonce為空');

}

$this->nonce = $_POST['nonce'];

$nonceKey = sprintf("sign:%s:nonce:%s", $this->sign, $this->nonce);

$nonV = $this->redis->get($nonceKey);

if ( !empty($nonV)) {

Common::outJson('10005','該url已經被調用過,不能夠重復使用');

} else {

$this->redis->set($nonceKey,$this->nonce,360);

}

}

}

config.php

return [

//redis的配置

'redis' => [

'host' => 'localhost',

'port' => '6379',

'auth' => '123456',

'db_id' => 0,//redis的第幾個數據庫倉庫

],

//是否開啟接口校驗,true開啟,false,關閉

'checkApi'=>true,

//加密sign的鹽值

'apiSerect'=>'test_jwt'

];

login.php

/**

* @desc 自動加載類庫

*/

spl_autoload_register(function($className){

$arr = explode('\\',$className);

include $arr[0].'/'.$arr[1].'.php';

});

use Core\Common;

use Core\RedisService;

if(!isset($_POST['username']) || !isset($_POST['pwd']) ){

Common::outJson(-1,'請輸入用戶名和密碼');

}

$username = $_POST['username'];

$pwd = $_POST['pwd'];

if($username!='admin' || $pwd!='123456' ){

Common::outJson(-1,'用戶名或密碼錯誤');

}

//創建token并存入redis,token對應的值為用戶的id

$config = Common::getConfig('redis');

$redis = RedisService::getInstance($config);

//假設用戶id為2

$uid = 2;

$token = Common::createToken($uid);

$key = "token:".$token;

$redis->set($key,$uid,3600);

$data['token'] = $token;

Common::outJson(0,'登錄成功',$data);

user.php

/**

* @desc 自動加載類庫

*/

spl_autoload_register(function($className){

$arr = explode('\\',$className);

include $arr[0].'/'.$arr[1].'.php';

});

use Core\Controller;

use Core\Common;

class UserController extends Controller{

/***

* @desc 獲取用戶信息

*/

public function getUser(){

$userInfo = [

"id"=>2,

"name"=>'巴八靈',

"age"=>30,

];

if($this->mid==$_POST['mid']){

Common::outJson(0,'成功獲取用戶信息',$userInfo);

}else{

Common::outJson(-1,'未找到該用戶信息');

}

}

}

//獲取用戶信息

$user = new UserController();

$user->getUser();

演示用戶登錄

簡要描述:

用戶登錄接口

請求URL:

http://localhost/login.php

請求方式:

POST

參數:

參數名

必選

類型

說明

username

string

用戶名

pwd

string

密碼

返回示例

{

"code": 0,

"msg": "登錄成功",

"data": {

"token": "86b58ada26a20a323f390dd5a92aec2a"

}

}

{

"code": -1,

"msg": "用戶名或密碼錯誤"

}

演示獲取用戶信息

簡要描述:

獲取用戶信息,校驗整個接口安全的流程

請求URL:

http://localhost/user.php?sign=f39b0f2dea817dd9dbef9e6a2bf478de

請求方式:

POST

參數:

參數名

必選

類型

說明

token

string

token

mid

int

用戶id

nonce

string

防止用戶重放字符串 md5加密串

timestamp

int

當前時間戳

返回示例

{

"code": 0,

"msg": "成功獲取用戶信息",

"data": {

"id": 2,

"name": "巴八靈",

"age": 30

}

}

{

"code": "10005",

"msg": "該url已經被調用過,不能夠重復使用"

}

{

"code": "10004",

"msg": "傳遞的數據被篡改,請求不合法"

}

{

"code": -1,

"msg": "未找到該用戶信息"

}

文章完整代碼地址

后記

上面完整的實現了整個api的安全過程,包括接口token生成時效性合法性驗證,接口數據傳輸防篡改,接口防重放實現。僅僅靠這還不能夠最大限制保證接口的安全。條件滿足的情況下可以使用https協議從數據底層來提高安全性,另外本實現過程token是使用redis存儲,下一篇文章我們將使用第三方開發的庫實現JWT的規范操作,來替代redis的使用。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的php 接口安全解决方案,php接口数据安全解决方案(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91你懂的 | 日韩三级在线免费观看 | 888奇米影视 | 国产av毛片| 熟妇五十路六十路息与子 | 久久黄网| 超碰日本 | 九九热在线视频播放 | 亚洲hhh| 国产欧美一区二区精品性色99 | 亚洲精品99999 | 美女主播在线观看 | 国产无精乱码一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 午夜av一区 | 久久一级黄色片 | 国产午夜福利精品 | 午夜精品久久久久久久四虎美女版 | 亚洲www在线 | 中文字幕――色哟哟 | 黄色在线播放视频 | 女同视频网站 | 呦呦av | 天干夜天干天天天爽视频 | 激情黄色小视频 | 天堂av√| 大香依人 | 精品福利视频一区二区 | 欧美成人播放 | 天堂中文在线资 | 久久亚洲天堂网 | 少妇野外性xx老女人野外性xx | 痴女扩张宫交脱垂重口小说 | 欧美日韩一区二区三区 | 波多野结衣有码 | 成人动漫在线观看免费 | 午夜久久电影 | 欧美成人影音 | 在线观看视频免费 | 国产午夜精品无码一区二区 | 久久久久久福利 | 麻豆午夜视频 | 欧美大胆a视频 | 国产激情小视频 | 手机看片1024日韩 | 熟女少妇在线视频播放 | 国产jzjzjz丝袜老师水多 | 好吊妞操 | 国产小视频一区 | 香蕉久久网 | av成人在线看 | 高贵麻麻被调教成玩物 | 丁香六月婷婷激情 | 91视频在线免费看 | 中文天堂在线视频 | 精品自拍视频 | 国产精品久久久久久久免费大片 | 成人综合社区 | 亚洲黄在线观看 | 91精品国产91久久久久久吃药 | 国产精品jizz在线观看软件 | av成人免费在线观看 | 成人在线视频观看 | 日韩免费三级 | c逼视频| 国产精品永久久久久久久久久 | 一区二区三区免费在线视频 | 成人永久免费视频 | 中文字幕人成人乱码亚洲电影 | 中文资源在线观看 | 久久国产精品一区二区三区 | 亚洲欧美日韩系列 | 亚洲人在线视频 | 中文字幕少妇在线三级hd | 快播91| 一本一本久久a久久精品综合麻豆 | 久久精品电影网 | 久精品在线 | www.国产成人| 人人插人人 | 射影院 | 在线黄色大片 | 高清精品xnxxcom| 波多野结衣一二三区 | 日本三级中文字幕在线观看 | av免播放器| 亚洲精品无人区 | 久久久精彩视频 | 午夜精品一区二区三区免费视频 | 国产又粗又猛视频 | 亚洲AV无码精品久久一区二区 | 北岛玲av在线 | 久久久久久久一 | 伊人亚洲综合 | 色开心| 成人动态视频 | 欧美美女性生活 | 天堂岛av| 成人国产精品久久久 |