参考文章
若依源码学习8:防XSS攻击以及全局异常处理_小宇哥x的博客-优快云博客_若依xss
Xss简介
XSS (Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。XSS的原理是:
恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的时候,那么嵌入到web页面中script代码会执行,因此会达到恶意攻击用户的目的。
XSS攻击主要有三类:反射型、存储型、及 DOM-based型。 反射性和DOM-baseed型可以归类为非持久性XSS攻击。存储型可以归类为持久性XSS攻击。
- 反射型
XSS
(你提交的恶意数据成功的实现了XSS
,但是仅仅是对你这次访问产生了影响,是非持久型攻击)。 - 存储型
XSS
(你提交的数据成功的实现了XSS
,存入了数据库或者写入日志,别人访问这个页面的时候就会自动触发)。 DOM
型XSS
SQL 注入
SQL注入:通过客户端的输入把SQL命令注入到一个应用的数据库中,从而执行恶意的SQL语句。
打个比方:将输入的内容伪装成SQL语句我们有一个登录框,需要输入用户名和密码,然后在输入框输入 'or ‘111’ = '111 。我们在查询用户名和密码是否正确的时候,本来执行的sql语句是:select * from user where username = ‘’ and password = ‘’. 现在输入密码是上面这样的,然后我们通过参数进行拼接,拼接后的sql语句就是:
select * from user where username = ‘’ and password = ’ ’ or ‘111’ = '111 ';
与原来相比,多出一个or语句,只要这两个有一个是正确的话,就条件成立。因此密码验证就会被跳过。还有输入密码:
’; drop table user;,
sql命令就变成了:
select * from user where username = ‘’ and password = ‘’; drop table user;’
当SQL语句执行时,user表会被直接删除。
sql被攻击的原因是:sql语句伪造参数,然后对参数进行拼接后形成xss攻击的sql语句。最后会导致数据库被攻击。
防范的方法:
1、我们可以使用预编译语句(PreparedStatement,这样的话即使我们使用sql语句伪造成参数,到了服务端的时候,这个伪造sql语句的参数也只是简单的字符,并不能起到攻击的作用。
2、数据库中密码不应明文存储的,可以对密码使用md5进行加密,为了加大破解成本,所以可以采用加salt的方式。
XSS 攻击解决方案
1、配置文件
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice/*
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
2、自定义XSS攻击的过滤器
对于匹配的请求路径进行过滤,装饰者模式使用自定义的 Request 替换 原ServletRequest,继承HttpServletRequestWrapper重写 getParameterValues方法,对前端传递过来的参数进行检验和过滤。
因此,想要改变在httpServletRequest中的参数,可以通过httpServletRequest的装饰类HttpServletRequestWrapper来实现,只需要在装饰类中按照需要重写其getParameter(getParameterValues)方法即可。
全局异常处理
Spring boot/mvc项目中通过@RestControllerAdvice或者@ControllerAdvice配合@ExceptionHandler实现全局异常统一处理。
@RestControllerAdvice相当于Controller的切面,对异常统一处理,定制,这样更好返回给前端。
/**
* 全局异常处理器
*
* @author ruoyi
*/
@RestControllerAdvice
public class GlobalExceptionHandler
{
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
// 通过 AjaxResult 返回统一结果,以及日志的记录
1、请求方式不支持异常
2、拦截未知的运行时异常
3、自定义业务异常
4、自定义验证异常,也就是数据传入时的检查
5、运行时异常和系统异常
}