Uni-App - 实战《悦读》之API接口安全策略 - 签名策略
发布日期:2021-06-30 23:55:31 浏览次数:2 分类:技术文章

本文共 2244 字,大约阅读时间需要 7 分钟。

安全概述

前面章节讲解的接口是裸露的、不安全的!使用post、get模拟可以轻松对api进行请求,最简单的攻击就可以瞬间完成近万会员的注册!

所以在进行api接口通讯的同时我们应该进行数据的验证工作!

 

加密原理及流程

1、从服务器端获取一个唯一性的token,我们称之为 accessToken;

2、前端对accessToken进行随机性拆分及md5加密,产生签名(保存在本地存储中);
3、前端在与后端进行交互时传递签名;
4、后端接收数据是验证签名。

 

签名准备

1、在 commons 文件夹内创建

1.1 md5.js //js md5 加密 [ 在课程内获取此 js文件 ]

1.2 sign.js // 签名函数

sign.js

var md5 = require('./md5.js');module.exports = {    sign : function(apiServer){        // 环境判断非uni环境不支持        if(!uni){return '...';}        // 连接服务器获取一个临时的accessToken        uni.request({            url: apiServer+'getAccessToken',            method: 'GET',            success: res => {                if(res.data.status != 'ok'){return ;}                var data = res.data.data;                // 对 accessToken 进行md5加密                var accessToken = md5.hex_md5(data.token + data.time);                // 签名 = md5(accessToekn + time) + '-' + 'accessToekn';                var sign = accessToken + '-' + data.token;                //console.log(sign);                // 记录在本地                uni.setStorage({                    key:"sign",                    data:sign                });            }        });    }}

 

数据库

DROP TABLE IF EXISTS `yuedu_access_tokens`;CREATE TABLE `yuedu_access_tokens` (  `token` varchar(30) NOT NULL,  `time` int(11) DEFAULT NULL,  PRIMARY KEY (`token`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

 

php 端代码

uniqid(), 'time' => time() ); $db->add($token); exit(jsonCode('ok', $token)); }}

 

使用说明

在数据提交页面提交之前进行预签名,提交数据时携带此签名!

 

更合理的签名保存

因为大家后端基础不一样,本课程使用数据库保存了accessToken,更好的方式是 redis 或 memcache,可以设置变量有效期并能自动失效!


在登录环节使用签名验证策略

后端验证签名原理

// 签名验证function checkSign(){    if(empty($_POST['sign'])){exit(jsonCode('error', 'sign error'));}    $sign = explode('-', $_POST['sign']);    if(count($sign) != 2){exit(jsonCode('error', 'sign error'));}    $db = \hsTool\db::getInstance('access_tokens');    $token = $db->where('token = ?', array($sign[1]))->fetch();    if(empty($token)){exit(jsonCode('error', 'sign error'));}    $signMd5 = md5($token['token'].$token['time']);    if($signMd5 != $sign[0]){exit(jsonCode('error', 'sign error'));}    // 验证成功则删除    $db->where('token = ?', array($sign[1]))->delete();}

登录页面签名机制改进

 

转载地址:https://lux-sun.blog.csdn.net/article/details/87880146 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Uni-App - 学习心得
下一篇:Uni-App - 实战《悦读》之多应用、多平台统一登录关系

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月07日 20时39分54秒