1:跨站请求伪造
Session 认证中 Cookie 中的 SessionId是由浏览器发送到服务端的,借助这个特性,攻击者就 可以通过让⽤户误点攻击链接,达到攻击效果。
在我们登录成功获得 token 之后,⼀般会选择 存放在 local storage 中。然后我们在前端通过某些⽅式会给每个发到后端的请求加上这个 token, 这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了⾮法链接发送了请求到服务端,这 个⾮法请求是不会携带 token 的,所以这个请求将是⾮法的。
2:跨站脚本攻击(Cross Site Scripting) XSS。
Cross-site scripting(跨站脚本攻击) - 术语表 | MDN
XSS中攻击者会⽤各种⽅式将恶意代码注⼊到其他⽤户的⻚⾯中。就可以通过脚本盗⽤信息⽐如 cookie。
2.1 浏览器自带防御
HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个功能,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。
2.2 转义
在 XSS 攻击中,攻击者主要是通过构造特殊字符来注入脚本,所以对用户的输入进行检测就很有必要,并且需要在客户端与服务端都进行输入检测,然后对用户输入的数据进行转义。
主要就是对输入所包含的特殊字符进行转义,如 <,>,&,",',来防止 XSS 攻击。
2.3 过滤
在富文本中因为需要保留 HTML ,所以我们不能使用转义的方法防御 XSS 攻击,这里使用过滤的方式防御 XSS 攻击,也就是通过只使用白名单允许的 HTML 标记及其属性,来防御攻击。
这里推荐一个名为 XSS 的组件 ,这就是一个根据白名单过滤 HTML,防止 XSS 攻击的组件。
2.4 内容安全策略(CSP)
内容安全策略(Content Security Policy,CSP),实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,大大增强了网页的安全性。
3:多服务器节点下 Session-Cookie
(1)同一个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理
(2)每一个服务器保存的 Session 信息都是互相同步的
(3)单独使用一个所有服务器都能访问到的数据节点(比如缓存)来存放 Session 信息。
4:Token和jwt
Session 信息需要保存一份在服务器端。比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端等。基于 Token(令牌) 来做身份验证即可!我们这里说的是 Acesss Token,指的是访问资源接口(API)时所需要的凭证,比如说你访问 Github 的一些 API 的时候,需要带上一个 Token 来表明你有权访问。
JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称也可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。
5:SSO
单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统
6:OAuth 2.0
OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。
7:JWT
JWT 自身包含了身份验证所需要的所有信息,服务器不需要存储 Session 信息。增加了系统的可用性和伸缩性,减轻了服务端的压力。JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。
8:敏感词过滤- Trie 树算法 和 DFA 算法。
DFA(Deterministic Finite Automata)即确定有穷自动机,与之对应的是 NFA(Non-Deterministic Finite Automata,有穷自动机)。
9:定时任务详解
9.1 单机定时任务
9.1.1 Timer
9.1.2 ScheduledExecutorService
通过 Spring 提供的 @Scheduled 注解即可定义定时任务
9.1.3 Spring Task
/** * cron:使用Cron表达式。 每分钟的1,2秒运行 */
@Scheduled(cron = "1-2 * * * * ? ") public void reportCurrentTimeWithCronExpression() { log.info("Cron Expression: The time is now {}", dateFormat.format(new Date())); }
Spring Task 底层是基于 JDK 的 ScheduledThreadPoolExecutor 线程池来实现的。
9.1.4 时间轮
Kafka、Dubbo、ZooKeeper、Netty 、Caffeine 、Akka 中都有对时间轮的实现。
时间轮简单来说就是一个环形的队列(底层一般基于数组实现),队列中的每一个元素(时间格)都可以存放一个定时任务列表。
9.2 分布式定时任务
通常情况下,一个定时任务的执行往往涉及到下面这些角色:
- 任务 : 首先肯定是要执行的任务,这个任务就是具体的业务逻辑比如定时发送文章。
- 调度器 :其次是调度中心,调度中心主要负责任务管理,会分配任务给执行器。
- 执行器 : 最后就是执行器,执行器接收调度器分派的任务并执行。
Quartz、Elastic-Job、XXL-JOB和PowerJob等