WEB安全(XSS、CSRF、DDoS等)

语言: CN / TW / HK

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

介绍:同源策略、XSS(跨站脚本攻击)、CSRF(跨站请求伪造攻击)、DDoS(分布式拒绝服务)、实现跨域请求的两种方式、SQL注入、流量劫持

同源策略

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的关键的安全机制。

同源需要满足以下三个方面: * 协议相同 * 域名相同 * 端口相同

如果是非同源,则以下行为会受到限制: * Cookie、LocalStorage 和 IndexDB 无法读取 * DOM 无法获取 * AJAX 请求不能发送

解决方案: * CORS 跨域资源共享:CORS 亦即 跨域资源共享,是一种 HTTP 机制,它使用额外的 HTTP 响应头来告诉浏览器让其运行在一个 origin (domain) 上的 Web 应用被准许访问来自 不同源服务器 上的指定的资源。 * Node 代理跨域:利用 Node + Express + Http-Proxy-Middleware 搭建一个 Proxy 服务器。 * Nginx 代理跨域:Nginx 可实现用于反向代理的异步 Web 服务器,他除了用于反向代理以外还可以用于负载均衡、 HTTP 缓存。 * JSONP:动态创建 <script> 脚本标签,通过跨域脚本嵌入不受同源策略限制的方法实现请求第三方服务器数据内容。 * WebSocket:WebSocket 是一种通信协议,使用 ws://(非加密)和 wss://(加密)作为协议前缀,该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。 * window.postMessage * document.domain + iframe * window.location.hash + iframe * window.name + iframe

XSS - Cross Site Script(跨站脚本攻击)

跨站脚本攻击(Cross Site Scripting,简称 XSS),利用网页漏洞,在目标网站 HTML 页面中注入恶意脚本的攻击方法。 XSS 攻击的本质是恶意代码未经过滤,与网站正常的代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

XSS攻击分类

  • 存储型XSS:将恶意代码存储到漏洞服务器中,用户浏览相关页面发起攻击。
  • 反射型XSS:诱惑受害者去访问一个包含恶意代码的URL,注入脚本被传输到目标服务器上,然后服务器将注入脚本 "反射"到受害者的浏览器上,从而浏览器就执行了该脚本,反射是一次性的。
  • DOM-based型XSS:客户端的js可以对页面dom节点进行动态的操作,比如插入、修改页面的内容

存储型 XSS 的恶意代码 存在数据库 里,反射型 XSS 的恶意代码存在 URL 里。

如何防范

  1. HttpOnly防止劫取Cookie:浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie
  2. 输入检查:对于用户的任何输入要进行检查、过滤和转义
  3. 输出检查:服务器被黑,返回一串恶意执行的代码

CSRF/XSRF - Cross Site Request Forgery(跨站请求伪造)

跨站请求伪造(Cross-site Request Forgery,简称 CSRF),冒用受害者的登录凭证,执行非本意的操作的攻击方法。 CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充。

如何防范

  1. 验证码:验证码被认为是对抗 CSRF 攻击最简洁而有效的防御方法
  2. Referer Check:根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。通过 Referer Check,可以检查请求是否来自合法的"源"
  3. token验证:要抵御 CSRF,关键在于在请求中放入攻击者所不能伪造的信息,并且该信息不存在于 Cookie 之中

DDoS

分布式拒绝服务(Distributed Denial of Service,简称 DDoS),凡是能导致合法用户不能够正常访问网络服务的行为都算是拒绝服务攻击。

实现跨域请求的两种方式

JSONP

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSONP是JSON with Padding的略称

jsonp跨域的原理: 1. 使用script 标签发送请求,这个标签支持跨域访问 2. 在script 标签里面给服务器端传递一个 callback 3. callback 的值对应到页面一定要定义一个全局函数(为什么是全局?因为服务端接收到callback函数后会返回页面中的script中去找,如果不写在全局作用域中根本找不到) 4. 服务端返回的是一个函数的调用。调用的时候会吧数据作为参数包在这个函数里面。

CORS - Cross-origin resource sharing(跨域资源共享)

CORS需要浏览器和服务器同时支持。 跨域资源共享 CORS 详解

CORS与JSONP比较

CORS与JSONP的使用目的相同,但是比JSONP更强大。 JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据

参考

WEB安全 https://tsejx.github.io/javascript-guidebook/computer-networks/web-security/xss

Content Security Policy 入门教程 http://www.ruanyifeng.com/blog/2016/09/csp.html

又一次运维,恶意 js 脚本注入访问伪随机域名 https://www.lovelucy.info/malicious-javascripts-injection-and-random-domains.html

Cross-site scripting(跨站脚本攻击) https://developer.mozilla.org/zh-CN/docs/Glossary/Cross-site_scripting

web安全之XSS攻击原理及防范 https://www.cnblogs.com/tugenhua0707/p/10909284.html#_labe0

浏览器非机器人检测 https://bot.sannysoft.com/

前端常见跨域解决方案(全) https://segmentfault.com/a/1190000011145364?utm_source=tag-newest#articleHeader1