互联网安全架构
常见的web攻击手段
- xss攻击(跨站脚本攻击 Cross Site Scripting)
- 攻击原理:
用户输入的数据变成了代码 - 防范:
需要对用户输入的数据进行html转义处理
- 攻击原理:
- CSRF攻击(跨站请求伪造 cross site request forgery)
- 攻击原理:
盗取受信任用户身份,利用该身份攻击存在csrf漏洞的网站进行攻击
攻击者要完成CSRF攻击需要用户做到以下几点:- 登录受信任的站点A,并在本地生成cookie
- 在不(清除站点A的cookie)的情况下,访问恶意站点B
- 防范:
- 将cookie设置为HttpOnly
- 增加token
- 通过 Referer 识别
- 攻击原理:
- sql注入攻击
- 通过把sql命令伪装成正常的http请求参数,传递到服务端,欺骗服务器最终指向恶意的sql命令,达到入侵目的
- 例:
用户如果提交 nick为zhangsan 密码为 ' or '1'='1 时如果形成下面的sql 就攻击成功了
select * from user where nick = 'zhangsan' and passwords = '' or '1'='1';
- 例:
- 防范
- 使用预编译语句
- 使用ORM框架
- 避免密码明文存放
- 处理好相应的异常
- 通过把sql命令伪装成正常的http请求参数,传递到服务端,欺骗服务器最终指向恶意的sql命令,达到入侵目的
- 文件上传漏洞
- 不能简单地通过后缀名来判断文件类型
- ,很多类型的文件起始的几个字节内容是固定的,根据这几个字节(魔数)的内容就可以确定文件类型
- imagemagick 与 jmagick的安装使用
- 不能简单地通过后缀名来判断文件类型
- DDos攻击(分布式拒绝服务攻击)
- 最dos基本的攻击是 利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器的响应
- 借助公共网络将数量庞大的计算机设备联合起来作为攻击平台,对一个或多个目标发动攻击,从而达到瘫痪目标主机的目的
- DDoS攻击手段
- SYN Flood 基于TCP
- DNS Query Flood 基于UDP
- CC攻击 基于http 攻击在应用层发起
- 其他攻击手段
- 常见的攻击手段还有DNS域名解析、CDN回源攻击、服务器权限提升,缓冲区溢出,以及一些依赖于平台或者具体软件漏洞的攻击
常见的安全算法
- 数字摘要
- 计算出来的摘要的长度是固定的
- 输入不同,摘要以后产生的摘要消息也不同,相同的输入必定会产生相同的输出
- 消息摘要不包括原文的完整信息,因此只能正向的信息摘要,无法从摘要中恢复出原来的信息
- 常见的算法有:
- MD5
- SHA
- 十六进制编码
- Base64编码
- 彩虹表破解Hash算法
- 对称加密算法
- DES
- AES
- 非对称加密算法
- RSA算法
- 数字签名
- MD5withRSA
- SHA1withRSA
- 数字证书
- X.509 大多数的数字证书都以这种标准的格式来存储它们的信息
- 证书签发
- 证书校验
- 证书管理
- 证书的使用
摘要认证
- 摘要认证的原因
- 摘要认证的原理
- 摘要认证的实现
签名认证
- 签名认证的原理
- 与摘要认证相比,签名认证的优势在于加密时使用的是私钥,而解密时使用的是对外公开的公钥,私钥由私钥持有者保管,安全性大大提高,但相较于摘要认证,签名认证所使用的非对称加密算法将消耗更对的时间和硬件资源
- 签名认证的实现:
签名认证的实现与摘要认证的实现类似,都需要经过四步- 客户端参数签名生成
- 服务端参数签名校验
- 服务端响应签名生成
- 客户端响应签名校验
HTTPS协议
- 协议原理
- HTTPS的全称是 Hypertext Transfer Protocol over Secure Socket Layer 即基于ssl的http协议
- https既支持单向认证也支持双向认证
- SSL/TLS
- SSL协议的优势 与应用层协议无关,在应用层通信之前就已经完成加密算法,通信密钥的协商以及服务端对客户端的认证,在此之后所有应用层协议所传输的数据都会被加密
OAuth协议
系统稳定性
-
在线日志分析
- 日志分析常用命令
- cat 与 more 与 less
- tail 与 head
- sort
- wc 统计指定文件中的字符数、字数、行数并输出统计结果
- uniq 显示文件中重复出现的行
- grep
- find
- expr 表达式求值
- tar 文件归档
- curl url访问工具
- 查看请求访问量 与 查看最耗时页面 与统计404请求的占比 (综合例利用上面的命令)
- 日志分析脚本
- sed编辑器
- awk 程序
- shell脚本
- 日志分析常用命令
-
集群监控
-
监控指标
- load 特定时间间隔内运行队列中的平均线程数 使用uptime命令查看
- CPU利用率
- 磁盘剩余空间
- 网络 traffic
- sar 查看系统的网络状况
- 磁盘 I/O
- 内存使用
- qps(query per second) 每秒查询数
- rt (response time) 请求的响应时间
- select/ps 记录了数据库每秒处理的select语句的数量
- update/ps、delete/ps 数据库每秒处理update、delete语句的数量
- GC (Minor GC 与 Major GC)
-
心跳检测
- ping
- 应用层检测 (curl指令),可以通过shell实现应用监控的脚本,然后定时执行脚本来进行检测
- 业务检测
- 通过页面的大小判断页面是否出现异常
- 检测页面的返回值
-
容量评估及应用水位
-
-
流量控制
- 流量控制实施
流量控制可以从多个维度进行,例:对系统的总并发请求数进行限制、限制单位时间内的请求次数、通过白名单机制来限制每个接入系统调用的频率等 - 服务稳定性
- 依赖管理
- 优雅降级
- 服务分级 服务提供者需要对服务消费者的优先级进行区分,哪些调用将影响核心链路,哪些调用时非核心链路。当系统压力过大、无法承载时,必须确保等级高是应用、核心的调用链路优先确保畅通,而对于重要性不那么高的应用,可以暂时“丢车保帅”
- 开关 预定义一些开关来控制程序的服务提供策略
- 应急预案
- 高并发系统设计
- 操作原子性 mysql事务
- 多线程同步
- 数据一致性
- 强一致性
- 弱一致性(最终一致性是其一种形式)
- 系统可扩展性 (CAP理论 系统的一致性、可用性及可扩展性
- 实例:并发减库存 如果使用innodb存储引擎,为了解决行锁导致的并发资源利用的问题,可以将一行库存拆分成多行
- 性能优化
- 寻找性能瓶颈
- 前端优化工具---YSlow
- 页面响应时间
- firebug工具
- 服务端的response time时间
- 方法响应时间
java 环境下动态跟踪工具 -- btrace - GC日志分析
- 数据库查询 (慢日志)
- 系统资源使用 (CPU密集型、网络密集型、磁盘I/O密集型、内存使用密集型等)
- 性能测试工具
- ab (ApacheBench)
- Apache JMeter 在执行性能测试的同时可以通过一些工具(如 jconsole<jdk自带>、visualVM)来远程实时查看测试机的负载、内存使用、GC等情况
- HP LoadRunner
- 反向代理引流 (负载均衡)
- TCP Copy
- 性能优化措施
- 前端性能优化
- 页面的http请求数量
- 是否使用cdn网络
- 是否使用压缩
- 程序优化
- 单例模式
对于I/O处理、数据库连接、配置文件解析加载等一些非常耗费资源的操作,我们可以始终使用一个公用的实例以节约系统开销 - (java)Future模式
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。 - (java)线程池
既可避免因过多线程导致的内存溢出,任务完成后线程还可以重用,减少了线程的创建和销毁的本身的消耗 - 选择就绪
使用NIO代替阻塞I/O能提高程序的并发吞吐能力,降低系统的开销 - 减少上下文切换
- 降低锁竞争
- 尽可能缩短锁持有的时间
- 将一部分与锁无关的代码移出同步代码块
- 减小锁的粒度 将原先使用单独锁来保护的多个变量变为采用多个相互独立的锁分别进行保护以降低线程请求锁的几率
- 放弃使用独占锁 对于多读少写的情况下,使用读写锁能够比使用独占锁提供更高的并发数量
- 压缩
- 结果缓存
- 数据库查询性能优化
1.合理使用索引 (mysql的MyISAM使用B树)(mysql的InnoDB是哦用B+树)
索引的使用遵守最左原则
2. mysql使用explain命令用来解释和分析sql语句
3. 反范式设计
将一些常查询且不常修改的字段冗余存储
4. 使用查询缓存
5. 使用搜索引擎(在分表分库分布式的时候)
6. 使用key-value数据库
7. GC优化 通过日志分析 (尽量降低Full GC的频率)
8. 硬件提升性能 - java应用故障排查
- 常用工具
- jps 类似于linux的ps命令 可以方便地找到进程主类对应的进程ID
- jstat 对虚拟机各种运行状态进行监控的工具(可以查看到虚拟机的类加载与卸载情况,管理内存使用和垃圾收集等信息监视JIT即时编译器的运行情况等)
- jinfo 查看应用程序的配置参数及打印运行jvm时所指定的jvm参数
- jstack 生成虚拟机当前的线程快照信息
- jmap 查看待回收对象的队列,查看堆的概要信息(包括采用哪种GC手机器,堆空间的使用情况,以及通过JVM堆的转储快照)
注jmap执行堆dump操作时,由于生成的转出文件太大将耗费大量的资源 - BTrace java程序动态跟踪工具
- JConsole jdk内置的图形化性能分析工具
- Memory Analyzer (MAT) 全称为Eclipse Memory AnalyzerTool 是java堆分析工具,能快速找到占用堆内存空间最多的对象
- VisualVM
- 常用工具
- 尽可能缩短锁持有的时间
- 单例模式
- 前端性能优化
- 寻找性能瓶颈
- 流量控制实施
数据分析
不懂