You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Node.js项目仅在指定服务器运行,防止代码被盗用?

阻止Node.js代码在非目标服务器执行的可行方案

你提到的通过校验系统信息锁定目标服务器的思路是可行的,但这类方案属于"软防护",只能提高代码被滥用的门槛,无法做到绝对阻止。以下是具体的实现思路和注意事项:

核心实现方式:绑定服务器唯一指纹

通过收集服务器的硬件/系统唯一标识生成"指纹",代码启动时校验当前环境的指纹是否与预存的授权指纹匹配,不匹配则终止运行。

1. 收集系统唯一标识

可以组合多个难以伪造的系统/硬件信息生成指纹,常用的信息包括:

  • 主机名(os.hostname())
  • CPU序列号、主板序列号、BIOS序列号(需要通过系统命令获取)
  • 磁盘UUID(Linux下blkid命令,Windows下wmic diskdrive get serialnumber)

示例代码(以Linux服务器为例):

const os = require('os');
const { execSync } = require('child_process');

function generateSystemFingerprint() {
  // 组合多个唯一标识,降低伪造概率
  const hostname = os.hostname().trim();
  // 获取主板序列号
  const boardSerial = execSync('dmidecode -t baseboard -s serial-number').toString().trim();
  // 获取CPU序列号
  const cpuSerial = execSync('dmidecode -t processor -s serial-number').toString().trim();
  
  return `${hostname}-${boardSerial}-${cpuSerial}`;
}

2. 启动时校验指纹

预存授权服务器的指纹到代码中(注意加密存储),启动时比对当前指纹,不匹配则直接退出:

// 预存的授权指纹(生产环境建议用AES加密后存储,避免明文泄露)
const AUTHORIZED_FINGERPRINT = 'your-target-server-fingerprint';

const currentFingerprint = generateSystemFingerprint();
if (currentFingerprint !== AUTHORIZED_FINGERPRINT) {
  console.error('错误:未授权的运行环境');
  process.exit(1);
}

// 正常业务逻辑代码
console.log('环境校验通过,启动服务...');

3. 强化防护的补充手段

  • 加密校验逻辑:不要把授权指纹明文写在JS代码里,用对称加密算法加密后存储,校验时再解密比对。也可以把指纹校验逻辑封装成C++扩展(通过Node-gyp编译),比纯JS代码更难被逆向破解。
  • 定期二次校验:在服务运行过程中(比如每隔1小时)再次校验系统指纹,防止攻击者在启动后替换环境。
  • 限制物理访问:既然你们能物理访问服务器,最好给服务器加硬件锁、禁用USB端口,从物理层面降低代码被复制的风险。

局限性说明

  • 这类方案无法阻止有经验的攻击者:如果攻击者能获取授权服务器的指纹信息,完全可以在另一台机器上伪造这些标识绕过校验。
  • 服务器硬件/系统配置变更时(比如更换主板、修改主机名),需要同步更新授权指纹,否则代码会无法启动。
  • 混淆后的JS代码仍可能被逆向分析,攻击者可以直接删除或篡改校验逻辑,因此最好结合代码混淆+指纹校验+二进制扩展的多重防护。

内容的提问来源于stack exchange,提问作者Mohammad.R Habibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:57:48