[深刻01] 执行上下文
[深刻02] 原型链
[深刻03] 继承
[深刻04] 事件循环
[深刻05] 柯里化 偏函数 函数记忆
[深刻06] 隐式转换 和 运算符
[深刻07] 浏览器缓存机制(http缓存机制)
[深刻08] 前端安全
[深刻09] 深浅拷贝
[深刻10] Debounce Throttle
[深刻11] 前端路由
[深刻12] 前端模块化
[深刻13] 观察者模式 发布订阅模式 双向数据绑定
[深刻14] canvas
[深刻15] webSocket
[深刻16] webpack
[深刻17] http 和 https
[深刻18] CSS-interview
[react] Hookscss
[部署01] Nginx
[部署02] Docker 部署vue项目
[部署03] gitlab-CIhtml
[源码-webpack01-前置知识] AST抽象语法树
[源码-webpack02-前置知识] Tapable
[源码-webpack03] 手写webpack - compiler简单编译流程前端
攻击方式:有多种,共同的特征是:窃取用户的隐私数据 |
Document.cookie属性
,XMLHttpRequest对象
, Request API
注意:这两种方法都只能获取simple response heade,而不能获取Set-Cookie字段
(1) HtmlEncode:对html标签进行转换
< -------------------------- <
> -------------------------- >
& -------------------------- &
'' ------------------------- "
空格 -----------------------  
(2) JavascriptEncode:对js一些特殊符号进行转码
" ------------------------ \" \n ----------------------- \\n \r ----------------------- \\r 复制代码
forgeries:伪造品的意思
主要是经过获取用户在目标网站的cookie,骗取目标网站的服务器的信任,在用户已经登陆目标站的前提下,访问到了攻击者的钓鱼网站,攻击者直接经过 url 调用目标站的接口,伪造用户的行为进行攻击,一般这个行为用户是不知情的。
案例:
CSRF攻击的思想:(核心2和3)
一、用户浏览并登陆信任网站(如:淘宝)
二、登陆成功后在浏览器产生信息存储(如:cookie)
三、用户在没有登出淘宝的状况下,访问危险网站
// 注意:若是该cookie在没有设置过时时间或者为null,默认是会话时间session-cookie,关闭浏览器后cookie会被清除
// Expires,Max-Age能够设置cookie的过时时间
// 因此这里强调了是没有登出的状况,就有cookie被获取的风险
// 若是cookie设置了具体的过时时间,有效期内均可能被获取
四、危险网站中存在恶意代码,代码为发送一个恶意请求(如:购买商品/余额转帐)
// 该请求,携带刚刚在浏览器产生的信息(cookie),进行恶意请求
五、淘宝验证请求为合法请求(区分不出是不是该用户发送)
// 用HTTP中的header头中的 Refer 来预防
// refer 能够检查请求源,只有合法的请求来源服务器才予以响应
六、达到了恶意目标
复制代码
window.navigator.cookieEnabled 返回一个布尔值,表示浏览器是否打开cookie功能
document.cookie 返回当前网页的cookie
多个 Set-Cookie 字段
cookie的属性,能够包含多个属性,没有次序要求
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
// Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly 多个属性,没有次序要求
[page content]
复制代码
Set-Cookie: key1=value1; domain=example.com; path=/blog
Set-Cookie: key1=value2; domain=example.com; path=/
// 上面由于path不同,就设置了一个全新的cookie
// 下次发起请求时,会同时发送两个cookie
// 发起请求时,发送的cookie => Cookie: key1=value1; key1=value2
// 注意:两个cookie同名,可是越精确的cookie排在越前面
复制代码
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
复制代码
服务器收到浏览器发来的cookie时,有两点没法知道vue
- Cookie的各类属性:Expires,Max-Age,Domain,Path,Secure,HttpOnly
- 哪一个域名设置的cookie,一级域名设置的,仍是二级域名设置的
Date.prototype.toUTCString()
进行格式转换60*60*24*365一年
Document.cookie读取:读取所有 |
Document.cookie写入:一次只能写入一个,写入不是覆盖,而是添加 |
发送:HTTP请求发送cookie,Cookie字段,一次能够设置多个cookie,用分号隔开 |
生成:Http响应生成cookie,Set-Cookie字段,一次设置一个cookie,但能够有多个Set-Cookie字段 |
// 获取参数对应的 simple response header,参数必须在simple response header范围内
// 获取全部 simple response header
// 下载进度
// 上传进度信息
// text, document, json, blob, arrayBuffer
// 终止请求
// 一个布尔值,表示跨域请求时,是否能够携带认证信息,如cookie
const api = new XMLHttpRequest()
(1) api.open()
- 初始化HTTP请求参数(url,http方法等),但并不发送请求,供 send() 方法使用
api.open(method, url, async, username, password)
method:HTTP请求的方法GET, POST, HEAD
url:请求的地址
async:是否异步,默认是true,即异步的发送请求
// false:同步,对send方法的调用将阻塞,直到响应彻底接受
// true或者省略:异步,且一般须要调用 onreadystatechange() 方法
(2) api.send()
- 发送一个http请求,请求参数写在send方法中
api.send(body)
get请求: 参数能够写在open()方法中
post请求:参数卸载send()方法中
(3) api.setRequestHeader()
- 指定一个HTTP请求的头部(请求头),只有在readyState为 1 时才能调用
api.setRequestHeader(name, value)
name: key
value:value
注意:setRequestHeader()方法能够屡次调用,最终的值不是覆盖override而是追加append
注意:setRequestHeader()方法只有在 readyState = 1 时才能调用,即open()以后send()以前
(4) api.getResponseHeader()
- 返回指定的HTTP响应头部的值(响应头)
(5) api.abort() //abort:停止的意思
- 取消当前响应,关闭链接而且结束任何未决的网络活动
- api.abort()将readyState重置为0
- 应用:若是请求用了太长的时间,并且响应不在必要时,能够调用这个方法
(6) api.onreadystatechange()
- api.onreadystatechange()但 readyState = 3 时能够调用屡次
- 注意:onreadystatechange都是小写,而readyState是驼峰写法
readyState状态:
0 UNSENT ------------------ xhr对象成功构造,open()方法未被调用
1 OPEND ------------------- open()方法被调用,send()方法还未被调用,setRequestHeader()能够被调用
2 HEADERS_RECEIVED -------- send()方法被调用,响应头和响应状态已经返回
3 LOADING ----------------- 响应体(response entity body)正在下载中,此状态下api.response可能已经有了响应数据
4 DONE -------------------- 整个数据传输过程结束,无论本次请求是成功仍是失败
(7) api.onload()
- api.onload()请求成功时触发,此时 readyState = 4
- 请求成功的回调有两个:
- 1. readyState===4时的api.onreadystatechange()
- 2. api.onload()方法
api.onload = function () {
//若是请求成功
if(api.status == 200){
//do successCallback
}
}
注意:status===200是有坑的,由于协商缓存返回的状态码是304,请求也是成功的请求,因此下面的判断跟完善
api.onload = function() {
if((api.status>=200 && api.status < 300) || api.status === 304) {
// do successCallback
}
}
(8) api.timeout
- api.timeout用来设置过时时间
问题1:请求的开始时间怎么肯定?是api.onloadstart事件触发的时候,也就是api.send()调用的时候
解析:由于api.open()只是建立了连接,当并无真正传输数据,只有调用api.send()时才真正开始传输
问题2:何时是请求结束?
解析:api.loadend事件触发时结束
(9) api.onprogress() 下载进度信息
(10) api.upload.onprogress = function(e) { 上传进度信息
if ( e.lengthComputable ) {
const present = e.loaded / e.total * 100;
}
}
-----------------------------------------------------------------------------------------------
1.
问题1:如何获取response
提供三个属性来获取response:( api.response ) 和 ( api.responseText ) 和 ( responseXML )
api.responseText --- api.responseType='text'、''、不设置时,xhr对象上才有此属性,此时才能调用
api.response --- responseType为""或"text"时,值为"";responseType为其余值时,值为 null
2.
问题2:api.responseType有哪些类型
api.responseType类型有:text, document, json, blob, arrayBuffer
复制代码
只在跨域请求时的响应头中存在,表示服务端容许暴露给客服端的headers
注意:在同域请求时,cookie会在请求头中自动携带,可是在跨域请求时,并无自动携带,缘由是:在CORS标准中作了规定,默认状况下,浏览器在发送跨域请求时,不能发送任何认证信息(credentials)如"cookies"和"HTTP authentication schemes"。除非xhr.withCredentials为true
api.withCredentials = true 设置为true
Access-Control-Allow-Credentials:true
get请求
go() {
console.log('1111111111');
const api = new XMLHttpRequest();
api.open('GET', ----- 初始http请求参数,请求方式,url, 是否异步
'https://bing.ioliu.cn/v1/rand?type=json', true);
api.responseType = 'text'; ------ 文本格式的响应
api.timeout = 5000; ---- 请求过时时间
api.setRequestHeader('Content-type', 'application/json'); ----- 必须在open()后,send()前设置
api.onreadystatechange = function() { ------ readyState改变时触发
if ( api.readyState === 4 && this.status === 200) { ---- this指的是api实例
console.log(JSON.parse(this.responseText)) ------ this.response也能拿到一样的数据
}
}
// 除了在api.onreadystatechange指指定的会调中判断readyState===4,也能够直接在onload中触发
// 两种方法均可以
// 只判断200状态码不完善,应该判断 2xx 或者 304 则请求成功
api.onload = function() {
if ( api.status >= 200 && api.status < 300 || api.status === 304 ) {
console.log(JSON.parse(api.responseText), 'onload在请求成功时触发');
}
}
api.send(); ---- 发送数据
}
复制代码
面试精简 juejin.im/post/5cef3a…
juejin.im/post/59dc2b…
juejin.im/post/5cef3a…
美团 juejin.im/post/5bc009…
知乎 zhuanlan.zhihu.com/p/83865185
XMLHttpRequest segmentfault.com/a/119000000…
个人简书 www.jianshu.com/p/7292d8b5d…java