将Web安全问题按照发生的区域来分类,发生在浏览器、Web页面中的安全问题就是前端安全问题。html
同源:URL由协议、域名、端口和路径组成,若是两个URL的协议、域名和端口相同,则表示他们同源。前端
URL | 是否同源 | 缘由 |
---|---|---|
http://test.test.com/dir2/oth... | 是 | |
http://test.test.com/dir/test... | 是 | |
https://test.test.com/test.html | 否 | 协议不一样 |
http://test.test.com:8080/test.html | 否 | 端口不一样 |
http://test123.test.com/test.... | 否 | 域名不一样 |
浏览器的同源策略,限制了来自不一样源的document
或脚本,对当前document
读取或设置某些属性。从一个域上加载的脚本不容许访问另一个域的文档属性。ajax
若是没有同源限制存在,浏览器中的cookie等其余数据能够任意读取,不一样域下DOM能够任意操做,ajax能够任意请求。若是浏览了恶意网站那么就会泄漏这些隐私数据数据库
在浏览器中,<script>
、<img>
、<iframe>
、<link>
等标签均可以加载跨域资源,而不受同源限制。后端
这些带src
属性的标签每次加载时,其实是由浏览器发起了一次GET请求。不一样于XMLHttpRequest
的是,经过src
属性加载的资源,浏览器限制了JavaScript的权限,使其不能读、写返回的内容。
XSS,即Cross Site Script
(跨站脚本攻击);为了和层叠样式表(Cascading Style Sheet
)作出区分,在安全领域叫作 XSS。跨域
XSS 攻击是指攻击者在网站上注入恶意的客户端代码,利用恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。有不少种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像cookie
、session
发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操做。浏览器
恶意代码并无保存在目标网站,经过引诱用户点击一个连接到目标网站的恶意连接来实施攻击。安全
攻击流程:服务器
恶意代码被保存到目标网站的服务器中,这种攻击具备较强的稳定性和持久性,比较常见场景是在博客,论坛、OA、CRM等社交网站上。cookie
攻击流程:
基于DOM的XSS攻击是指经过恶意脚本修改页面的DOM结构,是纯粹发生在客户端的攻击。DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞。
攻击流程:
location.hash
获取的参数等在源头控制,把用户输入的一些不合法的东西都过滤或者编码掉,从而保证安全性。如移除用户提交的的DOM属性如onerror
,移除用户上传的节点,<iframe>
,<script>
,<a>
节点等。
通常业务中是对客户端和服务端中同时进行输入检查。
利用转义库对 HTML 模板各处节点进行充分的转义。
使用HttpOnly
经过设置HttpOnly
,浏览器能够禁止页面的JavaScript访问带有HttpOnly
属性的Cookie
。它的目的并不是是为了对抗XSS,而是对抗XSS以后的Cookie
劫持攻击。
Cookie的使用过程:
- 浏览器向服务器发起请求,此时没有Cookie
- 服务器返回Set-Cookie头,向浏览器写入Cookie
- 在Cookie到期以前,浏览器访问该域下的全部页面,都将发送该Cookie
HttpOnly
是在Set-Cookie
的时候进行标记的
Set-Cookie: <name>=<value>[; <Max-Age>=<age>]
[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; HttpOnly]
对输入的内容限定合理长度,能够增长XSS攻击的难度
前端使用拼接HTML或者内联事件的状况比较危险,建议替换为createElement
、setAttribute
及addEventListener
的实现方法,或者采用成熟的框架进行渲染,如Vue/React
等
开启CSP网页安全政策(Content Security Policy
)
一种由开发者定义的安全性政策申明,经过CSP所约束的责任指定可信的内容来源,(内容能够是指脚本、图片、style 等远程资源)。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源能够加载和执行,等同于提供白名单。
开启方式:
Content-Security-Policy
字段<meta>
标签<meta http-equiv\="Content-Security-Policy" content\="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"\>
跨站请求伪造攻击,原理就是攻击者构造出一个后端请求地址,诱导用户点击或者经过某些途径自动发起请求。利用受害者在被攻击网站已经获取的注册凭证,绕事后台的用户验证,冒充用户执行某些操做。
通常是利用<img>
标签等发起
<img src="http://test.com/test?test=test">
在被攻击者访问页面时,浏览器会自动向src
指向的地址发出请求
一般是构造一个自动提交的表单在页面上,模拟用户完成了一次POST操做
一般是须要诱骗用户点击才会触发
经过增长网站A的验证手段,例如增长图形验证码或短信验证码等等,只有经过验证的请求才算合法。可是这种方案拥有两个局限性,一个是增长开发成本,另一个是下降用户体验。
Referer
根据 HTTP 协议,在 HTTP 头中有一个字段叫Referer
,它记录了该 HTTP 请求的来源地址。经过验证Referer
,能够检查请求是否来自合法的"源"。
Token
服务端随机生成token,保存在服务端session中,同时保存到客户端中,客户端发送请求时,把token带到HTTP请求头或参数中,服务端接收到请求,验证请求中的token与session中的是否一致。若是请求中没有 token 或者 token 内容不正确,则认为多是 CSRF 攻击而拒绝该请求。
在一个Web页面下隐藏了一个透明的iframe
(opacity:0
),用外层假页面诱导用户点击,其实是在隐藏的frame上触发了点击事件进行一些用户不知情的操做。
<iframe>
z-index
和opacity
将<iframe>
叠加到实际页面上方并透明化X-FRAME-OPTIONS
服务器端可设置HTTP头X-Frame-Options:DENY
来让浏览器主动禁止<iframe>
内嵌,可是这种方式须要结合HTTPS来实现,由于HTTP不可靠,容易被窃听篡改内容