“防御式编程”之三板斧

221 阅读3分钟

image.png

背景

因为大环境的持续低迷,开源节流风气横行,码农们重新把防御式编程的概念拎出来重新定义。最近浏览了几篇防御式编程思路,于是我磨刀霍霍带带节奏。

防御式三板斧

代码管理✘

代码基本属于Git管制,code、记录基本透明化。

本地开发(1)✔

以JavaScript为例,主流框架都进行了工程化管理。本地开发以nodejs的npm包管理器为指令集管理。常见指令:

// 启动本地服务
npm run start

// 打包部署包
npm run build

// 本地远程部署
npm run deploy

第一板斧就砍在这里,给npm run [script]指令加执行条件,npm run pre[script]前置钩子指令直接执行就可以拎出来做文章。在前置钩子指令中执行node脚本并且屏蔽日志。

"prestart": "npm run prev:win --silent", 
"prev:win": "node ./tests/beforewin",

beforewin.js脚本里面做什么呢?设置一把常规钥匙,输入正确才能正常执行npm run [start|build|deploy]

触发Key验证

image.png

输入Key错误

image.png

输入Key成功

image.png

操控终端(2)✔

第二板斧砍在终端上,监听终端上的快捷键及指令执行情况。

  • 监听Ctrl + C,预防强行退出前置钩子指令直接执行npm run [start|build|deploy]
process.on('SIGINT', () => {  
  console.log('接收到 Ctrl+C 信号,停止执行整个脚本...');  
  process.exit();  
});  
  • 监听指令执行顺序,确保前置钩子指令必须执行。

加密与解密(3)✔

第二板斧砍在加密与解密上。

  • 让执行脚本变成个沙箱,脱离业务代码管制。
// 发布一个npm包,隐式引入项目(项目中引入一个自研公共包,以子包方式嵌入)。
  "dependencies": {
    "mx-utils": "^1.0.1",
   }
  • Key的设置由自研加密算法加密设置(只要自己能理解就行☹)

image.png

// 关键字符阵列化,以角度和0,0坐标偏移距离在阵列中标记,生成加密文本
const array = 'a|b|c|d|e|f|...';
// 加密算法默认iv=0081,角度分为8份,坐标偏移距离为1
abm ---> 000104511802
a --->角度为0默认补全3位(000),第四位以0,0坐标偏移距离(1)
b --->角度为45默认补全3位(045),第四位以0,0坐标偏移距离(1)
m --->角度为180(180),第四位以0,0坐标偏移距离(2)
  • Key的识别比对由自研解密算法处理

备注

上述防御式编程思路属于歧路,不建议用于实践。弘扬正能量,文心一言防御型编程正确概念如下:

防御式编程是一种编程实践,旨在减少软件中的错误,增加程序的健壮性,并提供更可靠的软件。其核心理念是在编写代码时考虑到各种可能的异常情况,并采取措施来预防和处理这些异常情况。

防御式编程的一些常见实践包括:

  1. 输入验证:验证所有输入数据,确保它们符合预期的格式和类型,并在必要时进行清理或转换。
  2. 错误处理:在可能出现错误的情况下,使用异常处理机制来捕获和处理错误。
  3. 防御性读取:从文件或数据库中读取数据时,检查读取操作是否成功,并采取适当的措施来处理读取错误。
  4. 冗余代码:编写额外的代码来检查和纠正可能的错误或异常情况。
  5. 边界检查:检查数组、列表和其他数据结构的边界条件,以防止越界访问。
  6. 安全性:采取措施来防止安全漏洞,例如通过使用安全的编程实践和库来加密数据和验证用户输入。

通过实施防御式编程实践,可以大大提高软件的质量和可靠性,并减少因错误而导致的软件崩溃、数据丢失或安全问题。