所有文章 > 技术杂货铺 > Kotlin中的安全指南
Kotlin中的安全指南

Kotlin中的安全指南

安全性是软件开发中非常重要的一个方面。但是,保护应用程序安全可能意味着不同的事情。例如,Kotlin 中的安全性可能是指能够在 JVM 中安全地运行 Kotlin 应用程序。或者安全性可能处于 Kotlin 语言 API 级别。

作为开发人员需要考虑的另一个非常重要的安全级别是应用程序安全性。此处的应用程序安全性是指当黑客利用应用程序上的代码和功能窃取数据或破坏整个服务时存在的安全漏洞。

Kotlin 团队在修复与 JVM 和语言 API 相关的安全漏洞方面承担了更大的责任。他们主要通过发布 Kotlin 的更新和补丁来实现这一点。除此之外,他们还可能发布阻止漏洞的说明。

另一方面,应用程序安全需要您(开发人员)付出更多努力。应用程序安全漏洞的示例包括 SQL 注入、命令注入和 XSS。因此,修复应用程序安全问题包括测试和修补漏洞,例如SQL 注入、跨站点脚本、命令注入、跨站点请求伪造和HTTP 严格传输安全标头。

在本文中,我们将了解 Kotlin 中的安全性,并了解构建更安全的 Kotlin 应用的不同方法。那么,让我们开始吧。

Kotlin 安全性:优势与劣势

Kotlin 是一种安全的语言吗?它的优点和缺点是什么?我们将在本节中回答这两个问题。

Kotlin 安全指南图片

优势

与许多现代编程语言一样,Kotlin 致力于成为开发人员手中安全、快速且用户友好的工具。以下是 Kotlin 的一些优势。

1. 得益于空安全,崩溃更少:在语言 API 级别,Kotlin 提供空安全,以减少应用程序因意外数据或用户输入而崩溃的情况。如果使用得当,Kotlin 的空安全可以防止 NullPointerException。

2. 数据加密:Kotlin 拥有优秀的库,可帮助开发人员更轻松地加密数据。Kotlin 数据加密库的一个例子是Jetpack Security。

3. 频繁更新:安全是一个持续的过程。Kotlin 团队一直在发现新的漏洞,并发布补丁来解决可能发现的任何问题。

弱点

Kotlin 的一些安全漏洞包括:

1. 逆向工程— 拥有足够技术知识的人可以对您的 Kotlin 应用进行逆向工程,从而让他们更了解您应用的内部工作原理。此外,如果您在应用中捆绑了 API 凭据等敏感数据,这些数据也可能会暴露。

2. 互联网驱动的 API — 大多数程序出于某种原因都需要连接到互联网。Kotlin 有一些内置工具,用于支持应用程序的互联网驱动功能。两个例子是HttpsURLConnectionWebView。通过非 SSL 协议发出 HTTP 请求可能会在传输过程中暴露敏感数据。同样,错误使用 WebView API(例如允许执行任何 JavaScript 代码并允许用户通过您的应用程序访问任何 URL)会增加安全风险。

提高 Kotlin 安全性的功能

从本质上讲,Kotlin 与其他编程语言一样,包含多项安全功能。不过,在本节中,我们将介绍两项 Kotlin 独有的功能,它们使 Kotlin 更加安全。

1. 不变性:Kotlin 改进 Java 的一种方法是通过提供关键字来将变量声明为可变或不可变。这些关键字是valvar。用val声明的变量是不可变的,这意味着您无法在程序中稍后为其重新分配新值。

2. 空安全:之前,我们提到空安全是 Kotlin 的优势之一。此功能可帮助开发人员编写更安全的应用程序。例如,有了空安全,开发人员更有可能在出现意外空值时捕获并提供安全的代码执行路径。换句话说,这可以减少 NullPointerException 的发生。

Kotlin 库和框架

在本节中,我们将了解一些流行的 Kotlin 库和框架以及它们如何处理安全性。

1. Ktor

Ktor是一个使用 Kotlin 构建 Web 应用程序和微服务的框架。您可以使用 Ktor 开发 RESTful API,以便移动或 Web 应用程序通过 HTTP 请求与之交互。此外,您还可以使用 Ktor 直接呈现 HTML 响应。在这种情况下,您可以使用 Ktor 构建全栈 Web 应用程序。

Ktor 非常灵活,可以与其他工具集成以构建复杂的应用程序。例如,您可以将 Ktor 与 SQL 数据库一起使用来保存数据。但是,功能实现不佳可能会使您的 Ktor 应用程序面临 SQL 注入等安全问题。

2. 春季

Spring 是用于构建微服务和通用 Web 应用程序的流行 Java 框架。从 Spring 项目生成器第五版开始您可以使用 Kotlin 生成新的 Spring 项目。

Spring 应用程序还可能容易受到 SQL 注入和 XSS 等攻击。

3. Javalin

Javalin是一个轻量级 Java 和 Kotlin 框架,提供 WebSocket、异步请求和 HTTP2 支持。Javalin 的优势之一是它非常适合构建 RESTful API。例如,它对 OpenAPI 有很好的支持,可以与 Swagger 等工具一起使用。此外,Javalin 应用程序在非常流行的 JVM Web 服务器 Jetty 上运行。

再次,未经过适当优化的 Javalin 应用程序可能会容易受到安全问题的影响。

Kotlin 安全库

1. Hibernate 验证器

Hibernate Validator是一个 Java 和 Kotlin 库,用于验证用户输入等数据。未经适当验证就解析用户输入的应用程序更容易受到攻击。因此,攻击者会利用它们执行 XSS、SQL 注入和其他命令注入攻击等攻击。

使用这个验证库,我们可以很大程度上降低被攻击的风险。下面是 Hibernate Validator 工作原理的一个示例:

数据类

data class UserDto(
    @field:Max(value=100)
    @Email()
    val email: String,
    @field:Min(value=8)
    val password: String
)

应用类

fun Application.module() {

val userService = UserService()
val validator = Validation.buildDefaultValidatorFactory().validator

routing {
post("/auth/register/") {
val userDto = call.receive<UserDto>()
userDto.validate(validator)
service.process(userDto)
call.respond(HttpStatusCode.OK)
}
}
}

从上面的示例代码中,我们使用@Email注释来验证 email 的值是否是实际的电子邮件地址。我们还使用@Min注释来验证密码的长度是否大于八个字符。

2. Ktorm

Ktorm是 Kotlin 的一个对象关系映射(ORM)框架。简单来说,它是一个让使用 SQL 等关系数据库变得更容易的工具。

以下示例展示了使用 Ktorm API 的 SQL 查询:

数据类

object Users : Table<Nothing>("users_tbl") {
    val id = int("id").primaryKey()
    val email = varchar("email")
    val password = varchar("password")
}


应用类

val database = Database.connect("jdbc:mysql://localhost:3306/mydb", user = "root", password = "")

database
.from(Users)
.select(Users.email)
.forEach { row ->
println(row[Users.email])
}

在上面的例子中,我们从users_tbl中打印值。借助 Ktorm 的 Kotlin DSL,我们不必编写任何原始 SQL 查询。

使用 ORM 可以降低 SQL 注入的风险。但是,值得一提的是,如果您在使用 ORM 时编写大量原始 SQL 查询,您的应用程序仍然可能存在漏洞。在下一节中,我们将介绍提高 Kotlin 总体安全性的其他做法。

Kotlin 安全最佳实践

以下做法的组合可以降低 Kotlin 中的安全风险。

1. 在解析或输出用户输入之前验证它们。不这样做可能会使您的应用程序遭受 SQL 注入和 XSS 攻击。

2. 避免将 API 配置密钥存储在代码中。前面我们提到,逆向工程带来的风险之一是暴露 API 密钥等敏感信息。为了降低此类风险,您应避免将 API 密钥以字符串形式存储在应用程序中。相反,尽可能使用环境变量,或使用其他方法加密密钥。

3. 保持工具更新。始终保持应用程序使用的 Kotlin 版本为最新版本。此外,如果您使用任何其他第三方库和依赖项,也应保持它们为最新版本。

4. 在通过网络发送数据之前对其进行加密。如果您的应用程序通过互联网发送消息和密码等敏感数据,请在发送之前使用良好的加密方法对这些数据进行加密。这样做可以降低数据在传输过程中被截取和读取的风险。

Kotlin 中常见的安全攻击

Koltin 中最常见的一些应用程序安全风险包括:

1. SQL注入

SQL 注入是一种攻击类型,攻击者操纵易受攻击的网站或应用程序上的 SQL 查询。

为了实施此类攻击,攻击者通常会针对接受用户输入的功能进行攻击。例如,攻击者可能会操纵 Web 应用程序 URL 中 ID 的值。

防止 SQL 注入的一个好方法是在将用户输入用于 SQL 查询之前对其进行验证。防止 SQL 注入的另一种方法是使用PreparedStatement

2.跨站点脚本(XSS)

XSS是一种安全漏洞,允许用户将恶意 JavaScript 代码注入网站。

攻击者可以使用各种方法发起 XSS 攻击,包括显示用户输入的页面。例如,攻击者可能使用允许用户回复帖子的网站的回复功能提交恶意代码。然后,只要普通用户加载包含回复的页面,恶意代码就会被执行。

防止 XSS 攻击的一种有效方法是验证和清理用户输入。

3. 命令注入

命令注入是一种注入攻击,攻击者将恶意代码注入服务器。然后,服务器或后端像运行正常应用程序代码一样运行此代码,从而使攻击者能够访问数据和其他资源。

此类攻击可通过用户输入进行。攻击者可能通过 URL 查询参数注入代码。

防止命令注入的一个好方法是避免使用代码中执行命令的函数。除此之外,清理用户输入也可以降低风险。

4.跨站请求伪造(CSRF)

CSRF是一种利用网站对经过身份验证的用户的信任的攻击。在这种攻击中,未经授权的命令会以经过身份验证的用户的名义执行。

攻击者实施此攻击的一种方式是诱骗毫无戒心的经过身份验证的用户点击目标应用程序的操纵 URL。

为了破解 CSRF,应用程序应该在执行命令之前验证请求是否是伪造的。

5.HTTP 严格传输安全标头

HTTP 严格传输安全标头使浏览器能够将对网站的访问限制为仅允许 HTTPS 请求。通过不安全的 HTTP 协议发送数据可能会在传输过程中暴露数据。

为了防止与严格传输安全标头相关的漏洞,请在 Web 应用程序上启用 HTTPS。

结论

总而言之,以下是我们对 Kotlin 安全性讨论的几点总结:

  • 与大多数流行的编程语言一样,Kotlin 会不断更新以修补安全漏洞。
  • 但是,应用程序的安全性取决于开发人员如何在其应用程序中使用功能和工具。您应该始终测试应用程序是否存在常见的安全漏洞。
  • 最后,保持所有工具(包括您在应用程序中使用的第三方依赖项)保持最新也可以提高安全性。

文章来源:Guide to Security in Kotlin

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