服务器后端与客户端交互数据的安全问题,以微信小程序开发过程为例。

本篇文章专业性并不高,个人水平有限,如果存在问题烦请斧正,欢迎交流讨论。

文章并不深入,只是讲应该从哪些角度去增强小程序客户端与服务器后端交互数据的安全性。

世界上没有绝对安全的系统,但是我们可以尽量让破解变得困难。

目录

一、防反编译——代码混淆

二、将核心内容写进小程序提供的云开发

三、接口头文件验证

四、对数据进行防重放、防篡改攻击


一、防反编译——代码混淆

        反编译小程序的成本很低,不懂的外行利用工具甚至都能实现,并且反编译出来的代码可读性也很强,稍微改改就能重新发布。如果小程序被人反编译并且发布上线,维护自己权益很消耗时间和精力成本。所以在小程序发布上线之前我们要重视防反编译,尽量对代码进行混淆保护,让反编译后的代码可读性变差。本身利用第三方框架开发的小程序在编译后就会有代码的一定混淆,开发的如果是原生小程序就没有。

        微信官方提供了一个代码加固组件,使用方法简单且便捷,可以对JavaScript实现字符串加密、属性加密、调用转换、代码混淆等多项保护措施。

        另外也可以使用例如javascript-obfuscator等等对js进行加密混淆的工具。不过小程序类似于web,在安全性上就像H5,所以想要单单从小程序端解决反编译是不可能的,应该综合使用其他更多的方法尽量保证安全。

二、将核心内容写进小程序提供的云开发

        在程序开发过程中我们经常因为要使用到加密算法所以需要保存一些密钥到小程序端,例如使用AES对称加密我们就要保存密钥到小程序,从而实现加密和解密。但是前面已经提到了小程序安全性较差,很容易被反编译,被反编译后密钥是可以被直接看到的非常影响安全

        所以我们可以利用小程序提供的云开发服务,云开发服务当中有云数据库、云函数可以用,把我们的密钥或者是加密算法的核心代码都放到云数据库、云函数里面,在云开发里面的数据是不会被反编译看到的,并且本身云开发对权限的管理就很不错,安全性很高。

并且云开发的成本对于很多体量不大的个人小程序开发者来说并不算高,是可以接受的。

三、接口头文件验证

小程序向后端服务器发送的请求来源有格式固定的referer信息,其固定格式为:

https://servicewechat.com/{appid}/{version}/page-frame.html

我们后端服务器在接收到请求时可以先对Referer当中的openid进行校验,如果是来自小程序的请求则放行,否则就拒绝,这也能给居心叵测的人带来些困扰。下面是php校验referer中小程序openiddd例子。

$headers = []; //定义header空数组
foreach ($_SERVER as $name => $value) {
    if (substr($name, 0, 5) == 'HTTP_') {
        $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
    }
} //循环数据

$refer_openid = substr($headers['Referer'],26,18); //取出referer当中的openid

if($refer_openid == "此处填写小程序openid"){
    //放行,继续执行业务逻辑代码
}else{
    exit;
    //校验失败
}

四、对数据进行防重放、防篡改攻击

为了尽量保证到服务器的请求是真实用户请求,我们需要对请求进行防重放和防篡改处理。

什么是重放攻击?

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。 重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。 重放攻击在任何网络通信过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

在开始之前我们先了解一下时间戳(Timestamp)这个概念

时间戳是从1970年1月1日开始所经过的秒数,不考虑闰秒。它是计算机科学中常见的术语,是指一种记录时间的方式,通常用于记录某个事件的发生时间或者文件的创建、修改时间等信息。简单的说,时间戳就是一串数字,表示某个时间。

例如1692434197,表示的就是北京时间2023-08-19 16:36:37

       1692434198,表示的就是北京时间2023-08-19 16:36:38

        那么我们可以在post或get请求中加入时间戳这个参数,在后端接收到数据后用当前时间戳减去请求中的时间戳,当两者相差不大时才算是正常的请求(一般从客户端到服务器不会超过3秒钟吧)。例如我们的post参数:

username=123456&coin=50&type=1

加入时间戳之后的参数就变成了

username=123456&coin=50&type=1&timestamp=1692434198

那么问题就来了,如果黑客手动篡改时间戳然后再发送请求呢?是不是就能够逃过我们这个判断了。所以我们需要对数据进行防篡改处理

我们取这些参数的md5值作为签名(sign),并把md5也作为参数放到请求当中,后端收到请求后再次取md5进行对比,如果一样那么就放行。如下:

username=123456&coin=50&type=1&timestamp=1692434198&sign=e4d64c5f5cd6377ccb51580ce7f60a57

        但这样的话黑客有可能会修改参数并且连带着把md5签名一块修改了,所以我们需要向参数中新增一个密钥key,这个密钥加入到参数中,并且参与md5取值,后端也保存这个密钥从而进行md5对比。 请注意,因为这个key小程序和后端都要用到那么肯定都要保存,但小程序一但被反编译就有可能泄露,所以应当把小程序端的key放在前面我们所说的云开发里面。这个key也可以跟随用户的登录态进行动态下发,更安全。带上key拼接的字符串如下:

username=123456&coin=50&type=1&timestamp=1692434198&key=5s4d88D4SG81asd

对这个拼接后的字符串进行md5取值,然后带上md5结果作为sign就行了(不要把key也当做参数传递)

到此为止,我们就实现了客户端和服务器数据交互的防篡改。


我们应该如何实现防重放呢?相同的请求,我重新再发送一次,时间戳符合要求,也没有篡改,这该怎么办?

        我们需要引入一个值nonce,nonce是Number once的缩写,意思是只被使用一次的任意或非重复的随机数值。在小程序向后端发送请求的时候,我们随机生成一个不重复的(或者短时间内不会重复)的数值或字符串,如果担心重复可以规则复杂一些,长度长一些。生成后把这个nonce当做参数一块传递到服务器后端,如下:

username=123456&coin=50&type=1&timestamp=1692434198&nonce=54sg4sd48&sign=e4d64c5f5cd6377ccb51580ce7f60a57

        我们把nonce插入到redis数据库中,设置他的过期时间(过期后redis会自动删除这个数据),例如把过期时间设置为60秒。这样当有新的请求时,我们判断请求携带的nonce是否在redis数据库中,如果已经存在那么就拦截,因为这个请求已经处理过了。60秒过后这个数据会被redis自动删除,哪怕再有攻击,但我们前面加上的时间戳的限制就会把请求拦截。

到此我们实现了防重放攻击。

php操作redis也很简单,我下面放个例子:

$redis = new Redis();//建立对象
$redis->connect('127.0.0.1', 6379);//连接本地的 Redis 服务

$redis->set("123", "456",60);
//插入一个键是123,值为456的记录,过期时间是60秒

$redis->get("123");
//读取键123的值,结果是456

简单插入读取,更多详细内容请自行学习Redis。

另外应该再对我们传递的数据进行非对称或对称加密,会更安全,这方面因为还没有实际写先不说了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以用来开发微信小程序后端,提供接口和数据支持。以下是一些常见问题和注意事项: 1. 如何使用Spring Boot开发微信小程序后端? 首先,你需要创建一个Spring Boot项目。然后,使用Spring框架提供的功能来处理微信小程序的请求和响应。你可以使用Spring MVC来处理HTTP请求,并使用Spring Data JPA来访问数据库。另外,你还需要使用一些微信小程序开发工具和SDK来进行身份验证、消息推送等操作。 2. 如何实现微信小程序登录功能? 微信小程序登录功能可以通过微信提供的登录API来实现。你可以在小程序客户端调用登录API获取到用户的OpenID和SessionKey。然后,在后端使用这些信息进行用户认证和授权操作。 3. 如何处理微信小程序数据请求和响应? 你可以使用Spring MVC框架来处理微信小程序数据请求和响应。通过定义Controller类和对应的接口方法,你可以根据不同的请求路径和请求方式来处理不同的业务逻辑,并返回对应的数据小程序客户端。 4. 如何与微信小程序前端进行数据交互微信小程序前端可以通过发送HTTP请求来与后端进行数据交互后端可以通过Spring MVC提供的注解来接收前端发送的请求参数,并返回JSON格式的数据给前端。 5. 如何部署和发布Spring Boot项目? Spring Boot项目可以打包成可执行的JAR文件,并通过Java命令来运行。你可以将JAR文件上传到服务器上,并使用命令行或脚本来启动项目。另外,你还可以使用一些云平台的服务来部署和发布Spring Boot项目,如AWS、Azure、阿里云等。 希望以上回答对你有帮助!如果有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值