所有文章 > 技术杂货铺 > Golang 访问中断控制指南:示例及预防
Golang 访问中断控制指南:示例及预防

Golang 访问中断控制指南:示例及预防

数据保护是一个重要主题,尤其是在信息技术行业。这是因为数据保护和监管有时很困难。例如,人们几乎可以无缝地在互联网上获取任何类型的信息。

然而,某些类型的信息不应该向所有人开放,例如医疗记录。为了确保这些数据不会被任何人访问,《通用数据保护条例》(GDPR)等法规对用户个人数据的共享进行了监管。由于信息在互联网上很容易获取,信息技术行业必须寻找保护用户数据的方法。 

在 IT 行业,软件开发人员通过启用访问控制来保护个人数据。在本文中,我们将探讨什么是访问控制,然后讨论 Golang 中访问控制失效的具体情况、失效的示例以及如何防止失效。 

什么是访问控制?

访问控制的另一个名称是授权。信息技术领域的授权涉及验证一个人有权访问的文件、信息和数据的过程。授权定义了访问数据的权限。在 IT 公司中,访问控制大多是在身份验证之后进行的。 

身份验证中,系统会验证一个人是否确实是他们声称的那个人。例如,如果一个人声称自己是某个应用程序的用户,系统就会要求输入其用户名和密码。经过身份验证后,用户可以根据他们拥有的权限访问应用程序中的数据。要了解授权的工作原理及其设置权限的方式,让我们来看看不同的访问控制及其运作方式。 

访问控制方法

访问控制有三种不同的类型:自主访问控制 (DAC)、托管访问控制 (MAC) 和基于角色的访问控制 (RBAC)。 

自主访问控制 (DAC)

自主访问控制赋予组织负责人决定谁可以访问信息、文件或数据的能力。 

这种类型的访问控制赋予个人绝对权力来控制与其相关的所有对象和属性。这种类型的访问控制限制较少。例如,用户可以与恶意用户共享其保管的数据。 

管理访问控制 (MAC)

托管访问控制是一种高度限制性的访问控制方法,主要用于需要高度保密或谨慎的组织,例如军事部门。 

首先,管理员或根用户授予用户访问信息的权限。接下来,用户将通过一系列安全审查,然后才能最终访问信息。 

基于角色的访问控制 (RBAC)

基于角色的访问控制是最常用的访问控制。在这种类型中,员工会根据其角色被添加到列表中。此列表与数据库匹配,员工可以访问适合其角色的数据。 

RBAC 控制的一个优点是灵活性。此外,如果员工离职,公司可以快速地让新员工继续运营,因为他们不需要更改密码。 

Golang 中的访问控制失效

Golang 是一种出色的编程语言,可以加快产品构建速度。例如,使用 Golang 构建微服务可以节省大量时间并且效率很高。但是,软件开发人员必须保护用户的数据。这包括将授权纳入产品中。例如,开发人员可以使用基于令牌的授权策略(如JSON Web Token (JWT))将 RBAC 集成到 Go 应用程序中。 

在本节中,让我们探讨在 Golang 中破坏访问控制的不同方法。

客户端缓存

虽然客户端缓存是一个非常聪明的想法,但它也有缺点,可能会成为漏洞。例如,使用Redis 6 服务器辅助客户端缓存,Golang 可以在其应用程序中实现缓存。这样,我们可以在用户成功登录时缓存用户的信息,而无需在每次登录尝试时向服务器发送请求。这会带来一个漏洞,即攻击者在掌握用户信息后可以冒充所有者。 

另一个漏洞可能是用户从公共场所(如机场或网吧)访问网站,恶意行为者可以访问他们的信息。 

Golang 破坏访问控制指南:示例和预防措施图像

不安全的直接对象引用(IDOR)

当应用程序允许用户使用对象的直接标识符作为输入来访问对象时,就会发生此类漏洞。这允许攻击者跳过授权。 

例如,假设用户可以通过“https://ourpatients.com/userID=1234”路径访问自己的医疗记录。如果他们可以通过修改用户 ID 来访问其他患者的记录,那么就存在漏洞。 

损坏的对象级授权 (BOLA)

就像不安全的 IDOR 一样,损坏的对象级授权是一种漏洞,当 API 暴露带有对象标识符的端点时就会发生。例如,当使用 Gorilla Mux 时,你会得到如下结果: 

func main() {

// Init the mux router
router: = mux.NewRouter()

// Route handles & endpoints
// Get all books
router.HandleFunc("/books/", GetBooks).Methods("GET")

// Create a book
router.HandleFunc("/books/", CreateBook).Methods("POST")

// Delete a specific book by the bookID
router.HandleFunc("/books/{bookid}", DeleteBook).Methods("DELETE")

// Delete all books
router.HandleFunc("/books/", DeleteBooks).Methods("DELETE")

// serve the app
fmt.Println("Server at 8080")
log.Fatal(http.ListenAndServe(":8000", router))
}

注意用户如何根据自己的 ID 删除书籍。如果此 ID 被暴露,并且用户可以通过调整 URL 中的 ID 来删除书籍,那么就存在漏洞。 

CORS 配置错误

跨域资源共享 (CORS)允许外部域访问受限数据。跨域资源共享有时是必不可少的。例如,托管在另一个域中的前端应用程序可以访问另一个域中的后端应用程序。 

然而,CORS 通信错误可能会导致授权失败。例如,如果开发人员运行以下代码,他们将接受来自所有外部域的请求。

func enableCors(w * http.ResponseWriter) {
( * w).Header().Set("Access-Control-Allow-Origin", "*")
}

这可能构成威胁,尤其是当攻击者向应用程序发送恶意请求时。

预防 Golang 中的访问控制中断

在上一节中,我们探讨了 Golang 中访问控制失效的不同示例。在本节中,我们将讨论如何防止此类情况发生。 

CORS 配置

为了防止恶意攻击者因 CORS 配置错误而访问您的应用程序,开发人员需要在配置 CORS 时考虑安全性。例如,开发人员可以单独授予其应用程序访问权限,而不是授予每个外部域访问权限。 

例如,如果应用程序的前端域是“https://myfrontend.com”,则只应授予此域访问权限。为此,我们将“*”替换为“https://myfrontend.com”。

func enableCors(w * http.ResponseWriter) {
( * w).Header().Set("Access-Control-Allow-Origin", "https://my frontend.com")
}

缓存控制

虽然缓存非常有用,但开发人员可以将max-agemust-revalidate作为缓存控制的一部分来实现,以防止出现漏洞。这样,攻击者就无法使用他们的计算机访问用户的信息。开发人员可以通过将其包含在请求的标头中来做到这一点。 

Cache-Control "max-age=3600, must-revalidate"

防止破坏对象级授权和不安全的直接对象引用

许多公司的应用程序存在 BOLA 漏洞。为了防止这些漏洞,请采取以下步骤: 

  • 在 URL 中使用随机全局唯一标识符,而不是用户 ID。
  • 如果公司仍在路线中使用用户 ID,请确保用户可以访问他们尝试访问的页面。
  • 不要向试图修改 URL 中的 ID 的用户授予访问权限。相反,应从授权令牌中提取 ID。

结论

授权失效是一种安全漏洞。这是因为它使用户的个人数据容易受到恶意行为者的攻击。虽然保护用户数据似乎需要做很多工作,但有些应用程序可以帮助管理和监控产品的安全性。

文章来源:Golang Broken Access Control Guide: Examples and Prevention

#你可能也喜欢这些API文章!