JAVA第五次考核

考核题目:匿名の提问箱

参考项目:

  • https://peing.net/
  • https://zh.wikipedia.org/wiki/Peing

简介

提问箱采取提问者匿名、回答者公开ID的方式,允许用户以匿名方式向某位注册用户提问。

用户角色

  • 网站管理员
  • 普通用户(普通用户可以选择接受提问其他用户的提问,也可以选择完全不接受任何提问,也可以向接受提问的其他用户发起提问)
  • 未登录用户

考核重点

从实质上来说,这就是一个具有匿名功能的升级版留言板,考核的目的在于考验成员对于Web应用的身份验证流程的认识和基本的Web应用安全措施,可以说这次是针对第四次考核中出现的Get请求发送用户密码、明文密码存数据库、密码hash不加salt、任意文件读取等等的一系列问题设计的考核。要求成员掌握XSS防护CSRF防护基本的身份验证流程

功能

注册登录

  • 基本的注册登录流程,使用用户名或邮箱都可以登录
  • 注册后账户为未激活状态,需通过验证邮箱激活,未激活不能接收提问和发送提问
  • 注册表单要求有邮箱、用户名、密码,并且注册登录时要求都要验证码
  • 注册的时候密码要求输入两次并且两次都一致
  • 密码需要前端哈希后发送到后端不允许明文传输密码
  • 验证码为基本的图形验证码就可以,不要求滑块、reCaptcha等
  • 表单提交不允许用GET

要点说明:

  1. 表单的数据前端和后端都要需要验证有效性,比如密码不得为空,邮箱不能瞎填等
  2. 注册的时候用户名和邮箱必须唯一
  3. 弱密码检查:密码不能为纯数字

密码重置

  • 登录界面上面点击忘记密码进入密码重置页面

  • 要求用户输入自己的注册邮箱,若注册邮箱有在系统上登记,则向邮箱发送重置密码链接

  • 通过重置密码链接到达重置密码页面,输入新密码完成修改密码

  • 请思考并解决如下问题:

    1. 用户的密码被非法用户恶意更改,无法登录网站,因此用户想修改密码后,顺便把非法用户踢下线。要怎么做呢?

用户资料管理

用户资料的几个字段:用户名、邮箱、密码、头像(以文件名储存)、提问箱的开启状态

邮箱

  • 修改邮箱需要用户输入密码验证

  • 用户邮箱修改之后必须重新激活

  • 请思考并解决如下问题:

    1. 用户在注册的时候不小心输错了邮箱导致无法激活账户怎么办?

    2. 如果修改的新邮箱和其他用户的邮箱重复了怎么办?

密码

  • 修改密码要求提供原密码

  • 请思考并解决如下问题:

    1. 用户不小心在修改密码的时候打错了一个字符怎么办?有什么可以提高用户体验的办法?

    2. 用户知道了他的密码已经泄露,因此上网站修改了他的密码,但是非法用户已经在该用户修改密码前登录了账号怎么办?可以把非法用户踢下线吗?

用户名

  • 可以随意修改,但一样不能为空。
  • 请思考并解决如下问题:
    1. 既然允许使用用户名登录,并且也允许修改用户名,那么如果系统中已经有了一个叫w2ol的用户,另一个用户正在修改资料,想把用户名改成w2ol,这时候怎么办,系统应该允许他修改吗?

头像

  • 头像未上传之前为系统默认头像,上传新头像则使用新上传的头像,修改头像无需验证密码

  • 请思考并解决如下问题:

    1. 要是恶意用户上传了超大的文件怎么办?

    2. 如果有用户上传了一个exe文件或者上传了其他奇怪后缀名的文件(不是图片文件的后缀名)怎么办?

    3. 如果有用户上传了两个相同文件名的文件怎么办?

    4. 如果用户上传了一个损坏的图片怎么办?

提问箱的开启状态

  • 默认关闭,只有验证绑定邮箱后用户才能手动开启。

提问箱管理(核心功能)

  • 账户激活成功后可以开放自己的提问箱——也就是接受其他用户的提问。也可以向其他用户发起提问

  • 不能向对方发送提问的几种情况:

    1. 账户处于封禁状态或未激活
    2. 账户被对方拉黑
    3. 对方不开放提问箱(也就是不接受任何提问),则也不能向对方发起提问。
  • 发送提问之后,对方将收到来自该用户的提问,在对方的账号中提问者是匿名的(即在对方的留言管理页面,只能看见提问的内容,但不能看见提问者)。但在网站管理后台中,是可以看见这个提问者是谁

  • 提问箱管理页面可以查看已回复的提问未回复的提问已删除的提问

  • 可以对提问进行回复,删除举报提问者、拉黑提问者。举报/拉黑操作时顺便将提问标记为删除状态

    注:这里的删除是指假删除,也就是标记为删除状态,但在数据库中不用删除,用一个deleted字段标记其是否被删除即可。

  • 已经举报或拉黑过不能重复拉黑。拉黑可以取消。已删除的提问可以恢复。

个人资料页面

  • 用户的提问箱页面即是用户的个人资料页,展示用户的用户名、头像、有了回复的提问以及该提问的回复(已删除的提问当然不展示了)。在此页面中应有按钮可以向用户发起提问。

  • 不展示该用户的提问的情况:

    1. 该用户提问箱未开启
    2. 用户处于封禁状态
  • 未注册的用户也可以查看此页面,但是发提问需要注册

  • 这里要特别说明的是,提问箱中的“提问者是匿名”不仅要体现在前端中,也要体现在后端中

    什么意思呢?后端向前端返回的数据中包含了提问人,虽然在如下的前端页面中,没有显示出来,但是只要用户抓个包就能查到原始的这个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如下:

  • 了解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
  • 支持第三方登录
  • 实现用户风控功能
  • 实现站内消息功能
  • 让你的同学们一起参与项目的测试

结语

这次作业内容相对多点,希望大家合理安排时间,尽力多学多实现功能,切忌半途而废,有任何问题都可以在群里提出。

你可能感兴趣的:(JAVA第五次考核)