一次小项目的小小总结
一次小项目的小小总结
在线专业方向选择系统,11日开始了漫漫地测试之旅……也结束了???……
项目基于ThinkPHP5
(后端)+Laymini
(前端)进行设计开发,我的任务内容就是……后端;每天就是打开环境,看看这个功能的业务咋写,看懂了就去敲,敲完了就把接口丢给前端,来来去去九天左右的时间,后端的难度并不是太大,不是大项目,业务逻辑并不是太难理解!不过我还是在项目中把自己的安全本领带入项目,咋说呢?就是拿来练手。
项目前台(学生用户环境)我用session+token两个机制去限制它的登录绕过、登录超时、越权访问、暴力刷新等问题,同时我对于学生提交最终的结果在录入数据库前加了一套校验它真实性,确保了最后一个位置,通过某种方式挤进去,下面我就从我的角度去说,同时我使用的方法并不是通用,也不是标准,也许在许多大佬的眼中我的方法是原始而无用的……不过还是把项目中我使用的安全相关的小东西写一些吧……
- Token的运用
由于项目环境的情况,我使用比较原始的方法去进行的验证。在用户登录界面中应项目的需求,会将用户的登录IP、时间等信息存入数据库中,在这里我添加了一个token字段,将当前的time()+***
进行组装并MD5
加密处理后截取前*字符用作token值存储在数据库字段中,每次登录都会进行token二次再生,同时在操作页面的关键处进行了token的验证,一旦发现token的不匹配立即清空session并踢退,这样一来可以防止一个账户两个人同时使用的情况;在登录页、注销页、提交页、选择页都进行了token的验证,防止二次登录、越权等现象的出现
- Session的运用
这里没有使用cookie存储用户数据,原因有二:一是cookie本地容易导致安全,二是项目系统只临时开放并开放后就会清空所有缓存和数据,没有让客户端保存cookie的理由;tp5
中的session过期处理时无效的,但是为了防止用户长期的占用在系统中导致资源问题,于是使用认为的session时间期限设定,将用户的session在登录状态下的十分钟后session清空null
;
- 防止暴力刷新占用资源
因为项目系统的目的很像是学校的那种选修课
系统,预料到项目投入使用后会有(抢课)学生进行暴力刷新(系统添加了一个系统填报开关的功能,当填报未开始时,用户可以登录系统,但无法填报,这里所谓的暴力刷新指的是用户在系统填报页一直刷新向服务器请求数据影响服务环境的稳定性)在这里设置了一个数据请求上限的安全防范机制,一旦用户的请求次数达到了一定的上限就会清空用户的登录凭证,原计划添加相关的字段用作对改账户进行安全监控(谁干坏事就能知道了)但是后来综合考虑之下没有添加这样的一个“追查”机制,不过这个依旧可以防止被暴力刷新了,基本满足需求。
- 安全机制
ThinkPHP5
的设计,我们并不需要在所有页面、所有类、所有方法中进行代码,只需要创建一个基础类,继承控制器类之后让其它所有控制器继承基础类,在基础类中写一个构造函数,这样一来就可以在每一个类被执行前,首先检查(执行)用户的凭证(构造函数),在所有和数据库直接进行交互的地方再添加一个防止暴力刷新的公共检查函数即可完成基本的安全机制设计;当然上述的三种安全机制并不是项目中的所有安全机制内容,还有许多……防xxs
、CSRF
、SSRF
,恶意请求等,还准备了其它更多的安全机制,但是鉴于项目的实际需求和实现的难度,并没有安排上。
从Web安全爱好者的角度离开这个项目,回到一个开发学习者的角度去看看这个项目:
前面也说了,项目的业务逻辑并不复杂,就是简单类似选课的系统,首先这个项目的前台需求就是学生查看专业方向的介绍,这个页面直接从后台读取专业方向表的内容然后渲染输出页面就可以了,十分钟搞定!再者就是填报页面,这个页面的麻烦程度并不大,layui的分布表单拿过来直接使用,填报页面包含三个内容:信息确认页——这个页面显示了学生的一些信息,也是非常的简单,我这里直接用什么方法给他的就不说了;方向选择页——这个页面存有两个向服务端发送的请求,当用户下来列表框进行选择的时候,需要从后台进行余量查询后进行显示,还有就是填报信息提交的请求,这个请求实在用户点击提交按钮以后发出的,结合两个请求,我给了两个接口,ajax向后台进行余量查询请求的时候我会自由的给他数据,不过这里我限制他的请求次数在**界限之内,防止发送大量的请求干扰服务运行的稳定性,在者就是提交按钮了,这里我也是防止它反复的提交余量为零的请求,于是我在余量查询为零的时候将请求按钮进行了隐藏同时在后端进行请求次数的安全函数;结果页——我将结果页进行了一个跳转,在结果页中我们是从数据库中对学生的方向选择信息进行输出,在这里我们依旧是防止暴力刷新,添加了安全函数;防止暴力刷新的安全函数全部都用在了这里。
前台的页面非常的简单,逻辑也非常的容易实现,现在转到后台,就是麻烦事了!具体的细节不赘述,简明扼要的说说吧!
后台需要三个图表,前端的人用ECharts
实现了,并且我要给数据,逻辑简单,查询好做,直接给个接口我就走人了!输出所有学生的填报信息,这里的填报信息和学生信息是两张表,没错很简单的用join联表一查,结果一返,收拾接口,立马走人!再就是对方向信息表的操作,实现的也非常的轻松,就是输出数据库查询到的所有数据,给个接口我就走人!最后是系统控制,这里系统需要两个控制功能:重置全部学生的信息填报,关闭填报系统的访问,这两个功能也是非常的容易实现,将重置功能的请求接收后直接删除填报表中的所有数据同时重置学生表中的填报状态,实现容易!关闭系统的功能我直接在学生表中加一个字段就行了!然后……需求添加……学生信息页需要单一重置、单一添加学生、批量execl导入学生,方向页面需要添加方向和删除方向的功能,图表页面的需求就不是我关注的了。需求添加、修改接口、改良接口、重写接口……就这样来回捯饬……慢慢的项目就出来了!
后台逻辑并不复杂也不简单,没啥可说的,更没啥可总结的!测试以后我看了我代码的”优美“程度有几分?我给自己的打分是7分(满分10分)
ps:不过这个前后端开发之间的配合问题还是得磨磨!这次项目有好几次因为接口的原因差点出人命!
Mirror王宇阳
2020年6月11日