1、路径遍历
奇安信安全漏洞扫描扫出来的结果,个人感觉不是很智能。
接收文件的接口,不允许调用创建文件或删除文件的方法。
接收文件时可以用MultipartFile接收,然后不再创建临时文件,尽量使用I/O流进行处理。
2、xss攻击
对传入的参数进行xss过滤,对特殊字符进行转义处理。
3、sql注入
输入具有风险的查询条件。${} 和 #{}的主要区别是#{}会在参数前后加入"",如参数是 keyword,拼接成sql语句是 "keyword",而${}会原封不动地把原来的字段拼接到sql语句上。
4、访问权限修饰符控制
敏感的访问权限修饰符,不能直接用true、false等关键字直接开启或关闭,以防被人恶意扫描到,应该用一些具有访问权限的类间接控制。
5、使用DNS名称作为安全性的依据
不能使用DNS名称进行安全验证,一个IP地址可以对应多个DNS名称,甚至可以伪造DNS名称,通过DNS名称判断访问来源不准确。
6、不安全的框架绑定
对传入接口的参数应该进行过滤,比如下面的代码,创建一个新用户,如果多传一个admin=true,就变成创建一个管理员了。
应该对传进来参数使用VO进行封装,避免多传参数额外的参数。
同理,响应给前端的字段也应该使用DTO封装,避免爆暴露所有字段名称。
反面例子:用户登录成功后将用户所有信息、字段响应回去。
7、密码管理:不安全的随机数
Random 类并不是一个线程安全的类,在并发量大的时候有可能会产生死循环。后来jdk修复了这个bug,推出了线程安全的SecureRandom类,创建随机数应该使用安全的 SecureRandom 类。
8、密码管理:硬编码密码
对密码不能直接在代码中赋值,应该从配置文件中获取经过加密的密码值。并且尽量不使用password等信息敏感字作为字段名。
9、修改密码时,根据传进来的id修改对应用的id
当前用户的id不能直接暴露出去,应该通过后端从session或者redis中获取。对当前用户的操作都不能通过传进来的id进行处理。
····
@SysLog(name = "更改密码")
@PostMapping("/changePass")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户id", required = true),
@ApiImplicitParam(name = "newPass", value = "新密码", required = true),
@ApiImplicitParam(name = "oldPass", value = "旧密码", required = true)
})
@ResponseBody
public MResponse changePass(@RequestParam("id") String id,
@RequestParam("oldPass") String oldPass,
@RequestParam("newPass") String newPass) {
····
10、登录时,发短信验证码接口和校验密码接口分开成两个,致使可以绕过手机号码
先访问验证密码接口,验证成功后返回用户手机号码,再携带获取的手机号码访问发送短信有验证码的接口。用户可以在验证密码成功后,另外发送一个手机号码访问发短信验证码的接口,从而绕过给账号用户本人发送短信这个步骤。
应该在一个接口里校验密码成功后立马发送短信。
11、登录时,验证短信验证码和执行登录接口分开成两个,致使可以绕过验证短信验证码
同上面,先访问验证短信验证码的接口,访问通过后,再访问执行登录的接口。用户可以绕过短信验证码验证,直接访问执行登录的接口。
应该在同一个接口里面完成两个步骤,验证短信后立马执行登录。
12、敏感信息暴露,信息泄密
- 用户登录成功后,将所有用户信息返回给前端,前端将所有用户信息保存在cookie中。
-
查询用户列表,将用户所有信息全部查询响应回去。
13、横向越权漏洞
横向越权:攻击者尝试访问与他拥有相同权限的其他用户的资源。
原因:查询、编辑、删除等操作的时候是需要传递响应数据id的,传入不是当前用户管理的id,造成横向越权。
对策:对目标数据进行判断,判断是否为当前用户有权限操作的数据。
14、纵向越权漏洞
纵向越权:攻击者尝试访问不属于他自己权限的资源
原因:隐藏菜单,按钮,从而限制用户访问某些接口的权限,但是用户可以不使用菜单、按钮,而直接在地址栏访问接口,造成纵向越权。
对策:给每个接口,每个用户建立数据访问权限,用户须拥有访问该接口权限,才允许访问。
15、跨站请求伪造
攻击者伪造一条删除数据的链接,引诱正常使用的管理员点击。管理员点击之后直接访问删除数据的链接,造成数据丢失。
对策:判断链接是否是从我们的静态页面来访问过来,如果不是,则拦截。
referer的作用:告诉服务器这次请求是从哪个页面链接过来的,如果是浏览器直接访问,则为空。