Skip to content

XydfLi/Anonymous-question-box

Repository files navigation

Anonymous-question-box

西二第五次考核——匿名の提问箱

使用方法

使用环境

浏览器

- 强烈推荐使用:360浏览器(记得切换到极速模式,否则可能出错!)

Chrome、IE9以上(可能部分PNG图片无法显示),IOS7以上、

普通用户

登入、注册页面(管理员无法登入)

http://39.101.199.3:8080/myProj-1.0-SNAPSHOT/views/login.html

用户名:普通用户

邮箱:690054845@qq.com

密码:123abc

管理员

登录页面(普通用户无法登入)

http://39.101.199.3:8080/myProj-1.0-SNAPSHOT/views/admin_login.html

用户名:admin

邮箱:xydflxy@sina.com

密码:admin123

注意事项

不知道为什么,服务器上登录花费的时间较长(第一次登录大概2~3分钟),本地测试的时候明明很快的。。。 ,所以强烈推荐本地运行

- 项目中的“views(local)”是本地运行时使用的前端代码,“views(server)”是放在服务器上运行时使用的前端代码,两者的区别只有访问后端接口不同。

本地运行

配置

Intelij IDEA2019.2.4、MySQL8.0.17.0、aoache-tomcat7.0.99、jdk-8u91、javaEE7

步骤

1、观看工程中的文件:运行前必看.txt

2、IDEA->Java Enterprise->RESTful Web Service

3、配置SDK、JavaEE、Aplication Server(相关版本参考上述)

4、添加Web Application和Maven支持

5、复制相关文件

- 6、将“views(local)”文件夹放到"myProj\web"文件夹中,并改名为“views”。

主要技术

JAVA后端

Jersey(JAX-RS-2.1.1)、JWT、AES、RSA、MD5、MVC、JDBC(Druid)、REST、Web Application4.0、Maven、前后端分离开发

前端(HTML、CSS、JavaScript)

Bootstrap4、jQuery、AJAX

接口文档

http://doclever.cn/controller/public/public.html#5e68d7f76bd54308f04c1d1b

主要功能

已完成考核要求的所有基本功能(通过下面链接查看,这里就不说了)

考核要求

https://www.jianshu.com/p/d797a9083723

加分项

已实现用户风控功能,具体如下

  • 记录用户的常用登录地点

  • 检测异常登录行为向用户邮箱发送警告

  • 在修改敏感信息(比如邮箱)的时候验证用户是否处在常用登录地点

  • 在用户密码被爆破时,比如频繁的登录失败时通过邮箱提醒用户

已实现站内消息功能(后端已实现,前端还未实现) ,具体如下:

  • 有新公告、发起了举报、举报得到处理、提问收到了回复、被封禁/解封了、账户激活成功将会接收到一条站内消息

  • 站内消息是默认是未读状态,阅读后标记为已读。站内消息优先展示未读的最新的消息。

前后端安全交互过程

  • 前端加密:前端先随机生成一个AES秘钥,再向后端申请获得后端的RSA公钥。利用AES私钥加密密文,再用RSA公钥加密AES私钥,将密文和加密后的私钥发给后端。

  • 后端解密:先用RSA私钥解密得到AES秘钥,再用AES秘钥解密密文,得到密码,并记录AES秘钥。

  • 后端加密:后端利用得到的AES秘钥加密密文,发给前端。

  • 前端解密:前端利用AES秘钥解密密文,得到密码。

考核中要求思考解决的问题

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

  • 回答: 在Java后端中维护一个Map<String, Date> OnlineAccount,记录的是每一个用户的登录时间,在进行JWT验证的时候,验证这里的时间是否与JWT中的时间一致,不一致则直接跳转到登录页面。回到问题上面来,用户修改密码以后,会把OnlineAccount里面的时间设置为null,这样非法用户在进行非法操作的时候JWT验证不通过,会强制跳转到登录页面。

  • 问题二:用户在注册的时候不小心输错了邮箱导致无法激活账户怎么办?

  • 回答: 在激活邮箱的时候会要求用户再输入一次邮箱,以这次的邮箱为准。

  • 问题三:如果修改的新邮箱和其他用户的邮箱重复了怎么办?

  • 回答: 修改邮箱的时候会进行判断,数据库中是否已经有了这个邮箱,有的话则不允许修改。

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

  • 回答: 用户在修改密码的时候会修改OnlineAccount(OnlineAccount的介绍参考问题一的回答)中的时间为null,则之前登录的用户会JWT验证失败,直接跳转到登录页面。

  • 问题五:既然允许使用用户名登录,并且也允许修改用户名,那么如果系统中已经有了一个叫w2ol的用户,另一个用户正在修改资料,想把用户名改成w2ol,这时候怎么办,系统应该允许他修改吗?

  • 回答: 如果数据库中已经存在了这个用户名,则不允许该用户修改,这样就不会出现重复的用户名。

  • 问题六:要是恶意用户上传了超大的文件怎么办?

  • 回答: Java后端中会判断文件的大小,如果文件大于2MB,则不允许上传。

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

  • 回答: 首先会判断文件后缀名,只有jpg、png格式能上传。接着清洗图片(清洗图中的非法代码,清洗掉伪装成jpg、png的非法文件等等),获得图片长、宽,添加一个透明的水印,如果操作失败,则为非法图片。

  • 问题八:如果有用户上传了两个相同文件名的文件怎么办?

  • 回答: 系统会生成一个随机不重复的名字,再判断数据库中是否重复,如果重复则再生成一个,直到不重复为止。

  • 问题九:如果用户上传了一个损坏的图片怎么办?

  • 回答: 利用问题七的回答中的清洗图片,可以找出损坏的图片。

  • 问题十:接口与URL安全

  • 回答: 在发送给用户的链接中,包含一个签名参数sign,它的值是加密过的用户信息、过期时间等等,后端会判断sign是否正确并在有效期内,非法则不进行操作并报告错误。

  • 问题十一:密码简单地进行哈希就足够了吗?最安全的做法是什么,你可以实现它吗?

  • 回答: 后端中对密码进行了加盐处理,做法是:原密码+原密码的前八位(不足八位的密码则取全部),将得到的字符串MD5加密后存储。

未解决问题

前端:显示信息的Table,如果在两个不同的Table中重复查询,会出现内容重叠的bug,解决方法就是查询另一个的时候刷新一下,这几天太忙了,刷新还没加上orz

前端or后端:不用过滤关键词的方式实现防XSS攻击。

版本

1.0

学习资料

阿里云服务器部署项目

https://blog.csdn.net/qq_32365919/article/details/81866974?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158857077319724843343403%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=158857077319724843343403&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v25-9

About

西二第五次考核——匿名の提问箱

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages