模拟const
"use strict";
function _const(key, value) {
const desc = {
value, // 当前对象元素的值
enumerable: false, // 当前对象元素的属性描述符是否可改,是否可删除
configurable: false, // 当前对象元素是否可枚举
writable: false // 当前对象元素的值是否可修改
}
Object.defineProperty(window, key, desc)
}
_const('obj', {a: 1}) //定义obj
obj.b = 2 //可以正常给obj的属性赋值
obj = {} //抛出错误,提示对象read-only(无use strict,修改不成功,不抛错误)
自定义实现call(可忽略)
Function.prototype.myCall = function(thisArg, ...args) {
thisArg.fn = this // this指向调用call的对象,即我们要改变this指向的函数
return thisArg.fn(...args) // 执行函数并return其执行结果
}
完整版
Function.prototype.myCall = function(thisArg, ...args) {
const fn = Symbol('fn') // 声明一个独有的Symbol属性, 防止fn覆盖已有属性
thisArg = thisArg || window // 若没有传入this, 默认绑定window对象
thisArg[fn] = this // this指向调用call的对象,即我们要改变this指向的函数
const result = thisArg[fn](...args) // 执行当前函数
delete thisArg[fn] // 删除我们声明的fn属性
return result // 返回函数执行结果
}
GE求和POST请求区别
- GET请求参数放在URL上,POST请求参数放在请求体里。
- GET请求参数长度有限制,POST请求参数长度可以非常大。
- POST请求相较于GET请求安全一点点,因为GET请求的参数在URL上,且有历史记录。
- GET请求能缓存,POST不能。
- 根本区别: GET请求是幂等性的,而POST请求不是。 (幂等性,指的是对某一资源进行一次或多次请求都具有相同的副作用。例如搜索就是一个幂等的操作,而删除、新增则不是一个幂等操作。)
HTTP和HTTPS区别
- HTTPS使用443端口,而HTTP使用80
- HTTPS需要申请证书
- HTTP是超文本传输协议,是明文传输;HTTPS是经过SSL加密的协议,传输更安全
- HTTPS比HTTP慢,因为HTTPS除了TCP握手的三个包,还要加上SSL握手的九个包
前端安全
- 跨站请求伪造 CSRF攻击, Cross-site request forgery,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。(假如黑客在自己的站点上放置了其他网站的外链,例如"www.weibo.com/api,默认情况下,浏览器会带着weibo.com的cookie访问这个网址,如果用户已登录过该网站且网站没有对CSRF攻击进行防御,那么服务器就会认为是用户本人在调用此接口并执行相关操作,致使账号被劫持。)
- 防御CSRF攻击
- 验证Token: 浏览器请求服务器时,服务器返回一个token,每个请求都需要同时带上token和cookie才会被认为是合法请求
- 验证Referer: 通过验证请求头的Referer来验证来源站点,但请求头很容易伪造
- 设置SameSite: 设置cookie的SameSite,可以让cookie不随跨域请求发出,但浏览器兼容不一
- 跨站脚本 XSS即Cross Site Scripting(跨站脚本),(指的是通过利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。常见的例如在评论区植入JS代码,用户进入评论页时代码被执行,造成页面被植入广告、账号信息被窃取)。
- 存储型: 即攻击被存储在服务端,常见的是在评论区插入攻击脚本,如果脚本被储存到服务端,那么所有看见对应评论的用户都会受到攻击
- 反射型: 攻击者将脚本混在URL里,服务端接收到URL将恶意代码当做参数取出并拼接在HTML里返回,浏览器解析此HTML后即执行恶意代码
- DOM型: 将攻击脚本写在URL中,诱导用户点击该URL,如果URL被解析,那么攻击脚本就会被运行。和前两者的差别主要在于DOM型攻击不经过服务端
- 防御XSS攻击
- 输入检查: 对输入内容中的<script><iframe>等标签进行转义或者过滤
- 设置httpOnly: 很多XSS攻击目标都是窃取用户cookie伪造身份认证,设置此属性可防止JS获取cookie
- 开启CSP,即开启白名单,可阻止白名单以外的资源加载和运行