Web开发进阶

1.可靠性
可扩展性,服务降级,负载均衡
 
应用扩展
1.垂直扩展,方式:提升机器硬件,缺点,成本昂贵,扩展能力有限
2.水平扩展,方式:增加节点,优点:升级过程平花,硬件成本低,理论上无线扩展,确定:会增加系统的复杂度,维护成本高,服务须无状态的,可分布式的
 
数据库扩展
1.垂直拆分,一个库数据量太大,将业务紧密,表间关联密切的表划分在一起;
2.水平拆分,一个表的数据量太大,一表拆多表,根据查询使用情况确定规则
mysql单表容量不要超过5000万,正常业务不要超过1000万
 
spring动态数据源
分表组件,googledb shard,公司也有
 
考虑点
数据量,增长速度,QPS,切分规则
 
负载均衡
nginx反向代理服务器,http转发
 
策略
random,随机
roundrobin,轮询
leastactive,优先向处理较快的服务器
IPHash  根据IP来做hash,
ConsistentHash  根据内容做hash,机器有结果的localcache,请求直接打到该服务器
 
健康检查
Healthcheck.html
定期检查url是否能访问到,检查服务器状态是否存活
 
服务降级
对提供的服务进行分级,核心服务具有更高的优先级,不重要的服务降级
 
功能开关
qconfig 
 

2.性能
缓存,并发,池化,异步
性能优化的目标是声明
响应时间
吞吐量
影响性能的因素有那些
cpu,内存,磁盘,网络,javaGC
 
 
hashmap的连表rehash可能导致收尾相连导致死循环
 
如何判断哈希算法好坏
分散性
平衡性
单调性
 
synchronized(一直等待)/reentrantLock(有timeout)
可重入锁,互斥
 
ReadWriterLock读写锁
读锁是一种共享锁,写锁是一种排他锁,写锁和读锁有级别,
获取写锁要等待所有读锁都释放
 
缓存
hashmap
 
ConcurrentHashMap
 
Guava Cache
 
memcached 集群
水平扩展
如果机器增加,hash值映射怎么办
一致性hash
 
redis,数据结构丰富 
操作丰富 可持久化,如果分布式优先级队列sorted set
 
序列化
 
概念,将对象的状态信息转换为可以存储或者传输形式的过程
json
java serilization 显式指定id 
Hessian 
少用枚举
 
池化技术
场景 可服用资源,资源创建代价大
类型:线程池 executor 连接池jdbc dbcp c3p0 对象池 spring
连接池的参数
 
不推荐用Executors创建,而是ThreadPoolExecutor
 
弊端是
fixedThreadpool和singleThreadpool会产生oom
 
其他注意事项
创建线程或线程池 时请指定有意义的线程名,方便出错时回溯
县城内要catch异常,记录日志和监控
使用countDOwnlatch 进行异步转同步操作,县城退出前必须调用countdown
 
如何合理地估算线程池大小,假设N为cpu核数
1.纯cpu计算应用 N
2.IO密集型应用
上限 ((线程等待时间+县城CPU时间)/县城cpu时间)×cpu数目
下线 qps
 
异步
前端轮询,后端异步
Future/CountDownLatch
消息队列
QMQ/Kafka/AMQ/rabbitmq
QMQ和kafka区别,QMQ的消息在消息中心推送出去,KAfka是存在消息中心
 
HTTp
async-http-client
Apache httpComponents
 
Dubbo异步调用、参数回调(调用需要注意,防止被调用方挂掉)
 
推荐图书  web性能权威指南
 
 

web安全
机密:持卡人资料,薪资信息,员工手机号
敏感信息:
内部:研究方法,培训资料,客户资料,财务数据
 
敏感信息打码
 
证件号,前4位至后3位之间的隐藏处理,手机号码前3位至后4位之间的隐藏处理,邮箱前3位至@之间的隐藏处理,银行卡信息后4位以外的隐藏处理
 
通用web安全问题
 
sql注入
用户输入的内容拼接到sql语句中,一起提交给数据库执行,改变原sql语句执行逻辑,甚至可以获得数据库服务器的系统权限;
JDBC方案,采用预处理执行sql,preparedStatement,采用占位符,数据库将用户输入值替代?,不参加数据库语句的编译
 
mybatis
统一使用#{},不使用$
针对like查询,在程序中对参数拼接%符号,并在sql配置中使用#{}接受
针对orderby和groupby,使用枚举限定查询参数,在sql配置中使用foreach生成orderby和groupby参数
 
身份认证安全-验证码安全
短信验证码调用次数限制,横线限制,对ip和浏览器进行限制,纵向限制,对同一个用户进行限制
 
短信验证吗失效策略,错误次数,时间,
 
图片验证码失效策略,
 
业务逻辑安全-身份认证逻辑
查询用户信息应该通过cookie确认身份,禁止使用user=%s或者id=%s这种参数查询
身份cookie验证_q,_v,_t或者_s,禁止取cookie中的username作为用户在线标识
 
业务逻辑安全-支付校验逻辑
账户安全不等于支付安全
 
越权问题-原因和分类
越权访问,实际上就是指权限控制上出了问题,
在web应用中,访问控制可以分为两大类
垂直权限管理 低权限用户访问到了高权限用户能访问的资源
水平权限管理  同一级别的用户能相互访问
 
越权问题-方案
对于后台程序,默认应该拒绝无授权用户的访问
授权账号的角色级别要区分明确,避免纵向越权
应用程序是否验证,用户有权限访问资源
应用程序是否能保证,当前用户访问的资源是只授权给该用户的资源,避免水平越权;
从用户的加密认证cookie中获取当前用户的id,并且需要在执行的sql语句中加入当前用户id作为条件语句;
 
SSRF(Server-side request forgery)服务端请求攻击
内部url接口任意读取漏洞,可以通俗的理解为外部用户借助一些proxy功能的接口,实现了http代理功能,这种情况下如果proxy没有做任何限制,则允许外部用户通过接口读取任何的内部http服务;
原因:url么有做过任何限制,导致可以直接请求内部的任何url接口去查询信息
 
URL任意跳转
web应用程序接受到用户提交的url参数后,没有对参数做“可信任url”的验证,就向用户浏览器返回跳转到该url的指令
 
XSS攻击
croess site script 跨站脚本攻击,它是指恶意攻击者往web页面里插入恶意js代码,当用户浏览该页时,嵌入web中的代码会被执行,从而达到恶意攻击用户的特殊目的,xss属于被动式攻击,因为其被动且不好利用,所以经常被忽略;
危害:盗取用户cookie以及浏览器信息,伪造用户身份进行操作,衍生url跳转漏洞,网页挂马,控制受害者的机器对其他网站发起攻击,xss蠕虫
 
输出转码:除下列情况外,必须对输出到客户端的变量进行相应的编码转义,不允许直接输出;
content-type:application/javascript
content-type:text/javascript
content-type:application/json
 
参数校验
java使用ESAPI.encoder().encodeForxxxx 方法针对不同的语境,对输出标签进行编码;
cookie设置httponly,防止cooie跨域
 
文件上传
web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在允许的范围内,就把文件保存在服务器上,导致恶意用户可以上传任意文件,甚至上传恶意脚本木马到web服务器
原因:未判断上传文件扩展名,未考虑逻辑错误,上传目录有执行权限;
 
文件下载
处理用户请求下载文件时允许用户提交任意文件路径,并把服务器上对应的文件直接发给用户,比如../../
造成任意文件下载的威胁;
恶意用户会利用变换目录或文件地址,来下载服务器上的敏感文件
产生原因,未判断用户输入参数有效性
权限判断
 
解决上传下载问题,验证用户参数,限制../,权限判断,使用常量
 
CSRF cross-site request forgery 跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的
其本质是攻击者能轻易猜解到用户的参数
 
Refer限制
CSRFtoken,加一个猜不到的参数,攻击者就很难构造了
 
如果代理商需要访问内网后台,开放proxy之前需要做好权限控制和白名单
对目标url中的字串匹配不能防止url任意跳转问题,需要提取域名来做比较;
图片上传时,除了文件名的后缀校验,还要对文件内容进行校验;因为有些木马可以隐藏在图片文件中;;
穿上和下载目录只存放静态文件,禁止开放执行权限
 
 
 

安全问题
 
 
 
 
常见的坑
 
编码
全部使用utf8,可能有外部网站传入gbk编码的参数
 
Bom头问题(windows问题) 保存utf8会多加一些
 
svn diff 不要使用乌龟(不会提示文件编码改变)
 
外部资源响应慢
常见外部资源
database/cahe
dubbo
mq
http
外部依赖有问题时系统被拖死
 
解决办法
加监控
外部依赖必须设置合理超时时间
 
 
定时任务中断
常见原因,异常没有catch或着catch有问题
后果,定时任务在某个特殊的时候,就停止不运行了
解决办法,catch住所有异常,使用qschedule
 
 
分布式环境使用本地cache
后果产生内容不一致的情况
解决办法,redis 使用memcached
 
 
错误的数据更新方式
一批数据的全量更新(比如memcached)
采用删除全部,批量添加新数据
 
后果
虽然可能很快,可能在几秒之内可以完成,但是这个时间缝隙内数据就是有问题的、
解决办法,采用更新的方式;
 
 
缓存null值
问题,缓存null,以为未命中缓存
后果,数据库被一直打穿
解决办法,缓存的值要合理设计,null这种要另做处理
 
 
ThreadLocal在线程池环境下,使用后不清理
后果,内存泄露,数据错误
解决办法 避免使用或每次使用前后清理
 
 
分页查询
问题,批量分页查询没有限制最大个书
后果,恶意利用拖死服务器
 
解决办法
实现分页功能,要有默认值和最大值
 
故障平台
 
接口规范
接口数据格式变更需要事先通知调用方
接口状态枚举变更需要通知调用方
 
 

1.应用的申请、查找,废弃
2.维护应用开发人员列表
3.token管理下发
4.维护应用和实际运行机器的映射关系
5.监控及警报开关
6http及dubbo的访问限制管理
7日志收集相关配置
 
common基础类是什么(web必须依赖)
TCDev提供的一套基础依赖库
提供了公用组件共同的依赖,qconfig,qmq
提供了一些常用的功能
 
commonc-core最常用的依赖,提供应用中心和监控的接入
common-http 提供经过TCDev封装的同步和异步http client
common-web 提供http监控,标准httpAPI返回实现
common-rpc 以插件的方式为dubbo提供一些增强功能
common-block 提供http和dubbo的限流功能
 
 
 
posted @ 2017-11-15 00:12  icebearrr  阅读(397)  评论(0编辑  收藏  举报