You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
var today=new Date()
var y=today.getFullYear()
var m=today.getMonth()
var d=today.getDate()
var h=today.getHours()
var m=today.getMinutes()
var s=today.getSeconds()
function createAdder(){
var n=0
return function(){
n += 1
console.log(n)
}
}
let adder = createAdder()
adder() //1
adder() //2
console.log(n) // n is not undefined
functionaddScriptTag(src){varscript=document.createElement('script');script.setAttribute("type","text/javascript");script.src=src;document.body.appendChild(script);}window.onload=function(){addScriptTag('http://example.com/ip?callback=foo');}functionfoo(data){console.log('Your public IP address is: '+data.ip);};//服务器返回foo({"ip": "8.8.8.8"});
/*新建一个Vue实例作为中央事件总嫌*/
let event = new Vue();
/*监听事件*/
event.$on('eventName', (val) => {
//......do something
});
/*触发事件*/
event.$emit('eventName', 'this is a message.');
functionfindLongestWord(str){//转化成数组varastr=str.split(" ");//对数组中每个元素的字符串长度进行比较,按照字符串长度由大至小排列数组顺序。varbstr=astr.sort(function(a,b){returnb.length-a.length;});//取出数组中第一个元素(也就是最大长度的字符串)varlenMax=bstr[0].length;//返回长度值returnlenMax;}findLongestWord("The quick brown foxjumped over the lazy dog");//结果:6
字符串的每个单词首字母都大写,其余部分小写
functiontitleCase(str){varastr=str.toLowerCase().split(" ");for(vari=0;i<astr.length;i++){astr[i]=astr[i][0].toUpperCase()+astr[i].substring(1,astr[i].length);}varstring=astr.join(" ");returnstring;}titleCase("I'm a little teapot");//结果:I'm A LittleTea Pot
HTML
前端语义化
META viewport
<meta name="viewport" content="width=devidce-width",user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimun-scale=1.0">
HTML5新特性
使用
getCurrentPosition()
方法来获得用户的位置CANVAS、SVG
区别
canvas为标量图,svg为矢量图,canvas为html5新增。
canvas
<canvas id="canvas" height="200" width="350"></canvas>
canvas模糊问题
Canvas 在高清屏下绘制图片变模糊
不管当前的
devicePixelRatio
的值是多少,统一将canvas
DOM节点的width属性设置为其css
width属性的两倍,同理将height属性也设置为css
height属性的两倍,即:<canvas width="320" height="180" style="width:160px;height:90px;"></canvas>
这样整个 canvas 的坐标系范围就扩大为两倍,但是在浏览器的显示大小没有变,canvas画图的时候,按照扩大化的坐系来显示,不清晰的问题就得以改善了
正则表达式
n
”匹配字符“n
”。“\n
”匹配一个换行符。串行“\\
”匹配“\
”而“\(
”则匹配“(
”。\n
”或“\r
”之后的位置。\n
”或“\r
”之前的位置。z
”以及“zoo
”。*等价于{0,}。zo+
”能匹配“zo
”以及“zoo
”,但不能匹配“z
”。+等价于{1,}。do(es)?
”可以匹配“does
”或“does
”中的“do
”。?等价于{0,1}。o{2}
”不能匹配“Bob
”中的“o
”,但是能匹配“food
”中的两个o。o{2,}
”不能匹配“Bob
”中的“o
”,但能匹配“foooood
”中的所有o。“o{1,}
”等价于“o+
”。“o{0,}
”则等价于“o*
”。o{1,3}
”将匹配“fooooood
”中的前三个o。“o{0,1}
”等价于“o?
”。请注意在逗号和两个数之间不能有空格。oooo
”,“o+?
”将匹配单个“o
”,而“o+
”将匹配所有“o
”。\n
”之外的任何单个字符。要匹配包括“\n
”在内的任何字符,请使用像“`(.使用:
if(!(正则表达式.test(xxxx)))
邮箱
/^([a-z0-9_\.-]+)@([0-9a-z\.-]+)\.([a-z]{2,6})$/
/^[a-z0-9_-]{6,16}$/
if(!(/^1[34578][0-9]{9}$/.test(phone)))
Web Worker
CSS
link&@import
区别
盒模型
content-box : width == 内容区宽度
border-box : width == 内容区宽度 + padding宽度 + border宽度
如何设置两种模型:
box-sizing: content-box
是W3C盒子模型box-sizing: border-box
是IE盒子模型box-sizing的默认属性是content-box
content-box W3C标准模型
伪元素&伪类
居中
水平居中
垂直居中
水平垂直居中
行元素、块元素
行内元素
行内元素的特点:
(1)和相邻行内元素在一行上。
(2)高、宽无效,但水平方向的padding和margin可以设置,垂直方向的无效。
(3)默认宽度就是它本身内容的宽度。
(4)行内元素只能容纳文本或则其他行内元素。(a特殊 a里面可以放块级元素 )
块级元素
块级元素的特点:
(1)总是从新行开始
(2)高度,行高、外边距以及内边距都可以控制。
(3)宽度默认是容器的100%
(4)可以容纳内联元素和其他块元素。
行内块元素(inline-block)
行内块元素的特点:
(1)和相邻行内元素(行内块)在一行上,但是之间会有空白缝隙。
(2)默认宽度就是它本身内容的宽度。
(3)高度,行高、外边距以及内边距都可以控制。
左侧固定右侧自适应
两边固定中间自适应
FLEX布局
flex-direction属性
主轴的方向
row
(默认值):主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿。justify-content属性
项目在主轴上的对齐方式
flex-start
(默认值):左对齐flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。align-items属性
交叉轴上如何对齐
flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 项目的第一行文字的基线对齐。stretch
(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。flex属性
flex
属性默认值为0 1 auto
flex:flex-grow, flex-shrink,flex-basis
flex-grow
属性定义项目的放大比例,默认为0
,即如果存在剩余空间,也不放大。 如果所有项目的flex-grow
属性都为1,则它们将等分剩余空间(如果有的话)flex-shrink
属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。flex-basis
属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto
,即项目的本来大小。另外:下面两个表达式相等:
Grid布局
列举Css3新特性
选择器优先级
1、选择器越具体,优先级越高
2、同样优先级,写在后面的覆盖前面的
3、!important > id > class >tag >通配符
选择器继承
transition&animation
过渡属性transition可以在一定的事件内实现元素的状态过渡为最终状态,用于模拟一种过渡动画效果,但是功能有限,只能用于制作简单的动画效果;
动画属性animation可以制作类似Flash动画,通过关键帧控制动画的每一步,控制更为精确,从而可以制作更为复杂的动画。
transition
animation
BFC块级格式化上下文
特性
作用
overflow:hidden 清除浮动
overflow:hidden 取消父子margin合并(子设置margin,父也会有margin)
如何触发BFC
移动端布局
获取宽度
在JavaScript中我们可以直接通过以下
window
上的属性获取设备像素比响应式
利用@media进行断点,在每个断点中编写css
优点:兼容性好,@media在ie9以上是支持的,PC和MOBILE是同一套代码的,不用分开。
缺点:要写得css相对另外两个多很多,而且各个断点都要做好。css样式会稍微大点,更麻烦。
REM
REM这个单位,会根据html的
font-size
大小进行转换优点:能维持能整体的布局效果,移动端兼容性好,不用写多个css代码,而且还可以利用@media进行优化。
缺点:开头要引入一段js代码,单位都要改成rem(font-size可以用px),计算rem比较麻烦(可以引用预处理器,但是增加了编译过程,相对麻烦了点)。pc和mobile要分开。
设置viewport中的width
这种方案,就是定死viewport中的width大小。
比如设计稿是750的,然后就在代码上写:
优点:和REM相同,而且不用写rem,直接使用px,更加快捷。
缺点:效果可能没rem的好,图片可能会相对模糊,而且无法使用@media进行断点,不同size的手机上显示,高度间距可能会相差很大。
浮动&清除
1、浮动带来的副作用:
1)块状元素,会钻进浮动元素的下面,被浮动元素所覆盖
2)行内元素,例如文字, 则会环绕在浮动元素的周围,为浮动元素留出空间
3)浮动元素的父元素坍缩
2、清除浮动:
rem&em/VH&VW
em 是一种相对单位,它相对于父元素的字体大小。
rem是一种相对单位,它相对于根元素
html
的字体大小,会根据html的font-size
大小进行转换vh/vw都是相对于视口的单位,浏览器视口的区域就是通过
window.innerWidth
以及window.innerHeigth
度量得到的范围。 浏览器会将整个视口的宽度或者高度划分为100等份,因此1vw或者1wh就是相对视口宽度或者高度的1%margin重叠
margin在垂直方向上相邻的值相同时会发生叠加,水平方向上相邻的值会相加
只有垂直方向的 margin 才会折叠,也就是说,水平方向的 margin 不会发生折叠的现象。
如何使元素上下margin不折叠呢?
触发底部元素的BFC(overflow:hidden除外)
如何使父子margin不折叠呢?
触发父元素的BFC
inline-block导致的横向间隔
display设置为inline-block时,li与li之间有看不见的空白间隔
造成「inline-block」元素空隙的本质是 HTML 中存在的空白符(whitespace)
行框的排列会受到中间空白(回车空格等等)的影响,这些空白也会被应用样式,占据空间,所以会有间隔
**解决1:**设置ul的font-size为0,缺陷是必须重新在li中去设置字体大小(副作用多)
解决2:使用如下写法
回流、重绘
引起回流
1、添加或者删除可见的DOM元素;
2、元素位置改变;
3、元素尺寸改变——边距、填充、边框、宽度和高度
4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;
5、页面渲染初始化;
6、浏览器窗口尺寸改变——resize事件发生时;
JavaScript
JS的数据类型&判断
string number boolean undefined null object symbol
如何获得当前日期
声明前置
变量提升
函数提升
function functionName(){} //函数声明
var a = function(arg0,arg1){} //函数表达式
操作数组
操作字符串
遍历数组和对象
Promise
概念
Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise
这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。有了
Promise
对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise
对象提供统一的接口,使得控制异步操作更加容易。特点
Promise
,一旦新建它就会立即执行,无法中途取消。Promise
内部抛出的错误,不会反应到外部。pending
状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。用法
基本用法:
then:
Promise 实例具有
then
方法,也就是说,then
方法是定义在原型对象Promise.prototype
上的。它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,then
方法的第一个参数是resolved
状态的回调函数,第二个参数(可选)是rejected
状态的回调函数。catch:
Promise.prototype.catch
方法是.then(null, rejection)
的别名,用于指定发生错误时的回调函数。all:
Promise.all
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数。p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的回调函数。race:
Promise.race
方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。上面代码中,只要
p1
、p2
、p3
之中有一个实例率先改变状态,p
的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p
的回调函数。扩展运算符...
扩展运算符( spread )是三个点(...)。将一个数组转为用逗号分隔的参数序列。
async/await?
async
函数返回一个 Promise 对象,可以使用then
方法添加回调函数。当函数执行的时候,一旦遇到await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。AJAX
事件循环&异步
堆和栈?
闭包
new操作符的执行步骤
this
没有对象只有方法则指向全局对象
fn()的this是window
有对象调用方法就指向调用对象
a.fn()的this是a
new F()的this是新实例
箭头函数里的this是外部作用域的this
当我们使用
add.call()
,第一个参数是this
需要绑定的对象,剩下的是add
函数本来的参数立即执行函数
立即执行函数是为了生成一个函数作用域,防止污染全局变量
浅拷贝VS深拷贝
浅拷贝
深拷贝
原型
array.push(num)
中push是沿着array.__proto__
找到的,也就是Array.prototype.push原型图
判断变量Array类型&判断变量是Number
arr instanceof Array); // true
instanceof 运算符用来测试一个对象是否是后者的实例。arr.constructor === Array ; // true
Array.isArray([1, 2, 3]); // true
Object.prototype.toString.call(arr); //'[object Array]'
此种方法最准确Number:
isNaN 如果为true则不是Number类型
立即执行函数
var foo = function() {}
编译后变量声明foo会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。
也就是,匿名函数只有在被调用时才被初始化。
function foo() {}
编译后函数声明和他的赋值都会被提前。
也就是说函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。
匿名函数
1、匿名函数的事件不能解绑
2、匿名函数和普通函数最大的区别是在于,匿名函数可以作为一个具体的“值”赋予给变量或者对象属性,其次,由于匿名函数可以被定义在不同地方,使得他可以有效利用他所在的局域内的变量(或者说上下文中的变量)。
JS获得用户来源
navigator.userAgent.indexOf('')
ES6的class
生成实例对象的传统方法是通过构造函数 ,
上面的代码用 ES6 的
class
改写继承
reduce/filter/find
undefined
。事件代理
请说明.forEach循环和.map()循环的主要区别,它们分别在什么情况下使用?
1)都是循环遍历数组中的每一项
2)forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item(当前每一项)、index(索引值)、arr(原数组)
3)匿名函数中的this都是指向window
4)只能遍历数组
区别在于map有返回值,而forEach没有返回值。
map方法返回一个新的数组
forEach()方法用于调用数组的每个元素,将元素传给回调函数。
性能上map稍落后于forEach
DOM
DOM事件流
事件模型?
事件绑定模型
同一个节点只能添加一次同类型事件,如果添加多次,最后一个生效。
通过DOM0绑定的事件,一旦绑定将无法取消。
同一个节点,可以使用DOM2绑定多个同类型事件。
使用DOM2绑定的事件,可以有专门的函数进行取消。
事件流模型
触发一个节点的事件,会从当前节点开始,依次触发其祖先节点的同类型事件,直到DOM根节点。
所有事件绑定默认为事件冒泡
阻止冒泡:
触发一个节点的事件,会从DOM根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。
使用addEventListener绑定事件,第三个参数传为true时表示事件捕获
DOM加载事件
移动端的触摸事件
事件委托,如何识别点击的子元素?
监听父元素,看事件触发是哪个子元素
通过event.target识别具体是哪个子元素
增删改查
创建新节点
createElement() //创建一个具体的元素
添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore()
查找
getElementsByTagName()
getElementsByName()
getElementById()
getElementByClassName()
HTTP
状态码
1XX信息性状态码(Informational)服务器正在处理请求
2XX成功状态码(Success)请求已正常处理完毕
200 OK 表示请求被服务器正常处理
204 No Content 表示请求已成功处理,但是没有内容返回(就应该没有内容返回的状况)
3XX重定向状态码(Redirection)需要进行额外操作以完成请求
301 Moved Permanently 永久重定向,表示请求的资源已经永久的搬到了其他位置
302 Found 临时重定向,表示请求的资源临时搬到了其他位置
303 See Other 表示请求资源存在另一个URI,应使用GET定向获取请求资源
304 Not Modified 使用缓存
4XX客户端错误状态码(Client Error)客户端原因导致服务器无法处理请求
400 Bad Request 表示请求报文存在语法错误或参数错误,服务器不理解
401 Unauthorized 表示发送的请求需要有HTTP认证信息或者是认证失败了
403 Forbidden 表示对请求资源的访问被服务器拒绝了
404 Not Found 表示服务器找不到你请求的资源
5XX服务器错误状态码(Server Error)服务器原因导致处理请求出错
500 Internal Server Error 表示服务器执行请求的时候出错了
503 Service Unavailable 表示服务器超负载或正停机维护,无法处理请求
301和302的区别
HTTP和HTTPS的区别?
提高页面性能的方法
Websocket
意义
HTTP 协议有一个缺陷:通信只能由客户端发起 ,websocket可以实现服务端主动推送。
属性
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是
ws
(如果加密,则为wss
),服务器网址就是 URL。用法
缺点
对前端开发者,往往要具备数据驱动使用javascript的能力,且需要维持住ws连接(否则消息无法推送);对后端开发者而言,难度增大了很多,一是长连接需要后端处理业务的代码更稳定(不要随便把进程和框架都crash掉),二是推送消息相对复杂一些,三是成熟的http生态下有大量的组件可以复用,websocket则太新了一点。
缓存
header中会有两个字段来标明失效规则Cache-Control,指的是当前资源的有效期
对比缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。 再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
在对比缓存生效时,状态码为304,并且报文大小和请求时间大大减少。
请求头?响应头?
Cookie是什么? Session是什么?
cookie
session
localstorage和cookie区别
cookie和session如何实现前后端相连?如何实现?
浏览器端如何生成cookie?
文件上传的解决方案?
文件+文字同时上传
GET和POST的区别
GET用来读数据,POST用来写数据
GET的参数有长度限制,一般是1024个字符,POST的参数没有长度限制,一般是4-10Mb
包:GET请求只需发一个包,POST请求需要发两个以上包(因为POST有消息体)
GET的参数放在URL的查询参数里,POST的参数放在请求消息体(数据)里
浏览器同源策略
意义
同源策略主要用来防止CSRF攻击
属性
如果非同源,共有三种行为受到限制。
跨域
http请求过程
从输入URL到页面展示过程
DNS查询
a. 浏览器缓存,浏览器会缓存DNS记录一段时间。
b.在hosts静态文件、DNS解析器缓存中查找某主机的ip地址
c.将前面的查询请求发给路由器,它一般会有自己的DNS缓存。
d. 每一个ISP(网络服务提供商)会有一个自己的本地域名服务器,他会在url第一次访问时缓存该域名的指向。下次再访问时,他会从缓存里把这个url曾经指向的IP调出来。
e.ISP的DNS服务器会从根域名开始进行递归查询
建立TCP连接,三次握手
发送HTTP请求
后台处理请求
发送HTTP相应
关闭TCP连接,四次挥手
解析HTML
下载CSS、并解析
下载JS、并解析
下载并解析图片
渲染DOM
渲染样式树
执行JS
VUE
VUE基础
vue的生命周期
Vue共有8个生命周期钩子函数,分别为:
如何组件通信?
父组件向子组件通信
使用props,父组件可以使用props向子组件传递数据。
子组件向父组件通信
使用vue事件,父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件。
非父子组件、兄弟组件之间的数据传递
非父子组件通信,Vue官方推荐使用一个Vue实例作为中央事件总线。 $on方法用来监听一个事件。
$emit用来触发一个事件。
VUE项目配置文件了解么?
Vue中引入组件的步骤?
1)采用ES6的import ... from ...语法或CommonJS的require()方法引入组件
2)对组件进行注册,代码如下
3)使用组件
<my-component></my-component>
computed/method/watch的区别
cpmputed/method
message
还没有发生改变,多次访问reversedMessage
计算属性会立即返回之前的计算结果,而不必再次执行函数。watch
watch是监控一个对象,当变化时执行操作
V-if和V-show的区别?
v-show
的元素始终会被渲染并保留在 DOM 中。v-show
只是简单地切换元素的 CSS 属性display
。v-if
是“真正”的条件渲染vue的事件修饰符
Vue.js 为
v-on
提供了事件修饰符keep-alive?
组件实例能够被在它们第一次被创建的时候缓存下来。为了解决这个问题,我们可以用一个
<keep-alive>
元素将其动态组件包裹起来。VUE路由
动态路由&动态参数
一个“路径参数”使用冒号
:
标记。当匹配到一个路由时,参数值会被设置到this.$route.params
,可以在每个组件内使用嵌套路由
路由传参
点击不同的li进行不同跳转并传参
方法一 通过动态路由的:值传参
方法二 通过name确定路由,通过params来传递参数
方法三 使用query
编程式的导航路由
导航守卫
全局路由钩子:
单个路由钩子:
只有beforeEnter,在进入前执行,to参数就是当前路由
路由组件钩子:
VUEX
State
从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态
Getter
Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
Mutation
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
Mutation 必须是同步函数
Action
Module
Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter
双向绑定原理
原理简述
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过
Object.defineProperty()
来劫持各个属性的setter
,getter
,在数据变动时发布消息给订阅者,触发相应的监听回调。实现流程
要实现mvvm的双向绑定,就必须要实现以下几点:
那么将需要observe的数据对象进行递归遍历
给这个对象的某个值赋值,就会触发
setter
,利用Obeject.defineProperty()来监听属性变动建立订阅者集合的数组,在setter中写入方法遍历并执行通知方法给所有的订阅者
1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。
算法
排序算法
冒泡排序
快速排序
二分查找法
返回-1或存在的数组下标。
数组去重
千位分隔符
各字符出现次数
找出正整数组的最大差值
随机生成指定长度的字符串
翻转字符串
阶乘
统计字符串次数最多的字符
找到句子中最长的单词,并计算它的长度
字符串的每个单词首字母都大写,其余部分小写
不利用第三方变量的情况下交换两个变量的值
安全
XSS跨域脚本攻击
发生了不在预期内执行的JS代码 ,达到获取本地的部分cookie信息等目的 。例如:网站form表单收集数据的时候,有的用户非法/恶意的把”html/css/js”代码内容给植入到form表单域中
XSS的分类
存储型XSS、反射型XSS、DOM-XSS
1、存储型XSS
数据库中存有的存在XSS攻击的数据,返回给客户端。若数据未经过任何转义。被浏览器渲染。就可能导致XSS攻击;
2、反射型XSS
将用户输入的存在XSS攻击的数据,发送给后台,后台并未对数据进行存储,也未经过任何过滤,直接返回给客户端。被浏览器渲染。就可能导致XSS攻击;
3、DOM-XSS
纯粹发生在客户端的XSS攻击
预防:从输入到输出都需要过滤、转义。
CSRF跨站请求伪造
过程
用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户的Cookie信息以的权限处理该请求,导致来自网站B的恶意代码被执行。
避免:
验证 HTTP Referer 字段 : 在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。
CSRF Tokens
最终的解决办法是使用CSRF tokens。在请求地址中添加 token 并验证 ,CSRF tokens是如何工作的呢?
攻击者需要通过某种手段获取你站点的CSRF token, 他们只能使用JavaScript来做。 所以,如果你的站点不支持CORS, 那么他们就没有办法来获取CSRF token, 降低了威胁。
确保CSRF token不能通过AJAX访问到! 不要创建一个
/CSRF
路由来获取一个token, 尤其不要在这个路由上支持CORS!Webpack
概念问题三:什么是Loader?什么是Plugin?
插件
html-webpack-plugin
extract-text-webpack-plugin
The text was updated successfully, but these errors were encountered: