浏览器技术发展简史

浏览器是互联网应用中最常用的软件之一,它能够解释HTML等标记语言,并将其转化成可视化的网页。现代浏览器可以开发复杂的GUI应用。

WorldWideWeb(1989年)

万维网是由英国物理学家蒂姆·伯纳斯-李发明的,它是第一个基于超链接的信息共享系统。1989年,蒂姆·伯纳斯-李也发明了第一个Web浏览器WorldWideWeb,它能够在图形界面下显示网页,并且支持鼠标操作。

https://worldwideweb.cern.ch/

https://github.com/cynthia/WorldWideWeb

Mosaic(1993年)

Mosaic是由美国伊利诺伊大学厄巴纳-香槟分校的马克·安德森和埃里克·贾维茨等人发明的第一个流行的Web浏览器。Mosaic采用了图形用户界面,支持图片、音频和视频等多媒体内容的显示,是Web浏览器历史上的一次革命性突破。

Netscape Navigator(1994年)

Netscape Navigator是由Mosaic的主要开发者马克·安德森和吉姆·克拉克等人创立的Netscape公司开发的Web浏览器,它成为了互联网初期最流行的浏览器之一。Netscape Navigator的成功推动了Web浏览器技术的快速发展,也促进了互联网的商业化。

Internet Explorer(1995年)

Internet Explorer是由微软公司开发的Web浏览器,它自1995年推出以来,一直是世界上使用最广泛的Web浏览器之一。Internet Explorer采用了与操作系统集成的方式,使得它成为了Windows操作系统的一部分。

Safari(2003年)

Safari浏览器是由苹果公司开发的Web浏览器,它于2003年首次推出,是Mac OS X操作系统的默认浏览器。Safari采用了WebKit渲染引擎,这也是Chrome等现代浏览器所采用的渲染引擎之一。Safari在安全性和隐私保护方面做得相当出色,包括内置的反跟踪功能、自动阻止广告和网站追踪等。Safari浏览器也有适用于Windows操作系统的版本,但该版本已于2012年停止更新和维护。

Mozilla Firefox(2004年)

Mozilla Firefox是由Mozilla基金会开发的Web浏览器,它采用了开源的软件开发模式,推出后受到广泛关注。Firefox采用了高度定制化的方式,允许用户自由地添加插件和主题等功能,同时也是第一个支持标签式浏览的Web浏览器。

Google Chrome(2008年)

Google Chrome是由Google公司开发的Web浏览器,它采用了WebKit渲染引擎和V8 JavaScript引擎,速度快、稳定性高、用户体验优秀。Chrome还推出了独立的应用商店,支持Web应用的下载和安装。

Microsoft Edge (2015年)

Microsoft Edge浏览器是由微软公司开发的Web浏览器,它于2015年首次推出,是Windows 10操作系统的默认浏览器。Edge浏览器采用了与Chrome相同的Chromium渲染引擎和V8 JavaScript引擎。

开源的浏览器引擎

WebKit:苹果公司开发的一款浏览器引擎,它最初是为Safari浏览器所开发,后来被Google Chrome(28)、Opera、Vivaldi等浏览器所采用。

网站 https://webkit.org/

源码库 https://github.com/WebKit/WebKit

Blink:由Google主导开发的一款浏览器引擎,它是WebKit的一个分支,目前被Google Chrome、Microsoft Edge等浏览器所采用。

网站 https://www.chromium.org/blink/

源码库 https://chromium.googlesource.com/chromium/blink/

Gecko:Mozilla基金会开发的一款浏览器引擎,它被Firefox浏览器所采用,具有出色的灵活性和扩展性能力。

KHTML: KDE桌面环境开发的一款HTML渲染引擎,它是WebKit引擎的前身

Servo:Mozilla基金会和Samsung共同开发的一款浏览器引擎,它采用Rust语言开发,目前还在实验阶段。

网站 https://servo.org/

源码库 https://github.com/servo/servo/

浏览器支持的技术和标准

https://developer.mozilla.org/zh-CN/docs/Web

https://www.w3.org/

数据库内容多语言方案

场景:很多网站,app,等互联网应用,面向国际业务,需要支持多种语言。

方案一

调用第三方翻译API,如,百度翻译,谷歌翻译,有道翻译等等。在渲染页面或这响应接口之前调用api将内容翻译成目标语言,然后在展示。

缺点:依赖第三方服务,延迟高。

方案二

单表冗余字段设计,比如content字段,增加content_en content_fr …

适应于2个语种,字段少的情况。例如,只有content字段需要多语言,而且只有两种语种。

缺点:

  • 导致单表字段超出数据库设计规范,字段数会翻倍。
  • varchar和char类型 具有 65,535 字节的最大行大小限制,text字段也有容量限制
  • 缺少扩展性,维护的时候还需要增加表字段

方案三

单字段存储json,字段类型设为longText ;

场景:适合短文本少量语种,一旦超出文本限制,就不适用了,例如:长篇富文本多语言支持这类需求。

laravel ORM增加语言支持 扩展包 spatie/laravel-translatable 使用json方式存储

需要对多语言字段内容,增加唯一性验证时,使用 codezero-be/laravel-unique-translation

方案四

全表文本都需要翻译的情况,增加语言类型字段

languagenamecontent
zh-CN名称内容
ennamecontent

全表只有几个文本字段的情况,增加语言翻译扩展表

场景:扩展表设计适合,多语种,长文本存储

主表结构存储,不需要翻译文本的字段,附表结构参考上表格,增加关联id

laravel ORM增加语言支持 扩展包 Astrotomic/laravel-translatable 使用该方式实现 文档地址

参考

如何为 Eloquent 添加多语言支持

网址多语言设计

 MySQL TEXT 字段的限制

Api设计指南

基本概念

应用程序编程接口

按层级划分

操作系统->编程语言->框架类库->Web API

编程语言对操作系统的API封装,框架类库对编程语言API的封装, Web API是对框架类库的封装

按通讯方式划分

RPCREST APIWebSocket API
消息格式二进制Thrift,Protobuf,GRPC文本XML,JSON,GraphQL 二级制,文本json
通讯协议TCPHTTP,HTTP/2HTTP,websocket
性能一般 一般
接口契约IDLThrift,Protobuf IDLSwaggerSwagger
客户端强类型客户端HTTP客户端websocket客户端
框架Dubbo,GPRC,Thriftweb框架websocket框架
开发者友好一般自动生成存根、客户端、使用友好,二进制消息阅读不友好json可读性高,通用性json可读性高,通用性
应用场景服务间通讯推荐PRC对外暴露接口推荐REST大文件类的流式数据,语言识别服务

既然有HTTP协议,为什么还要有RPC

按应用场景划分

业务应用

app,小程序,pc站,手机站 等客户端提供 api

开放平台(Open API)

PaaSSaaS Serverless 平台的服务API

API设计必须要具备的指标

规范和风格

restful api 风格,laravel框架自带

Restful Api 风格规范研究

github路由风格,https://api.github.com/

全部小写,多单词时用短划线分隔

http://xxxx/register-phone

不要用下划线,下划线的域名和路由在一些第三方开放平台无法通过验证,如qq互联申请时

鉴权

OAuth2

Laravel搭建OAuth2.0服务

LaravelSanctum 授权 SPA场景

防止重放攻击

请求限流

浅谈api限流

按时间限流,req/minute

随机拒绝,如秒杀场景

api(路由)版本管理

Laravel路由版本控制的实现。

前端好用的轮子汇总

React UI 组件库

Ant Design :https://ant.design/
React Bootstrap: https://react-bootstrap.github.io/
MATERIAL-UI : https://material-ui.com/

Vue UI组件库

Element : https://element.eleme.io/#/zh-CN
vant : https://youzan.github.io/vant/#/zh-C%E2%80%A6
View UI : https://www.iviewui.com/

Alpine.js https://www.alpinejs.cn/

动画库

Animate.css : https://animate.style/


常用效果组件
swiper : https://www.swiper.com.cn/
mescroll.js http://www.mescroll.com/api.html

工具类轮子

lodash.js : https://www.lodashjs.com/
Day.js : https://dayjs.fenxianglu.cn/
timeago.js : https://github.com/hustcc/timeago.js
echarts : https://echarts.apache.org/zh/index.html
Meditor.md : https://pandao.github.io/editor.md/
validator.js : https://github.com/validatorjs/validator.js

Vue工具类

vue-draggable : https://www.itxst.com/vue-draggable/tutorial.html
vue-qr : https://www.npmjs.com/package/vue-qr
vue-cropper : https://github.com/xyxiao001/vue-cropper
vue-lazyload : https://www.npmjs.com/package/vue-lazyload

vue-simple-upload : https://github.com/saivarunk/vue-simple-upload

vue-awesome-swiper (swiper的vue封装) https://github.com/surmon-china/vue-awesome-swiper

CSS

tailwindcss https://www.tailwindcss.cn/

sass https://sass.bootcss.com/documentation

less https://less.bootcss.com/

Mysql安全指南

禁用local-infile选项访问控制描述

禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置local-infile参数为0,并重启mysql服务:

local-infile=0

确保没有用户配置了通配符主机名身份鉴别描述

避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网检查提示

–加固建议

执行SQL更新语句,为每个用户指定允许连接的host范围。

  1. 登录数据库,执行use mysql; ;
  2. 执行语句select user,Host from user where Host='%';查看HOST为通配符的用户;
  3. 删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%'; 。更新语句:update user set host = <new_host> where host = '%';
  4. 执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;

禁用symbolic-links选项服务配置描述

禁用符号链接以防止各种安全风险检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置symbolic-links=0,5.6及以上版本应该配置为skip_symbolic_links=yes,并重启mysql服务。

修改默认3306端口服务配置描述

避免使用熟知的端口,降低被初级扫描的风险检查提示

–加固建议

编辑<conf_path>/my.cnf文件,[mysqld] 段落中配置新的端口参数,并重启MySQL服务:

port=3506 

为MySQL服务使用专用的最低特权账户访问控制描述

使用最低权限账户运行服务可减小MySQL天生漏洞的影响。受限账户将无法访问与MySQL无关的资源,例如操作系统配置。检查提示

–加固建议

使用非root和非sudo权限用户启动MySQL服务

禁止使用–skip-grant-tables选项启动MySQL服务访问控制描述

使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,删除skip-grant-tables参数,并重启mysql服务

删除’test’数据库服务配置描述

测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。检查提示

–加固建议

登录数据库执行以下SQL语句删除test数据库:

DROP DATABASE test;
flush privileges;

确保配置了log-error选项安全审计描述

启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld_safe] 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:

log-error=<log_path>

确保log-raw选项没有配置为ON安全审计描述

当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,删除log-raw参数,并重启mysql服务

匿名登录检查身份鉴别描述

检查MySQL服务是否允许匿名登录检查提示

–加固建议

登录MySQL数据库,执行以下命令删除匿名账户:

 delete from user where user='';
flush privileges;

数据库登录弱口令身份鉴别描述

若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复。检查提示

–加固建议

登录mysql数据库;
查看数据库用户密码信息:`SELECT user, host, authentication_string FROM user;` 部分版本查询命令为:`SELECT user, host, password FROM user;` 
根据查询结果及弱密码告警信息修改具体用户的密码:`SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');`
执行刷新命令:`flush privileges;` 

新口令应符合复杂性要求:

1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等

Redis安全指南

开启redis密码认证,并设置高复杂度密码 身份鉴别描述

redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。 redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破。 检查提示

存在弱密码(配置文件|密码):/usr/local/redis/etc/redis.conf|加固建议

打开redis.conf,找到requirepass所在的地方,修改为指定的密码,密码应符合复杂性要求:

1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等

再去掉前面的#号注释符,然后重启redis

禁止监听在公网 访问控制描述

Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。\u0009检查提示

–加固建议

在redis的配置文件redis.conf中配置如下: bind 127.0.0.1或者内网IP,然后重启redis

禁止使用root用户启动 访问控制描述

使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的 检查提示

–加固建议

使用root切换到redis用户启动服务:

useradd -s /sbin/nolog -M redis 
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &   

打开保护模式 访问控制描述

redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。检查提示

–加固建议

redis.conf安全设置: # 打开保护模式 protected-mode yes

版本存在安全漏洞入侵防范描述

Redis以下版本存在漏洞,容易被入侵 1. Redis 2.8.1 之前版本和 3.0.2 之前 3.x 版本存在字节码命令执行漏洞 https://avd.aliyun.com/detail?id=AVD-2015-4335 2. Redis 4.x至5.0.5版本存在主从复制命令执行漏洞 3. Redis 3.2.0 至 3.2.4 版本存在缓冲区溢出漏洞,可导致任意代码执行 https://avd.aliyun.com/detail?id=AVD-2016-8339检查提示

–加固建议

更新服务至最新版本,完成漏洞的修复,这些漏洞基于未授权访问或者服务存在弱口令,完成访问认证加固可降低被入侵风险。

限制redis 配置文件访问权限 文件权限描述

因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600, 检查提示

–加固建议

执行以下命令修改配置文件权限:

chmod 600 /<filepath>/redis.conf

修改默认6379端口 服务配置描述

避免使用熟知的端口,降低被初级扫描的风险 检查提示

–加固建议

编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis

禁用或者重命名危险命令 入侵防范描述

Redis中线上使用keys *命令是非常危险的,应该禁用或者限制使用这些危险的命令,可降低Redis写入文件漏洞的入侵风险。检查提示

–加固建议

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""
rename-command KEYS     ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""

然后重启redis。 重命名为”” 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC

Redis未授权访问身份鉴别描述

Redis端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。检查提示

–加固建议

可以使用以下方法修复: 1、为Redis服务配置认证,在配置文件redis.conf中requirepass 配置复杂密码,然后重启redis。 2、在Redis的配置文件redis.conf中配置如下: bind 127.0.0.1,只允许本机访问,然后重启redis

Nginx安全指南

Nginx后端服务指定的Header隐藏状态服务配置描述

隐藏Nginx后端服务X-Powered-By头检查提示

–加固建议

隐藏Nginx后端服务指定Header的状态:

1、打开conf/nginx.conf配置文件;

2、在http下配置proxy_hide_header项; 增加或修改为 proxy_hide_header X-Powered-By; proxy_hide_header Server;

应为每个核心站点启用access_log指令

默认情况下启用。检查提示

–加固建议

开启Nginx的WEB访问日志记录:

1、打开conf/nginx.conf配置文件,含主配置文件中include项包含的子配置文件;

2、在http下配置access_log
access_log logs/host.access.log main; 

3、并在主配置文件,及主配置文件下的include文件中 删除off项或配置为适当值

确保NGINX配置文件权限为644文件权限描述

把控配置文件权限以抵御外来攻击检查提示

–加固建议

修改Nginx配置文件权限: 执行chmod 644 <conf_path>来限制Nginx配置文件的权限;(<conf_path>为配置文件的路径,如默认/安装目录/conf/nginx.conf或者/etc/nginx/nginx.conf,或用户自定义,请 自行查找)

检查是否配置Nginx账号锁定策略。身份鉴别描述

1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ….. (Password locked.)或nginx L ….

2.默认符合,修改后才有(默认已符合)

3.执行系统命令passwd -l nginx进行锁定检查提示

–加固建议

配置Nginx账号登录锁定策略: Nginx服务建议使用非root用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l <Nginx启动用户> 如passwd -l nginx 来锁定Nginx服务的启动用户。命令 passwd -S <用户> 如passwd -S nginx可查看用户状态。 修改配置文件中的nginx启动用户修改为nginx或nobody 如: user nobody; 如果您是docker用户,可忽略该项(或添加白名单)

检查Nginx进程启动账号。服务配置描述

Nginx进程启动账号状态,降低被攻击概率检查提示

–加固建议

修改Nginx进程启动账号:

1、打开conf/nginx.conf配置文件;

2、查看配置文件的user配置项,确认是非root启动的;

3、如果是root启动,修改成nobody或者nginx账号; 备注:

4、修改完配置文件之后需要重新启动Nginx。

隐藏Nginx服务的Banner服务配置描述

Nginx服务的Banner隐藏状态检查提示

–加固建议

Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:

1、打开conf/nginx.conf配置文件;

2、在server栏目下,配置server_tokens项 server_tokens off; 如出现多项不支持,执行ln <conf_path> /etc/nginx/nginx.conf

针对Nginx SSL协议进行安全加固服务配置描述

Nginx SSL协议的加密策略进行加固检查提示

–加固建议

Nginx SSL协议采用TLSv1.2:

1、打开conf/nginx.conf配置文件(或主配置文件中的inlude文件);

2、配置

server { 
               ...
              ssl_protocols TLSv1.2;
               ...
}

备注:配置此项请确认nginx支持OpenSSL,运行nginx -V 如果返回中包含built with OpenSSL则表示支持OpenSSL。 如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)

确保已禁用自动索引模块访问控制描述

自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用。检查提示

–加固建议

执行以下操作以禁用自动索引模块: 搜索NGINX配置文件(NGINX.conf和任何包含的配置文件)以查找autoindex指令。
egrep -i '^\s*autoindex\s+' <main_config_path> egrep -i '^\s*autoindex\s+' <sub_config_path> 在location下删除或者修改为 autoindex off;

提高安全性的最佳 Nginx 配置