项目中的收发信模块

2020-08-23  本文已影响0人  与子笑
🐱 & ❀

此文为记录以往项目代码。是写给自己的。

基于:

  1. 发信,有免费发信和付费发信,免费发信则收信方需要查看信件的权利,付费发信会与收信方形成一个一对一的通道,这个通道的有效期为永久,拥有通道则可以一对一无限次免费收发信,还有一种是会员发信,会员发信免费,收信方也可以与对方免费互动信件,有效期为会员过期日。
  1. 收信,更准确的来说叫拆信,有无权利看对方的来信,能看信的情况有这几种,已有通道,自己或对方是会员,自己付费看信。

按照以上两点需求,为了安全起见,拆信只针对信件而不是针对人。可以得出所有每一封信件的拆信判断的依据都在于信件本身的状态,1为有权利拆,0为没权利拆。如果免费发信给对方,则状态为0,自己是会员或者有通道发出去的信的状态为1。

基于上述1,2的功能,可以得出结论,无论是发信还是拆信,都需要判断自己是否为会员,是否有通道,本封信是否为自己付费。可以按顺序做出一个公用的方法调用。拆信只需要看来往的最后一封信件的状态是否为0。但是有几点情况,如果仅仅只基于这些逻辑,还是会有漏洞,比如用户1发出免费信件给用户2,信件状态为0,此时用户1自己能看自己发出的信件吗,当然可以看,自己看自己发的信有什么不能看,所以这里要做判断,如果最后一封信件由自己发出那就可以看。那这就会出现一个漏洞,此时用户2不拆这一封信,而是去用户列表找到用户1免费发一封信,状态也为0,基于只能判断来往的最后一封信件状态,用户2可以拆开这一封信,这样一来也就能看到所有聊天记录了。

以上就是收发信件的核心逻辑,再有就是安全判断了,因为收发信涉及到交易,所以需要对漏洞方面多加关注,比如,如果是按最后一封信件的状态来拆信,那肯定就有信件id,那就有可能别人瞎填一个id,可能会出现不可预料的问题甚至报错,所以拆信就需要做判断,根据这封信的id信息查到此封信件的收信者是不是当前用户且是否为与当前用户的最后一封信件,因为会员是有生命周期的,如果是,再来判断是否有权力拆信。等等等等,在拆信后,还有上一封信件和下一封信件,是针对用户而不是每一封信,上一封信是上一个与我来往的且我未查看的最后一封信的id,下一封一样,这里需要做数据处理,收信箱和发信箱里的上一封下一封逻辑略有不同。基本上所有拆发信,都要经过的安全判断,是否有这一封信,这封信的发信人或收信人是否存在,拆信的时候要判断这封信是否是写给自己的,要判断这一封信的状态。经过文字的描述和总结,这个模块的结构在我脑袋里更加的清晰,我可以把这个模块再优化一下减少不必要的查询,可以让代码看起来更加简洁易懂。明天上伪代码。

这个项目,距今天为止,已经有接近4年的时间了,这个项目也早已消亡,这是第一个由我参与并主导的项目,在这个项目中,我学到了很多。

原文链接:项目中的收发信模块-PHP

上一篇下一篇

猜你喜欢

热点阅读