考核题目:匿名の提问箱
参考项目:
简介
提问箱采取提问者匿名、回答者公开ID的方式,允许用户以匿名方式向某位注册用户提问。
用户角色
- 网站管理员
- 普通用户(普通用户可以选择接受提问其他用户的提问,也可以选择完全不接受任何提问,也可以向接受提问的其他用户发起提问)
- 未登录用户
考核重点
从实质上来说,这就是一个具有匿名功能的升级版留言板,考核的目的在于考验成员对于Web应用的身份验证流程的认识和基本的Web应用安全措施,可以说这次是针对第四次考核中出现的Get请求发送用户密码、明文密码存数据库、密码hash不加salt、任意文件读取等等的一系列问题设计的考核。要求成员掌握XSS防护、CSRF防护、基本的身份验证流程
功能
注册登录
- 基本的注册登录流程,使用用户名或邮箱都可以登录
- 注册后账户为未激活状态,需通过验证邮箱激活,未激活不能接收提问和发送提问
- 注册表单要求有邮箱、用户名、密码,并且注册登录时要求都要验证码
- 注册的时候密码要求输入两次并且两次都一致
- 密码需要前端哈希后发送到后端,不允许明文传输密码
- 验证码为基本的图形验证码就可以,不要求滑块、reCaptcha等
- 表单提交不允许用GET
要点说明:
- 表单的数据前端和后端都要需要验证有效性,比如密码不得为空,邮箱不能瞎填等
- 注册的时候用户名和邮箱必须唯一
- 弱密码检查:密码不能为纯数字
密码重置
登录界面上面点击忘记密码进入密码重置页面
要求用户输入自己的注册邮箱,若注册邮箱有在系统上登记,则向邮箱发送重置密码链接
通过重置密码链接到达重置密码页面,输入新密码完成修改密码
-
请思考并解决如下问题:
- 用户的密码被非法用户恶意更改,无法登录网站,因此用户想修改密码后,顺便把非法用户踢下线。要怎么做呢?
用户资料管理
用户资料的几个字段:用户名、邮箱、密码、头像(以文件名储存)、提问箱的开启状态
邮箱
修改邮箱需要用户输入密码验证
用户邮箱修改之后必须重新激活
-
请思考并解决如下问题:
用户在注册的时候不小心输错了邮箱导致无法激活账户怎么办?
如果修改的新邮箱和其他用户的邮箱重复了怎么办?
密码
修改密码要求提供原密码
-
请思考并解决如下问题:
用户不小心在修改密码的时候打错了一个字符怎么办?有什么可以提高用户体验的办法?
用户知道了他的密码已经泄露,因此上网站修改了他的密码,但是非法用户已经在该用户修改密码前登录了账号怎么办?可以把非法用户踢下线吗?
用户名
- 可以随意修改,但一样不能为空。
-
请思考并解决如下问题:
- 既然允许使用用户名登录,并且也允许修改用户名,那么如果系统中已经有了一个叫
w2ol
的用户,另一个用户正在修改资料,想把用户名改成w2ol
,这时候怎么办,系统应该允许他修改吗?
- 既然允许使用用户名登录,并且也允许修改用户名,那么如果系统中已经有了一个叫
头像
头像未上传之前为系统默认头像,上传新头像则使用新上传的头像,修改头像无需验证密码
-
请思考并解决如下问题:
要是恶意用户上传了超大的文件怎么办?
如果有用户上传了一个exe文件或者上传了其他奇怪后缀名的文件(不是图片文件的后缀名)怎么办?
如果有用户上传了两个相同文件名的文件怎么办?
如果用户上传了一个损坏的图片怎么办?
提问箱的开启状态
- 默认关闭,只有验证绑定邮箱后用户才能手动开启。
提问箱管理(核心功能)
账户激活成功后可以开放自己的提问箱——也就是接受其他用户的提问。也可以向其他用户发起提问。
-
不能向对方发送提问的几种情况:
- 账户处于封禁状态或未激活
- 账户被对方拉黑
- 对方不开放提问箱(也就是不接受任何提问),则也不能向对方发起提问。
发送提问之后,对方将收到来自该用户的提问,在对方的账号中提问者是匿名的(即在对方的留言管理页面,只能看见提问的内容,但不能看见提问者)。但在网站管理后台中,是可以看见这个提问者是谁
提问箱管理页面可以查看已回复的提问、未回复的提问、已删除的提问
-
可以对提问进行回复,删除。举报提问者、拉黑提问者。举报/拉黑操作时顺便将提问标记为删除状态。
注:这里的删除是指假删除,也就是标记为删除状态,但在数据库中不用删除,用一个
deleted
字段标记其是否被删除即可。 已经举报或拉黑过不能重复拉黑。拉黑可以取消。已删除的提问可以恢复。
个人资料页面
用户的提问箱页面即是用户的个人资料页,展示用户的用户名、头像、有了回复的提问以及该提问的回复(已删除的提问当然不展示了)。在此页面中应有按钮可以向用户发起提问。
-
不展示该用户的提问的情况:
- 该用户提问箱未开启
- 用户处于封禁状态
未注册的用户也可以查看此页面,但是发提问需要注册
-
这里要特别说明的是,提问箱中的“提问者是匿名”不仅要体现在前端中,也要体现在后端中
什么意思呢?后端向前端返回的数据中包含了提问人,虽然在如下的前端页面中,没有显示出来,但是只要用户抓个包就能查到原始的这个
json
数据,自然就得到了questioner
——提问人,那匿名还有什么意义呢,所以怎么做?后端向前端返回的数据中当然不能包含提问人。bbb的提问箱 #1 问题:Do you like cookies?
{ "questions": [ { "id": 1, "questioner": "aaa", "questioned": "bbb", "title": "Do you like cookies?" } ] }
网站管理
- 举报管理中心可以处理用户的举报(对被举报人封禁,也可以不进行任何操作),提供举报的处理理由
- 用户总览页面显示每个用户的
激活状态
、封禁状态
、提问箱的问题数
、提问的数量
、回复提问的数量
- 可以根据用户名或是邮箱查找用户,对用户进行封禁/解封,查看这个用户的数据(所有收到的提问、回复的提问、发起的提问等)
- (加分项,配合站内消息实现)可以发布公告
站内消息(加分项)
- 有新公告、发起了举报、举报得到处理、提问收到了回复、被封禁/解封了、账户激活成功将会接收到一条站内消息
- 站内消息是默认是未读状态,阅读后标记为已读。站内消息优先展示未读的最新的消息。
用户风控功能(加分项)
- 记录用户的常用登录地点
- 检测异常登录行为向用户邮箱发送警告
- 在修改敏感信息(比如邮箱)的时候验证用户是否处在常用登录地点,要求用户提供在网站注册的大约时间等只有用户本人会知道的信息,否则拒绝修改邮箱
- 在用户密码被爆破时,比如频繁的登录失败时通过邮箱提醒用户
安全
XSS与CSRF
- 留言板类应用需要特别注意防范XSS攻击,利用XSS可以进行进一步进行CSRF盗取用户cookies等,项目的重点在于完善的安全措施,典型的XSS如下:
<img src=1 onerror=alert(1)/>
- 了解CSRF、XSS等可以自行上网收集资料
- 不用过滤关键词的方式实现防XSS攻击,你可以实现它吗?
接口与URL的安全
-
比如说有一个重置密码的接口:
/user/resetpassword/?username=xxx
按照正常的重置密码流程,用户请求密码重置之后会收到一封带有重置密码链接的邮件,用户只要点击这个URL输入新密码进行重置就好了。
进行密码重置之后,用户就知道了你密码重置的接口。但如果非法用户把URL的
username
参数改掉:改成其他用户,或者说管理员:/user/resetpassword/?username=admin
然后再访问,是不是就可以帮别人重置密码了呢?请思考并解决这个问题,最安全的做法是什么,你可以实现它吗?
密码安全
-
admin对应的md5值是21232f297a57a5a743894a0e4a801fc3,这个地球人都知道。
只要有人获取了你的数据库访问权限,那么是不是可以说只要看见md5值是21232f297a57a5a743894a0e4a801fc3的密码,就能知道它的明文是admin。
换而言之,还有还有很多这样的弱密码的MD5值被人提前算出来。
密码简单地进行哈希就足够了吗?最安全的做法是什么,你可以实现它吗?
其他要求
- 利用阿里云或腾讯云的学生优惠,购买一台自己的云主机,并在此云主机上部署这个项目,可以不用域名。
- 项目完成后上传到github并用markdown语法写一篇项目介绍,记得提供项目地址以便访问。
- 提供一个比较友好的前端界面,前端快速开发框架可以使用 Bootstrap 等,前后端交互可以使用 Thymeleaf 等模板引擎,也可以前后端分离开发,不限制自己选(尽量要美观!!!可以自己先逛一逛相关的设计网站再开始写。)
- 截止日期:5月4日 23:59:59
加分项
- 网站部署使用HTTPS
- 支持第三方登录
- 实现用户风控功能
- 实现站内消息功能
- 让你的同学们一起参与项目的测试
结语
这次作业内容相对多点,希望大家合理安排时间,尽力多学多实现功能,切忌半途而废,有任何问题都可以在群里提出。