Web 安全之浅见

Photo by Ozzie Stern on Unsplash

CSRF(跨域请求攻击) 与 CORS

一旦允许站点跨域请求,就会有 CSRF 问题的出现。CSRF 是指攻击者通过伪造页面的方式,诱导用户点击被伪造的页面,然后在页面中注入目标页面的 URL。一旦用户点击 URL,用户的 Cookie 就会被带上在服务端进行验证。若服务端没有防范非法跨域请求的能力,那么就会导致后台数据在用户不知情的情况下被恶意修改。

庆幸的是,现代浏览器都对非同源请求做了限制,若要启动非同源请求需要,后端服务程序会根据 CORS 对发起的请求进行过滤。只有后端程序允许,才能对跨域请求予以“放行”。一般来说,在服务程序中使用 CORS 来控制 ORIGION 和 REFERER,就能规避 CSRF 的发生。

当然防范 CSRF 的方法还有很多,比如后端渲染的页面可以直接在表单上注入随机的 CSRF TOKEN 来校验每一次提交的请求是否合法等。

XSS(跨站脚本攻击)

XSS 主要是指黑客把恶意脚本注入到 URL中,并由后端程序把恶意代码当做参数渲染在页面上返回给浏览器进行执行的一种攻击方式。细分下来主要包含三种不同的形式。

反射型 XSS 。黑客通过电子邮件或者其他社工形式把一个包含恶意代码的 URL 发送给受害者,诱使其点击。后端程序把 URL 上携带的恶意代码当做参数取出并且渲染在页面上。这样一旦用户点击这个 URL 时,浏览器就会执行包含恶意代码的页面。

DOM 型 XSS。和发射型 XSS 一样,黑客通过电子邮件或者其他社工形式把一个包含恶意代码的 URL 发送给受害者,诱使其点击。不同的是,后端程序把 URL 上携带的恶意代码当做参数取出,并赋值给某个脚本变量,返回给受害者,在浏览器端用脚本将恶意代码渲染在页面上并执行。可以看到和发射型 XSS 不同的地方在于恶意代码渲染的时机。

存储型 XSS 。是指黑客精心构造一个包含恶意代码的 URL发送给服务器。后端服务器没有验证 URL 传参中的恶意脚本部分,而是直接把这部分代码存储在数据库中。一旦当其他用户浏览该网站的功能页面,后端程序会把恶意代码从后端数据库中取出并渲染在页面上,从而导致攻击发生。

XSS 与 CSRF

XSS 与 CSRF 的最大区别在于, XSS 是由受害者直接访问目标站点,没有涉及到跨域的问题。漏洞的产生在于服务端没有对URL 中的参数进行校验,从而页面包含恶意代码。而 CSRF 是由受害者无意间向目标服务器发起跨域请求,并使用浏览器存储的 Cookie 饶过验证。漏洞的产生在于后端程序未对跨域的请求进行限制。

参考链接

Using CORS policies to implement CSRF protection

Cross-site scripting

DOM-based XSS 与存储性 XSS、反射型 XSS 有什么区别?

Base64 编码与 JSON 交换

JSON 是常用的数据交换格式。但是由于 JSON 本身并不支持文件图片等形式的附加数据,想要直接借助 JSON 来实现文件的传输非常困难。一般的做法是,首先需要使用 Base64 编码将这些数据从二进制流编码成为字符形式,再封装成 JSON 格式进行传输。

本文首先讨论 Base64 编码大致原理,然后引入 MIME 类型的简单介绍,最后通过 Web API 来实现文件的自动编码实现文件图片等内容的 JSON 传输。

继续阅读Base64 编码与 JSON 交换