CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
- 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
- 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的 href、src 等属性中,包含 javascript: 等可执行代码。
- 在 onload、onerror、onclick 等事件中,注入不受控制代码。
- 在 style 属性和标签中,包含类似 background-image:url("javascript:..."); 的代码(新版本浏览器已经可以防范)。
- 在 style 属性和标签中,包含类似 expression(...) 的 CSS 表达式代码(新版本浏览器已经可以防范)。
XSS 分类
类型 | 存储区* | 插入点* |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库/前端存储/URL | 前端 JavaScript |
目前在使用的消息中间件是RocketMQ和kafka
- Rocket 特点
RocketMQ是一个分布式消息和流处理平台,具有低延迟,高性能和高可靠性,亿万级容量和灵活的可扩展性。它由四部分组成:名称服务器,代理服务器,生产者和消费者。它们中的每一个都可以水平扩展,而不会出现单点故障。
- Kafka 特点
支持消息的发布和订阅,这个和RocketMq类似;支持数据实时处理;能保证消息的可靠性投递;支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错;高吞吐率,单 Broker 可以轻松处理数千个分区以及每秒百万级的消息量。
- Rocket和Kafka的区别
比较项 | RocketMq | Kafka |
---|---|---|
顺序消息 | 确保分区内的消息的顺序 | 确保严格的消息顺序,并能优雅的扩展 |
定时消息 | 不支持 | 支持 |
批量消息 | 支持,异步生产 | 支持,使用同步的模式以避免消息丢失 |
广播消息 | 不支持 | 支持 |
消息过滤 | 支持, 可以使用Kafka流来筛选消息 | 支持,基于SQL92的属性筛选表达式 |
服务器端触发的重试 | 不支持 | 支持 |
消息存储 | 高性能存储 | 高性能和低延迟文件存储 |
消息可追溯 | 支持 | 支持,时间戳和偏移量 |
消息优先级 | 不支持 | 不支持 |
管理和操作工具 | 支持,通过终端命令可以进行配置 | 开箱即用, 用户只需要注意一些配置 |
- 具体指导
中台应用间的业务消息都是通过RocketMQ来进行,一般性的应用消息通过RocketMQ来进行,RocketMQ对业务消息提供了更高的可用性、管理方便、使用上可以按Topic进行筛选等特点。
但结合业务特点,比较计量数据, 需要进行高速大批量进行写入和消费,消费方固定,但对实时顺序性等要求没有那么高的可以考虑kafka
- 目前中台在使用的NoSQL数据库主要有
-
HBase
-
MongoDB
-
ElasticSearch
-
Redis
- HBase
Hbase,是一个高可靠、高性能、可伸缩的分布式数据库。Hbase参考了谷歌的BigTable建模,使用HDFS作为底层存储。使用Zookeeper作为协同服务组件。
可以提供数据的实时随机读写的NoSQL数据库,他的特点如下:
-
Hbase的表没有固定的字段定义
-
Hbase的表中每行存储的都是一些key-value对
-
Hbase的表中有列族的划分,用户可以指定将哪些kv插入哪个列族
-
Hbase的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中
-
Hbase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复
-
Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型
-
HBASE对事务的支持很差
HBASE相比于其他nosql数据库(mongodb、redis、cassendra、hazelcast)的特点:
- Hbase的表数据存储在HDFS文件系统中
- 存储容量可以线性扩展; 数据存储的安全性可靠性极高!
*如果要使用HBase,对于数据的RowKey怎么设计需要慎重考虑,RowKey的设计会极大的影响后续的业务便利性,而且一段设计定型了,后续也很难更改。*
-
MongoDB
-
ElasticSearch
ES特性:是一个分布式、可扩展、实时的搜索与数据分析引擎。
-
全文搜索
-
结构化数据的实时统计
-
数据分析
-
复杂的人类语言处理
-
地理位置和对象间关联关系等
ES特点(有点):
- 速度快:当数据量到达千万级以上的时候,关系型数据库单表无论是通过增加索引、分库分表来优化,最终能够优化的效果往往不如人意(且分库分表复杂度较高),而ES可以轻松hold住千万、亿级数据量。
- 不只是全文检索:在传统关系型数据库中,我们很多使用需要采用模糊查询的方式来获取想要的数据,LIKE '%检索项%', SQL不会走索引的(不符合最左前缀原则),将执行全表扫描,性能很差。 但在ES中实现上述的查询则很简单,可以实时的查询到想要的结果。
- Redis
Redis是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库。value的数据类型支持主要有 String、List、Hash、Set、ZSet 这5种。
Redis的应用场景主要有:
-
String
-
- 取最新N个数据的操作如:可以将最新的10条评论的ID放在Redis的List集合里面
- 模拟类似于HttpSession这种需要设定过期时间的功能
-
- 缓存: Redis提供了键过期功能,也提供了灵活的键淘汰策略
- 计数器:什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等
-
- 分布式锁 : 可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败
- 分布式Session
-
- 限流
-
Hash
-
- 存储用户信息
- 用户主页访问量
-
- 组合查询
-
List:微博关注人时间轴列表、简单队列
-
- Redis提供的有序集合数据类构能实现各种复杂的排行榜应用
-
Set
-
- 赞、踩
- 标签
-
- 好友关系
-
Zset:排行榜
- 定时任务使用场景
-
定时备份数据
-
业务(订单)超时自动取消
-
业务(订单)失败后的定时重试
-
按时间段统计信息
-
业务定期(优惠券要过期)给用户发送提醒消息等。
- 定时任务的基本概念
执行器:负责执行任务。
调度器:根据配置(cron表达式)详情,告知执行器去执行任务
任务:自己的业务实现,比如优惠券要过期给用户发送一个提醒。
- 使用xxl-job任务需要注意的地方
-
定时任务是靠机器按crob表达式进行调度的,都是有一定的的延迟,如果有一个业务要求12:00分生效,理想情况下也会有几秒的延迟,不可能12:00准时生效。
-
xxl-job只是一个触发入口,具体的实现时需要业务来处理的。
-
对耗时严重的任务,建议仅仅通过xxl-job进行触发,触发后以异步方式执行,不要占用xxl-job的链接资源。
-
对大批量的任务,最好结合MQ队列一起来处理。
xxl-job接入指南 :https://qianxun.yuque.com/ddad5m/ykumxg/kgb6h9
开发过程中经常性的需要对数据进行缓存,常用的缓存技术手段基本有下面几个
-
无外部依赖的,jdk自身提供的 HashMap/ConcurrentHashMap
-
单机缓存管理,简单引入jar包的guava
-
分布式缓存管理,使用redis,memcache等
这里重点强调下使用分布式缓存的选型,为了提高大家的编码效率,编码一致性,缓存的统一处理框架推荐使用JetCache:
https://github.com/alibaba/jetcache
https://github.com/alibaba/jetcache/wiki/Home_CN
- 性能指标分解
系统性能指标
子系统性能指标
- 性能监控
是否需要性能方面的监控,如过需要,请给出明确的监控指标项。
- 限流和降级
限流和降级是否需要,策略,及使用的技术方案。
-
性能相关设计策略与性能需求的映射关系
-
架构设计阶段提前做好快速定位性能问题或故障的预案。SkyWalking作为默认需要接入的。
对请求的各个环节、链路进行分析,找到可能出现瓶颈的地方,是前端需要优化,还是后端服务需要优化,还是存储需要优化。