跳到主要内容

基础知识

跨域解决方案​

  1. JSOP 实现原理:静态资源请求不受同源策略影响
const script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://www.domain.com/a?data=1&callback=cb";
const cb = (res) => {
console.log(JSON.stringify(res));
};
  1. CORS:跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的 Web 应用被准许访问来自不同源服务器上的指定的资源。
app.all("*", function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
next();
});
server {
...

add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin $http_origin;


location /file {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Methods $http_access_control_request_method;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
add_header Access-Control-Max-Age 1728000;
return 204;
}
}

...
}

网络协议(ISO / OSI 模型)​

old​

应用层-表示层-会话层-传输层-网络层-数据链路层-物理层

应用层 - 表示层 - 会话层 - 传输层 - 网络层 - 数据链路层 - 物理层

new TCP/IP 模型​

4 应用层(Application) 提供网络服务接口(如 HTTP、SMTP、DNS、FTP 等协议)。

3 传输层(Transport) 提供端到端的传输服务(如 TCP、UDP)。

2 网络层(Internet) 负责路由选择和数据转发(如 IP、ICMP、ARP)。

1 网络接口层(Network Access) 负责物理数据的传输(如以太网、Wi-Fi 等)。

编译JS代码的过程​

  1. 生成抽象语法树(AST)和执行上下文
  2. 第一阶段是分词(tokenize),又称为词法分析
  3. 第二阶段是解析(parse),又称为语法分析
  4. 生成字节码
  5. 字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。
  6. 执行代码

高级语言编译步骤​

  1. 输入源程序字符流
  2. 词法分析
  3. 语法分析
  4. 语义分析
  5. 中间代码生成
  6. 机器无关代码优化
  7. 代码生成
  8. 机器相关代码优化
  9. 目标代码生成

JS 数据转换​

对象在转换类型的时候,会执行原生方法 ToPrimitive 。

  1. 如果已经是 原始类型,则返回当前值;
  2. 如果需要转化的是字符串 则先调用 toSting 方法,如果此时是 原始类型 则直接返回,否则再调用 valueOf 方法并返回结果;
  3. 如果不是 字符串,则先调用 valueOf 方法,如果此时是 原始类型 则直接返回,否则再调用 toString 方法并返回结果;
  4. 如果都没有 原始类型 返回,则抛出 TypeError 类型错误。

可以通过重写 Symbol.toPrimitive 来制定转换规则,此方法在转原始类型时调用优先级最高。

闭包​

没有被引用的闭包会被自动回收,但还存在全局变量中,则依然会内存泄漏。

在 JavaScript 中,根据词法作用域的规则,内部函数总是可以访问其外部函数中声明的变量,当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。比如外部函数是 foo,那么这些变量的集合就称为 foo 函数的闭包。

原型&原型链​

其实每个 JS 对象都有 __proto__ 属性,这个属性指向了原型。 原型也是一个对象,并且这个对象中包含了很多函数,对于 obj 来说,可以通过 __proto__ 找到一个原型对象,在该对象中定义了很多函数让我们来使用

  • Object 是所有对象的爸爸,所有对象都可以通过 proto 找到它
  • Function 是所有函数的爸爸,所有函数都可以通过 proto 找到它
  • 函数的 prototype 是一个对象
  • 对象的 proto 属性指向原型, proto 将对象和原型连接起来组成了原型链

浏览器安全​

攻击方式

  • xss:将代码注入到网页

  • csrf:跨站请求伪造。攻击者会虚构一个后端请求地址,诱导用户通过某些途径发送请求。

  • 中间人攻击:中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。攻击者不仅能获得双方的通信信息,还能修改通信信息。

  • DNS 欺骗:入侵 DNS 来将用户访问目标改为入侵者指定机器 -

  • 会话劫持:在一次正常的通信过程中,攻击者作为第三方参与到其中,或者是在数据里加入其他信息,甚至将双方的通信模式暗中改变,即从直接联系变成有攻击者参与的联系。

    防御措施

  • 预防 XSS

    • 使用转义字符过滤 html 代码
    • 过滤 SQL 代码
  • 预防 CSRF

    • 验证 HTTP Referer 字段
    • 在请求地址中添加 token 并验证
    • 在 HTTP 头中自定义属性并验证
    • 接口防跨域处理
    • 不让第三方网站访问用户 cookie
  • 预防中间人攻击

    • 对于 DNS 欺骗:检查本机的 HOSTS 文件
    • 对于会话劫持:使用交换式网络代替共享式网络,还必须使用静态 ARP、捆绑 MAC+IP 等方法来限制欺骗,以及采用认证方式的连接等。
  • 内容安全策略(CSP) 内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。 - HTTP Header 中的 Content-Security-Policy - <meta http-equiv="Content-Security-Policy">

浏览器性能优化​

  1. DNS 预解析
    • <link rel="dns-prefetch" href="" />
    • Chrome 和 Firefox 3.5+ 能自动进行预解析
    • 关闭 DNS 预解析:<meta http-equiv="x-dns-prefetch-control" content="off|on">
  2. 合理利用缓存机制(强缓存 & 协商缓存)
    1. 强缓存
      • Expires
      • Cache-Control
    2. 协商缓存 协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

https://mp.weixin.qq.com/s/xVVP_Uk8rLBhHJaMqMMJoA