【前端开发】代码上传前怎么避免把 账号,密码,AppId, key 之类私密信息 提交上去

news/2025/1/4 13:17:20/文章来源:https://www.cnblogs.com/o-O-oO/p/18639669

平时我们写代码的时候难免会有一些私密信息不行提交到git仓库上去,比如 账号,密码,AppId, key 之类不希望公开的信息,但是提交代码难免会有疏漏的时候,对此我们可以写个 githook 来协助我们进行检查。

目的

在Git提交操作前,对即将提交的文件进行全面扫描,检查其中是否存在预设的敏感信息,防止敏感数据不慎进入版本控制系统,有效维护项目的安全性与保密性。

比如我们现在这么一段代码

const mysql = require("mysql");
const pool = mysql.createPool({host: "jyeontuHost",user: "jyeontuUser",password: "jyeontuPassword",database: "jyeontuDatabase",port: 3306,multipleStatements: true, // 多语句查询
});

假设其中的用户名(jyeontuUser) 和密码(jyeontuPassword) 是敏感信息,我们不想这两个信息直接提交到git仓库,所以希望在提交代码的时候可以检测一下是不是包含敏感信息,包含敏感信息的话就中断commit 通知我们进行整改,整改后再重新提交。

效果展示

commit的时候检测到提交的文件中包含有敏感信息时,会中断commit,并在控制台打印包含敏感信息的文件路径及行号,可以帮助我们快速定位到敏感信息的位置。

代码实现

1、指定脚本解释器

作为一名前端开发,我们可以使用node 来写一个githook

#!/usr/bin/env node

2、引入必要模块

const child_process = require("child_process");
const fs = require("fs");

这里引入了child_process模块,用于在Node.js环境中执行外部命令,如git status;fs模块则提供了一系列与文件系统交互的方法,包括读取文件内容、检查文件是否存在等操作,是后续处理文件的关键。

3、获取Git状态信息

const command = "git status";
const trimReg = /(\ +)|([ ])|([\r\n]|(["]))/g;
let commitFile = child_process.execSync(command).toString();
commitFile = commitFile.split("\n").filter((item) => item);

首先定义了要执行的git status命令字符串,然后通过execSync同步执行该命令,并将输出转换为字符串存储在commitFile中。接着,按换行符将其分割为数组并过滤掉空行,得到一个更清晰的文件状态信息数组,为后续解析做准备。

4、解析文件列表

const fileList = [];
let index = 0;
while (commitFile[index]!== "Changes to be committed:" &&index < commitFile.length
)index++;
for (let i = index; i < commitFile.length; i++) {const name = commitFile[i].trim().split(":")[1];if (!name) continue;if (name.includes("->")) {fileList.push(decodeURI(name.split("->")[1].replace(trimReg, "")));continue;}fileList.push(decodeURI(name.replace(trimReg, "")));
}

我们需要检查的是Changes not staged for commit状态的文件

从commitFile数组中提取出即将提交的文件列表。先通过while循环找到"Changes to be committed:"所在索引,确定要处理的文件信息起始位置。然后在for循环中,对每一行文件信息进行处理,提取文件名(处理了文件重命名情况),并使用decodeURI解码后添加到fileList数组,得到完整的待提交文件列表。

5、检查敏感信息

//敏感信息列表
const sensitiveInformationList = ["jyeontu的密码","jyeontu的AppId","jyeontu的账号",
];const editFiles = [];
for (const file of fileList) {if (!fs.existsSync(file)) continue;const fileTxt = fs.readFileSync(file, "utf8").split("\n");for (let textLine = 0; textLine < fileTxt.length; textLine++) {const txt = fileTxt[textLine];for (const sensitiveInformation of sensitiveInformationList) {if (txt.includes(sensitiveInformation)) {editFiles.push(`\x1b[31m${file}:${textLine + 1}\x1b[0m -> ${sensitiveInformation}`);}}}
}

需要我们先定义好敏感信息列表,包含常见的敏感数据关键词。然后通过嵌套循环,遍历文件列表中的每个文件。对于存在的文件,读取其内容并逐行检查,若某行包含敏感信息列表中的任何一项,则将包含文件名、行号(红色字体显示以突出)和敏感信息的格式化字符串添加到editFiles数组,记录所有存在敏感信息的位置。

6、处理检查结果

if (editFiles.length > 0) {console.log("请删除敏感信息后再次提交:");console.log(editFiles.join("\n"));process.exit(1);
}
process.exit(0);

最后根据editFiles数组长度判断是否发现敏感信息。若有敏感信息(editFiles.length > 0),则输出提示信息及详细敏感信息位置,以非零状态码退出脚本,阻止Git提交;若未发现(editFiles.length === 0),则正常退出脚本,允许Git提交。

钩子使用

1、钩子目录

找到当前项目更目录下的.git 目录,里面有一个hooks 目录,这里便是我们存放钩子函数的目录。

2、拉取钩子代码

目前该钩子的模板我已经集成到了我自己的cli 工具中,大家可以通过cli 快速拉取

安装cli

npm i -g jyeontu

拉取钩子模版

jyeontu add

拉取后可以看到这么一个文件

3、修改敏感信息列表

拉取完钩子模板后,我们需要将敏感列表修改成我们自己需要检测的内容:

改完保存之后再重新提交代码就会触发内容检测了。

更优做法

其实正常情况下我们不应该将这些配置信息分散写在各个文件中,这样不好管理,修改起来也麻烦,通常我们都会将配置信息抽离成一个配置文件。
1、抽离配置文件

比如上面用到的mysql 相关配置

2、配置.gitignore

整个文件都不想提交的话我们配置好.gitignore就行

serve/dbConfig.js

3、移除文件跟踪

当然,有的时候我们还是要上传一份config 配置文件模板到仓库,便于用户修改自己的配置信息,这种时候我们就不可以直接在.gitignore 里面忽略文件了。

我们可以先写一份不包含敏感信息的配置文件模板上传到仓库中,然后再将其移除版本控制,这样后面即使文件的实际内容可能已经发生了变化,Git 也会将其视为未更改状态

git update-index --assume-unchanged <file>

4、恢复文件跟踪

git update - index -- no - assume - unchanged <file>

配置模板修改的话,我们需要上传新的模板,这时候我们可以先恢复文件跟踪,将最新模板上传到仓库后再移除文件跟踪。

配置文件抽离 ➕ gitHook检查,这应该可以很大程度 避免把 账号,密码,AppId, key 之类私密信息 提交上去 了。

源码

文中涉及到的git hooks 模板 和jyeontu cli 都已开源,有兴趣的同学可以看看:
1、git hooks 模板库

https://gitee.com/zheng_yongtao/jyeontu-templates

2、jyeontu cli

https://gitee.com/zheng_yongtao/node-scripting-tool/tree/master/src/jyeontu

原创 JYeontu 前端也能这么有趣

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861038.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

已有的事后必再有

学期回顾 1.1 回顾对软件工程课程的想象 对软件工程的第一印象 最初,我对软件工程的理解非常肤浅,以为它只是一门普通的专业课程。然而,随着个人作业、结对作业和团队编程的深入,我深刻体会到了软件开发的巨大压力。 初步达到我的预期 在这三个月的学习实践中,我参与了需求…

秒杀场景的设计思考

秒杀场景的设计思考 在学习Redis的之后,一个绕不开的话题就是秒杀系统的设计。本文将从下面几个方面展开一下个人简单的理解:秒杀场景的介绍 设计的核心思路 怎么限流、削峰、异步 planB 总结‍ 秒杀场景的介绍 秒杀场景是大家常说的高并发场景,但是实际上其与单纯的高并发还…

UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave

3. FLinkerLoad, FLinkerSave分别是UObject的反序列化和序列化的内核3.0. UPackage与UObjectUObject因为涉及与其他UObject的复杂引用关系,如果我们客制化地单独正反序列化每一个UObject,我们会在反序列化的时候惊觉这是繁琐而不可能的。为了满足UObject这种复杂的对象的序列…

设计Element UI表单组件居然如此简单!

0 前言 上文讲解了Jest框架对组件库测试,TypeScript和Jest都为代码质量和研发效率。之前实现Container和Button组件以渲染功能为主,可根据不同属性渲染不同样式去实现布局和不同格式的按钮。 本文的表单组件,除了要渲染页面组件,还支持很好页面交互,从Element3的表单组件开…

Kubernetes(v1.29)学习笔记

什么是KubernetesK8s是Kubernetes的简称,是一个开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序。 Kubernetes源于希腊语,意为“舵手”或“飞行员”,其主要功能包括服务发现与负载均衡、存储编排、Secret和配置管理、批量执行、水平扩缩、自动化上线和回滚、自…

简答题

1 冯诺依曼结构计算机的基本思想是什么 ?按此思想设计的计算机硬件系统的应由那些部件组成,它们各有什么作用? 存储程序和程序控制是冯诺依曼结构计算机的主要设计思想。存储程序是指将解题的步骤编写为程序,然后将程序和运行程序所需要的数据以二进制的形式存放到存储器中…

基于双PI控制器和三电平SVPWM交流同步直线电机矢量控制系统的simulink建模与仿真

1.课题概述基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真。通过PSO粒子群优化进行最大功率跟踪。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介光伏(Photovoltaic, PV)发电系统利用太阳能直接转换成电能,是实现可持续能源战略的重要组成部分。…

Gridview使用CheckBox全选与单选 Version 3

还是有网友开发ASP.NET程序,今天联系Insus.NET说,参考下面随笔,无法实现,没有效果。Gridview使用CheckBox全选与单选 Version 2 https://www.cnblogs.com/insus/archive/2013/05/22/3093114.html 几番仔细检查,放大对着搬,照抄,没能错呀!说实的,具体原因,Insus.NET…

RL中on-policy和off-policy的本质区别/重要性采样

讨论了on-policy和off-policy的本质区别。说明了off-policy MC和off-policy TD是如何利用重要性采样的,以及为什么Q-learning不需要进行重要性采样。本随笔的图片都来自UCL强化学习课程lec5 Model-free prediction的ppt (Teaching - David Silver ). 回忆值函数的表达式: \[v…

2024-2025-1 20241319 《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 《C语言程序设计》第13章作业正文 https://www.cnblogs.com/wchxx/p/18639513**教材学习内容总结 1. 文件的打开与关闭…

视野修炼-技术周刊第115期 | 现代的 Nodejs 能力

① 一些现代的 Nodejs 能力 ② MarkItDown ③ ReactAI ④ 背景移除 ⑤ 智能图片描述生成器生成器欢迎来到第 115 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔥强烈推荐一些现代的 Nodejs 能力🔧开源工具&技术资讯MarkItDown ReactAI🤖AI工具&资讯背…

2024-2025-1(20241321)《计算机基础与程序设计》第十四周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十四周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.…