如何应对 Headless CMS 中的安全隐患

阅读时长 4 分钟读完

随着头部 CMS(如 WordPress)以及客户端(尤其是 JavaScript 框架)的之间渐进式的分离,Headless CMS 的使用逐渐普及。Headless CMS 允许开发人员使用任何前端技术栈,无需了解 CMS 后台的技术,仅调用提供的接口进行数据访问。然而,这种使用方式也带来了一些安全风险。本篇文章旨在介绍如何应对 Headless CMS 中的安全隐患,帮助开发人员保障数据安全。

安全隐患分析

Headless CMS 因为其前后端的分离性,网站的数据由 CMS 的 API 接口提供,而这也意味着 API 的面临着外部攻击者的威胁。下面列举几个可能的危险:

1. SQL 注入攻击

作为 CMS 后端的数据库可能包含很多敏感信息,并且 数据库被不良用户插入的有害代码攻击造成的后果非常严重。所以我们要坚定的抵御 SQL 注入攻击的威胁。

2. XSS 攻击

由于 Headless CMS 输出的数据是由客户端渲染完成的,除了 CMS 的管理员之外,任何人都可以在 CMS 数据库中插入 JavaScript 等攻击代码,而这些代码很容易引发 XSS 攻击。

3. CSRF 攻击

客户端与 Headless CMS 之间交互的请求都是基于 API 完成的。那么客户端存在被恶意网站攻击的威胁,如果此时他的登录状态得以被保留在客户端,恶意第三方网站就有可能向 API 发送它所需的请求。

应对方法

虽然一些最新的 CMS 可以从内部阻止这些类型的攻击,但大多数 CMS 并没有这样的安全防护。因此,我们需要更加积极地采取安全措施。

1. 防止 SQL 注入攻击

在接口开发过程中,应该采用参数化的查询语句,在字符串连接时应该使用 escape 函数或者应用 ORM 库进行数据过滤。具体做法请参考以下代码示例:

2. 防止 XSS 攻击

CMS 应该以尽可能安全的方式输出内容,比如将所有用户内容进行 HTML 转义。 如果必须允许富文本(例如 markdown),则应使用正规化库来标准化内容并将其转换为 HTML,并使用强大的 HTML 清理器提高安全性。 以下是一个 JavaScript 格式化用户的富文本实现的示例:

-- -------------------- ---- -------
-- -- ----
-------- --------------- -
  ------ ----------------- ---------------------- --------------------- --------------------- ----------------------- ----------
-

-- --------- --- --
-------- --------------------- -
  ------ --------------------------- - ------------- ------ --------- ---- ---- ------ --------
-

----- ----------- - ------- ------------------ ---- ---- ------------------
----- ---------------- - --------------------------------------

3. 防止 CSRF 攻击

可以采用以下两种方式防止 CSRF 攻击:

  • 在请求头部添加 token 来校验:在客户端发送请求后,在 response header 中获取服务器返回的 token 标识,将其存放于 cookie 或者 localstorage 中,在下一次请求时,在请求头部中携带此 token 以验证请求的来源。

  • 在客户端 session 中缓存当前登录状态:有两种方法可以实现,第一种是在服务端发送 cookie,浏览器将其缓存,并在子域名中共享,当用户向 API 发送请求时,浏览器会自动将相应的 cookie 加入到请求头部中。第二种是使用 Authorization 验证头,在服务端访问登录 API 后,将返回的 token 存储在客户端 session 中,使用 Authorization 验证除登出 API 外的所有请求。

结论

Headless CMS 虽然提供了许多便利,但也增加了系统的脆弱性。因此,开发者在构建 Headless CMS 的应用程序时,必须考虑应对各种可能的安全攻击所带来的风险。本文介绍了几种简单可行的防御措施,我们可以根据实际情况灵活采用,从而保障数据安全。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67056c5bd91dce0dc8533ffe

纠错
反馈