同源策略可以隔离各个站点之间的 DOM
交互、页面数据和网络通信,但也约束了web
。所以我们默认页面中可以引用任意第三方资源,然后又引入 CSP
策略来加以限制;默认 XMLHttpRequest
和 Fetch
不能跨站请求资源,然后又通过 CORS
策略来支持其跨域。不过也带来了安全问题,如XSS
攻击。
XSS
Cookie
的HttpOnly
XSS
跨站脚本,黑客往HTML
文件或DOM
中注入恶意脚本,从而在用户浏览页面时利用注入脚本对用户实施攻击。
最开始是通过跨域实现的,所以叫跨域脚本。
当页面被注入了恶意 JavaScript
脚本时,浏览器无法区分这些脚本是被恶意注入的还是正常的页面内容,所以恶意注入 JavaScript
脚本也拥有所有的脚本权限
- 窃取
cookie
信息,通过document.cookie
获取Cookie
信息,然后通过XMLHttpRequest
或Fetch
加上CORS
发送给恶意服务器,恶意服务器拿到cookie
可以模拟登录转账 - 监听用户行为,用
addEventListener
监听键盘事件,获取信用卡信息、发送到恶意服务器、作违法的事 - 修改
DOM
伪造假的登录窗口,欺骗用户输入用户名和密码 - 页面生成浮窗广告,影响用户体验
XSS
分为存储型XSS
攻击、反射型XSS
攻击和基于DOM
的XSS
攻击3种方式注入恶意脚本。
- 存储型
XSS
攻击:黑客利用站点漏洞(输入名称成恶意代码)将恶意代码放到有漏洞的服务器,用户访问了有恶意代码的页面,恶意脚本会上传用户Cookie
信息到恶意服务器 - 反射型
XSS
攻击:恶意脚本成了用户发送请求的一部分(get
地址上),然后网站又把恶意代码返回给用户,页面执行时做恶意操作。Web
服务器不会存储反射型XSS
攻击的恶意脚本,这是和存储型XSS
攻击不同的地方。 - 基于
DOM
的XSS
攻击:不牵扯服务器。通过wifi
路由器,本地恶意软件劫持在web
资源传输过程中或使用页面中修改页面
首先都是先往浏览器注入恶意脚本,然后再通过恶意脚本将用户信息发送到恶意服务器。
解决:
- 服务器对输入脚本进行过滤或转码
- 充分利用
CSP
,限制加载其它域资源、禁止向第三方提交数据、禁止执行内联和未授权脚本、提供上报机制,可以尽快发现攻击进行修复 - 使用
httpOnly
属性,无法通过document.cookie
读出来 - 增加验证码
- 限制输入长度
CSRF
点链接
CSRF
跨站请求伪造,利用用户的登录状态通过第三方站点做一些坏事。在黑客站点中
- 自动发起
get
接口,比如黑客请求接口在img src
中,当加载图片时,会自动去发起img
请求,如恶意代码是转账,就会被转走。 - 自动发起
post
,隐藏表单并且内容是转账,打开站点会自动加载JS
进行提交表单,服务器进行转账。 - 引诱用户点链接,点图片地址是转账接口
CSRF
不需要将恶意代码注入页面,仅是利用服务器的漏洞和用户的登录状态实施攻击。
条件:
- 目标站点一定要有漏洞
- 用户登录过目标站点,并在浏览器上保持有站点的登录状态
- 需要用户打开一个三方站点(黑客
or
论坛),关键是找到服务器漏洞
解决:
- 利用
cookie
的SameSite
属性,cookie
是浏览器和服务器之间维护登录状态的关键数据。
通常CSRF
攻击都是从第三方站点发起的,最好能实现从第三方站点发送请求时禁止cookie
的发送。因此在浏览器通过不同源发送http
请求时,有如下区别:
(1).第三方发起的请求,需要浏览器禁止发送某些关键cookie
数据到服务器
(2).同一站点发起的请求,需要保证cookie
数据正常发送
通过Set-Cookie
的SameSite
属性值:Strict
最严,完全禁止第三方cookie
。Lax
:链接打开get
会带cookie
,post
,img
,iframe
,加载的url
不会带。none
:都会带。 - 验证请求的来源点,在服务器端验证请求来源的站点,服务器可以禁止第三方站点请求。
从请求头中Referer
和Origin
判断第三方。Referer
会包含路径来源地址信息。
会优先判断Origin
包含域名信息 CSRF token
:
1.浏览器发送请求时,服务器生成CSRF Token
植入返回的页面中。2.浏览器发起转账时要带上页面的CSRF Token
。
页面安全问题主要原因是浏览器为同源策略开的2个后门:一是页面可以任意引用第三方源。二通过CORS
跨域请求。
基于这些,又引入了CSP
限制页面任意引入外部资源、引入HttpOnly
来禁止请求发送一些关键cookie
、引入SameSite
和Origin
,来防止CSRF
攻击。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。