DEV Community

SameX
SameX

Posted on

HarmonyOS Next 安全开发实践感悟

本文旨在深入探讨华为鸿蒙 HarmonyOS Next 系统(截止目前 API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

一、安全开发环境搭建

(一)搭建步骤

要开启 HarmonyOS Next 的安全开发之旅,首先得搭建一个合适的开发环境。这就像盖房子前要先准备好坚固的地基一样重要。

  1. 安装开发工具 我们需要下载并安装 HarmonyOS Next 的官方开发工具包,例如 DevEco Studio。这个工具包就像是一个万能工具箱,里面包含了我们开发所需的各种工具,如代码编辑器、编译器、调试器等。安装过程就像按照说明书组装家具,按照提示一步步操作即可。不过要注意,在安装过程中,一定要选择安全的下载源,避免下载到被篡改的安装包,这就好比购买正品家具,要从正规渠道购买,防止买到假货。
  2. 配置开发环境变量 安装完成后,还需要配置一些环境变量,让系统能够找到我们安装的开发工具。这就像是给工具箱在房间里找一个固定的存放位置,并告诉大家这个位置在哪里,以便随时取用。例如,设置 JDK(Java Development Kit)的路径,因为 HarmonyOS Next 的开发可能会用到 Java 相关技术,JDK 就像是给我们提供建筑材料的仓库,没有它,我们无法构建出想要的软件大厦。

(二)环境安全配置要点

  1. 定期更新开发工具 开发工具就像我们手中的武器,要时刻保持锋利。定期更新开发工具可以确保我们拥有最新的安全修复和功能改进。想象一下,如果我们拿着一把生锈的剑去战斗(使用旧版本且存在安全漏洞的开发工具),很容易被敌人(攻击者)攻破。而定期更新就像是给剑打磨、升级,让它更加强大。
  2. 限制不必要的网络访问 在开发环境中,有些工具可能不需要联网就可以正常工作,对于这些工具,我们要限制其网络访问权限。这就好比给房子的门窗安装防盗网,防止小偷(恶意网络攻击)从这些不必要的通道进入。例如,我们可以在防火墙中设置规则,只允许开发工具访问必要的网络资源,如下载更新包的官方服务器等。

二、安全编码规范

(一)规范条目

  1. 输入验证 在处理用户输入时,一定要进行严格的验证。用户输入就像一个神秘的包裹,我们不能直接打开,必须先检查包裹是否安全(输入是否合法)。例如,如果我们的应用需要用户输入一个数字,那么我们要检查输入的内容是否真的是数字,而不是其他恶意字符,否则可能会导致程序出现异常甚至被攻击。
  2. 权限最小化原则 在代码中申请权限时,要遵循权限最小化原则。这就像在一个公司里,员工只被授予完成工作所需的最小权限。例如,如果一个应用只需要读取用户的联系人信息,那么就只申请读取联系人的权限,而不申请其他不必要的权限,如发送短信、拨打电话等权限,这样可以减少因权限过多而带来的安全风险。

(二)代码片段展示规范编码方法

  1. 输入验证代码示例 以下是一个简单的 ARKTS 代码片段,用于验证用户输入是否为数字:
function validateInput(input: string): boolean {
    const numberRegex: RegExp = /^\d+$/;
    return numberRegex.test(input);
}

let userInput: string = "123";
if (validateInput(userInput)) {
    console.log("输入有效,是数字。");
} else {
    console.log("输入无效,请输入数字。");
}
Enter fullscreen mode Exit fullscreen mode

在这个示例中,通过正则表达式来验证用户输入是否符合数字的格式,如果符合则返回 true,表示输入有效,否则返回 false

  1. 权限最小化代码示例 假设我们正在开发一个图片查看应用,只需要读取存储中的图片文件,以下是部分代码展示如何申请最小化权限:
import featureAbility from '@ohos.ability.featureAbility';

async function requestMinimalPermission(): Promise<void> {
    try {
        const permissions: Array<string> = ["ohos.permission.READ_USER_STORAGE"];
        const requestResult: number = await featureAbility.requestPermissionsFromUser(permissions);
        if (requestResult === 0) {
            console.log("权限申请成功,可读取用户存储中的图片。");
        } else {
            console.log("权限申请失败,请检查设置。");
        }
    } catch (err) {
        console.error("权限申请出错:", err);
    }
}
Enter fullscreen mode Exit fullscreen mode

在这个代码中,我们只申请了读取用户存储的权限,而没有申请其他无关权限,确保了权限的最小化使用。

三、安全测试与漏洞修复

(一)安全测试工具及方法

  1. 静态代码分析工具 静态代码分析工具就像一个严格的代码审查员,它不需要运行程序,而是直接对源代码进行分析。例如,Checkmarx 可以帮助我们发现代码中的潜在安全漏洞,如缓冲区溢出、SQL 注入等风险。它会仔细检查代码中的每一行,就像审查员逐字逐句检查文章一样,找出可能存在问题的地方。
  2. 动态测试方法 动态测试则是在程序运行时进行测试。我们可以模拟各种用户操作和环境条件,观察程序的行为。比如,通过模拟大量用户同时登录应用,检查系统在高并发情况下是否会出现安全问题,如身份验证失败、数据泄露等。这就像是在真实战场上测试武器的性能,看它在各种复杂情况下是否能正常发挥作用。

(二)实例说明漏洞发现与修复过程

假设我们开发了一个简单的登录应用,在进行安全测试时发现了一个漏洞。

  1. 漏洞发现 使用动态测试方法,当我们输入一个超长的用户名时,发现应用程序出现崩溃。这就像我们发现房子的一面墙在受到大力撞击时(输入超长用户名相当于一种异常输入攻击)突然倒塌了。经过分析,发现是在处理用户名输入的代码部分,没有对输入长度进行限制,导致程序在处理过长字符串时内存溢出。
  2. 漏洞修复 针对这个问题,我们可以在输入验证的代码中添加对用户名长度的限制。修改后的代码如下:
function validateUsername(username: string): boolean {
    if (username.length > 20) {
        console.log("用户名过长,请重新输入。");
        return false;
    }
    const validCharsRegex: RegExp = /^[a-zA-Z0-9_]+$/;
    return validCharsRegex.test(username);
}
Enter fullscreen mode Exit fullscreen mode

通过添加长度限制和更严格的字符验证,修复了这个漏洞,就像重新加固了那面倒塌的墙,让房子(应用程序)更加坚固安全。

遵循 HarmonyOS Next 的安全开发实践指南,从搭建安全开发环境,到遵循安全编码规范,再到进行全面的安全测试和及时的漏洞修复,就像为我们开发的软件穿上了一层又一层的防护铠甲。这不仅能保障应用的安全稳定运行,还能提升用户对我们产品的信任度。在开发过程中,我们要时刻保持警惕,将安全意识贯穿于每一个环节,才能在 HarmonyOS Next 的开发之路上走得更稳更远。

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay