# 浏览器
# 请写出你知道的http状态码以及含义
200, 状态请求成功
301,永久重定向
302, 临时重定向
304,缓存,服务器告诉客户端内容没有改变,直接拿缓存内容
400,参数错误
401,需要用户验证
403,禁止访问
404,没找到该资源
500,服务器错误
# http有什么特点
- 无状态
- 简单
- 快速
- 没有格式的限制
# http和https区别
由于http是简单无状态的,不适合传输敏感信息,比如银行卡,密码,为了安全考虑,所以出现了https
而https协议是通过CA证书,由ssl/tls + http协议构建,进行加密传输,和身份认证的网络协议
客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接
https 认证身份的时候是非对称加密 传输的时候是对称加密
HTTP与HTTPS的区别 (opens new window)
# http1.1和http2.0区别
HTTP2支持多路复用
支持服务器推送
支持压缩
# 说一下浏览器的缓存机制
# 强缓存
第一次直接服务器请求,第二次直接拿缓存
强缓存方案
Exprires: 该资源什么时候会过期, 缺点就是需要客户端时间和服务器时间要同步
Cache-control:max-age:表示该资源多少时间后过期(毫秒)
# 协商缓存
第一次请求缓存且保存缓存标识与时间,重复请求向服务器发送缓存标识和最后缓存时间,服务端进行校验,如果失效则使用缓存
If-None-Match/ETag:缓存标识
Last-modified/If-Modified-Since: 表明请求的资源上次的修改时间
# web安全信息
# xss(跨站攻击脚本)
- 反射型(非存储)
攻击者通过url的形式,添加一些恶意脚本,引诱被用户访问,用户点击之后,窃取用户数据,或者冒充用户请求数据
比如点击链接之后,执行脚本导致数据被攻击者知道
- 持久型(存储)
攻击者将恶意脚本提交到目标网站的数据库中,用户打开目标网站时会执行该恶意脚本
比如发表文章,加入恶意脚本,导致其他用户观看该文章,暴露自己的数据
- Dom型
反射型和持久型,都是将恶意脚本解析执行该脚本
JavaScript 代码不够严谨 .innerHTML、.outerHTML、.appendChild、document.write()
预防xss
- 转义,链接需要通过encodeURIComponent转义,前端显示转义,后端插入数据时也转义
- 用cookies httpOnly防止被截取cookies
- Content-Security-Policy
- 输入内容长度控制
# CSRF(Cross-site request forgery)跨站请求伪造
攻击者冒充用户,请求数据
# CSRF的特点
攻击通常在第三方网站发起
攻击者是利用被攻击网站的登录凭证,冒充受害者提交操作
跨站请求(图片,超链接, cors)
# 预防
添加验证码(体验不好)
判断请求的来源:检测Referer(并不安全,Referer可以被更改)
使用Token(主流)
# 点击劫持
点击劫持是指在一个Web页面中隐藏了一个透明的iframe,用外层假页面诱导用户点击,实际上是在隐藏的frame上触发了点击事件进行一些用户不知情的操作
【面试篇】寒冬求职之你必须要懂的Web安全 (opens new window)
# 事件循环是什么
由于js是单线程,当我们调用函数的时候,js引擎会将函数放入到主线程执行,遇到异步函数的时候,如setimeOut, setInterval, http请求等,js引擎会将该回调函数放入到一个异步队列中,等到主线程执行完成之后,再去自动执行异步队列中的回调函数
# 小程序 与 h5,app区别
小程序的优势
- 无需下载
- 打开速度快
- 开发成本低于app
劣势
- 限制比较多, 页面大小不超过1M, 不能打开超过 5 个层级的页面
- 样式单一
- 只能在对应的应用中运行
# 假如移动端设备的尺寸是640px, 要实现1rem = 16px,需要怎么实现
其实很简单,1rem是指html的font-size为16px 也就是设备宽度/640, 等于设备的html的font-size/16(640的根元素的值)
function refreshRem () {
const width = window.outerWidth
const px = width * 16 / 640;
console.log(px)
document.getElementsByTagName('html')[0].style.fontSize = px + 'px'
}
refreshRem()
# 接口如何防刷
通过ip限制请求次数
http请求头校验(host, user-Agent, Referer)
人机验证,无痕验证,验证码
网关控制流量,对一个时间段出现流量异常,可以拒绝请求
# 为什么for循环嵌套顺序会影响性能
var t1 = new Date().getTime()
for (let i = 0; i < 100; i++) {
for (let j = 0; j < 1000; j++) {
for (let k = 0; k < 10000; k++) {
}
}
}
var t2 = new Date().getTime()
console.log('first time', t2 - t1)
for (let i = 0; i < 10000; i++) {
for (let j = 0; j < 1000; j++) {
for (let k = 0; k < 100; k++) {
}
}
}
var t3 = new Date().getTime()
console.log('two time', t3 - t2)
# 统计 1 ~ n 整数中出现 1 的次数
function findOne(n){
let count = 0;
for(let i=0;i<=n;i++){
count+=String(i).split('').filter(item=>item==='1').length
}
return count;
}
# HTTPS是对称加密还是非对称加密
HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段