请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法
https://github.com/xuanliupc/geek
互联网系统面临的安全问题和应对方法
XSS攻击
攻击者推送含恶意脚本的连接给用户,用户打开后进行攻击的手段。
XSS 攻击者一般都是通过在请求中嵌入恶意脚本达到攻击目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些HTML 危险字符转义,如“>”转义为“>”、“<”转义为“<”等,就可以防止大部分攻击。为了避免对不必要的内容错误转义,如“3<5”中的“<”,需要进行文本匹配后再转义,如“<img src=”这样的上下文中“<”才转义。事实上,消毒几乎是所有网站最必备的XSS 防攻击手段。
SQL注入攻击
当系统使用sql拼接的方式来执行业务处理,攻击者在知道了表结构的情况下,可以通过sql特殊字符的方式来获取系统数据或对系统造成危害。
使用SQL预编译手段,绑定参数是最好的防SQL 注入方法。目前许多数据访问层框架,如myBatis,Hibernate 等,都实现SQL 预编译和参数绑定,攻击者的恶意SQL 会被当做SQL 的参数,而不是SQL 命令被执行。
CSRF攻击
用户登录受信服务器后,攻击者通过让用户访问攻击者服务器的方式,来向受信服务器发送攻击请求。
CSRF 是一个伪造用户请求的操作,所以需要构造用户请求的所有参数才
可以。表单Token 就是阻止攻击者获得所有请求参数的可能,在页面表单中增加一个随机数Token,每次请求的Token 都不相同,请求提交后检查Token 的值是否正确以确定请求提交者是否合法。
高可用系统的度量
可用性指标
业界通常用多少个9来衡量网站的可用性,如QQ 的可用性是4个9,即QQ 服务99.99%可用,这意味着QQ 服务要保证其在所有运行时间中,只有0.01%的时间不可用,也就是一年中大约53分钟不可用。
网站年度可用性指标=(1-网站不可用时间/年度总时间)×100%网站不可用时间(故障时间)=故障修复时间点-故障发现(报告)时间点对可用性的定性描述,两个9是基本可用,年度停机时间小于88小时;3个9较高可用,年度停机时间小于9小时;4个9是具有自动恢复能力的高可用,年度停机时间小于53分钟;5个9是极高可用性,年度停机时间小于5分钟。
引发故障主要有以下几个原因:
- 硬件故障
- 软件bug
- 系统发布
- 并发压力
- 网络攻击
- 外部灾害
高可用系统架构
解耦
- 高内聚、低耦合的组件设计原则
- 面向对象基本设计原则
- 面向对象设计模式
- 领域驱动设计建模
隔离
- 业务与子系统隔离
- 微服务与中台架构
- 生产者消费者隔离
- 虚拟机与容器隔离
异步
- 多线程编程
- 反应式编程
- 异步通信网络编程
- 事件驱动异步架构
备份
- 集群设计
- 数据库复制
幂等
应用调用服务失败后,会将调用请求重新发送到其他服务器,但是这个失败可能是虚假的失败。比如服务已经处理成功,但是因为网络故障应用没有收到响应,这时应用重新提交请求就导致服务重复调用,如果这个服务是一个转账操作,就会产生严重后果。
服务重复调用有时候是无法避免的,必须保证服务重复调用和调用一次产生的结果相同,即服务具有幂等性。有些服务天然具有幂等性,比如将用户性别设置为男性,不管设置多少次,结果都一样。但是对于交易等操作,问题就会比较复杂,需要通过交易编号等信息进行服务调用有效性校验,只有有效的操作才继续执行。
事务补偿
通过执行业务逻辑逆操作,使事务回滚到事务前状态
熔断
当某个服务出现故障,响应延迟或者失败率增加,继续调用这个服务会导致调用者请求阻塞,资源消耗增加,进而出现服务级联失效,这种情况下使用断路器阻断对故障服务的调用。
限流
在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系统崩溃,所有的用户都不可用要好。
限流的几种算法
- 计数器算法(固定窗口,滑动窗口)
- 令牌桶算法
- 漏桶算法