You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用JavaScript获取客户端系统的MAC地址?

嘿,我来帮你解决这个问题——首先得明确一个关键限制:浏览器端的JavaScript出于安全和隐私保护的规范,没办法直接获取用户设备的MAC地址,这和PHP能直接调用系统命令读取网络配置的逻辑完全不同。不过我们可以根据你的使用场景,提供两种可行的替代思路:

用JavaScript获取MAC地址的可行方案

1. 浏览器端:仅能获取匿名化标识(隐私限制下的折中方案)

现代浏览器为了保护用户隐私,已经完全禁用了直接暴露MAC地址的接口。早期有通过WebRTC获取网络接口信息的方法,但现在也仅能拿到经过哈希处理或匿名化的设备标识,无法获取真实的硬件MAC地址。如果你的应用是在受控的局域网环境(比如企业内部系统),可以试试以下代码(不保证所有浏览器都支持):

// 尝试获取匿名化的网络接口信息
function getAnonymizedNetworkInfo() {
  return new Promise((resolve, reject) => {
    const peerConnection = new RTCPeerConnection({ iceServers: [] });
    peerConnection.createDataChannel('');
    
    peerConnection.createOffer()
      .then(offer => peerConnection.setLocalDescription(offer))
      .catch(reject);
    
    peerConnection.onicecandidate = (event) => {
      if (!event.candidate) {
        const localCandidates = peerConnection.getSenders()[0]?.transport?.getLocalParameters().candidates;
        resolve(localCandidates || []);
        peerConnection.close();
        return;
      }
    };
  });
}

// 调用示例
getAnonymizedNetworkInfo().then(info => {
  console.log("匿名化网络接口信息:", info);
  // 注意:这里的地址字段是经过处理的,不会显示原始MAC地址
}).catch(err => {
  console.error("获取失败:", err);
});

提示:这种方法的核心是利用WebRTC的ICE候选信息,但浏览器会自动对MAC地址进行匿名化处理(比如替换部分字节为00),仅能用于设备标识,无法拿到真实硬件地址。


2. Node.js服务端:复刻PHP的系统命令逻辑(完全等效)

如果你的应用是基于Node.js的服务端程序,那可以完全复刻你原来PHP代码的逻辑——通过执行系统命令读取网络配置,再解析输出获取MAC地址,不存在浏览器的隐私限制:

const { exec } = require('child_process');

// Windows系统下获取MAC地址
function getMacWindows() {
  return new Promise((resolve, reject) => {
    exec('ipconfig /all', (error, stdout) => {
      if (error) return reject(error);
      const macMarker = "Physical Address";
      const markerPos = stdout.indexOf(macMarker);
      if (markerPos === -1) return reject(new Error("未找到MAC地址"));
      // 截取MAC地址(适配ipconfig输出格式)
      const macAddr = stdout.substr(markerPos + macMarker.length + 2, 17).trim();
      resolve(macAddr);
    });
  });
}

// Linux/macOS系统下获取MAC地址
function getMacUnix() {
  return new Promise((resolve, reject) => {
    exec('ip link show | grep link/ether', (error, stdout) => {
      if (error) return reject(error);
      // 匹配MAC地址正则
      const macMatch = stdout.match(/(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}/);
      if (!macMatch) return reject(new Error("未找到MAC地址"));
      resolve(macMatch[0]);
    });
  });
}

// 自动判断系统并调用
function getMacAddress() {
  return process.platform === 'win32' ? getMacWindows() : getMacUnix();
}

// 调用示例
getMacAddress().then(mac => {
  console.log("MAC地址:", mac);
}).catch(err => {
  console.error("获取失败:", err);
});

这个方案和你原来的PHP代码逻辑完全一致,适合服务端场景,能直接拿到真实的MAC地址。


顺便修复你的PHP代码(如果还需要的话)

你的PHP代码无法运行,大概率是输出缓冲和session机制冲突(比如session_start()会自动发送HTTP头,导致输出缓冲失效),或者命令没有适配服务器系统。可以试试这个修复版本:

<?php
// 先开启输出缓冲,避免session干扰
ob_start();

// 根据服务器系统选择命令
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    system('ipconfig /all');
} else {
    system('/sbin/ip link show');
}

$output = ob_get_contents();
ob_end_clean();

// 匹配对应系统的MAC标识
$macMarker = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? "Physical Address" : "link/ether";
$markerPos = strpos($output, $macMarker);

if ($markerPos !== false) {
    $macAddr = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' 
        ? trim(substr($output, $markerPos + 36, 17))
        : trim(substr($output, $markerPos + 10, 17));
    echo $macAddr;
} else {
    echo "未找到MAC地址";
}
?>

内容的提问来源于stack exchange,提问作者Jitendra Kumar

火山引擎 最新活动