【问题标题】:Get Computer Unique ID from PHP从 PHP 获取计算机唯一 ID
【发布时间】:2013-07-05 13:56:00
【问题描述】:

我已经使用 PHP 创建了一个应用程序,我将把它卖给我的本地市场。我将亲自前往他们的位置安装/配置 Apache 和 MySQL 以及安装我自己的代码。

我想要一个安全系统,这样如果有人试图将我的代码复制到未经授权的机器上,它就不会运行。

我知道没有人可以阻止对应用程序进行逆向工程。甚至 .exe(二进制)文件都被破解,使用 PHP(源代码)任何人都可以做到。

在我的国家,这些逆向工程师真的很难找到,所以我想提出最低限度的安全选项,例如:

1) 创建类(例如,Navigation),用于识别系统信息,如 CPU ID、计算机名称或硬件 ID 的任何组合,以生成 UNIQUE_ID 并与我给定的 UNIQUE_ID 匹配(适用于我向其出售应用程序的个人)。如果有效,则返回导航菜单。否则它将简单地破坏数据库并通过抛出异常来停止执行,可能像:

class Navigation {

    public function d() {
        return current system UNIQUE_ID;
    }

    public function get() {
        $a = file_get_contents('hash');
        $c = $this->d();
        if (crypt($c) != $a) {
            //destory database
            throw new Exception('');
        } else {
            return "<ul><li><a>home</a></li></ul>"; //navigation menu
        }
    }

}

2)然后在安装过程中,我将在“hash”文件中更改系统UNIQUE_ID,创建一个对象,并将其保存到一个文件(nav.obj)中:

(安装.php)

<?php
      $a=new Navigation;
      $out=serialize($a);
      file_put_contents('nav.obj', $out);

3) 在 header.php 中(包含在每个文件中):

<?php
     $menu=file_get_contents('nav.obj');
     $menu=unserialize($a);
     echo $menu->get();
 ?>

我知道这种方法不能完全证明,但我很确定大约 60% 的 PHP 开发人员将无法破解它!

现在我只需要获取当前系统的 UNIQUE_ID。

【问题讨论】:

  • 域呢?将它设置为它应该工作的域,对其进行一些哈希并检查它。
  • 没有系统唯一ID这样的东西
  • 现在,当你公开发表这篇文章时,这 60% 将下降到 10%...
  • 陌生人会让你在他们的电脑上安装这个?奇怪
  • 我估计大约需要 10 分钟来识别和禁用它。不要在这上面浪费时间 - 专注于销售您的服务。

标签: php unique-id cpuid hardware-id


【解决方案1】:

我创建了这个函数来获取基于硬件的唯一 ID(硬盘 UUID)。根据您的需要,可以使用不同的资源(例如机器名称、域甚至硬盘大小)来获得更好的方法。

 function UniqueMachineID($salt = "") {
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        $temp = sys_get_temp_dir().DIRECTORY_SEPARATOR."diskpartscript.txt";
        if(!file_exists($temp) && !is_file($temp)) file_put_contents($temp, "select disk 0\ndetail disk");
        $output = shell_exec("diskpart /s ".$temp);
        $lines = explode("\n",$output);
        $result = array_filter($lines,function($line) {
            return stripos($line,"ID:")!==false;
        });
        if(count($result)>0) {
            $result = array_shift(array_values($result));
            $result = explode(":",$result);
            $result = trim(end($result));       
        } else $result = $output;       
    } else {
        $result = shell_exec("blkid -o value -s UUID");  
        if(stripos($result,"blkid")!==false) {
            $result = $_SERVER['HTTP_HOST'];
        }
    }   
    return md5($salt.md5($result));
}


echo UniqueMachineID();

【讨论】:

  • 你有不使用 shell_exec 的替代方案吗?
  • 请为上面的代码提供一个示例 diskpartscript.txt 文件。它应该是什么样子?
  • $result = shell_exec("blkid -o value -s UUID") 在没有可用blkid 命令的系统上,结果将是一个空字符串,因此不满足下面的条件。一个可能的解决方法是将条件更改为if (stripos($result, 'blkid') !== FALSE || ! $result) {
  • 感谢您的代码,但是如果我想获取访问者的 ID 怎么办。在这里,当用户访问该网站时,它返回我的机器的 ID 而不是他!我该如何解决这个问题?
  • 可以使用用户代理结合ip地址为例
【解决方案2】:

根据http://man7.org/linux/man-pages/man5/machine-id.5.html

$machineId = trim(shell_exec('cat /etc/machine-id 2>/dev/null'));

为铁托编辑:

[ekerner@**** ~]$ ls -l /etc/machine-id
-r--r--r--. 1 root root 33 Jul  8  2016 /etc/machine-id

Tito 编辑 2:需要考虑的一些事项和场景:

是否允许用户获得一台新机器?我猜是的。 还是在多个设备上运行? 听起来机器可能与您的情况无关?

如果只有它的用户(没有机器限制),那么 Id 会寻求许可服务(依赖于网络)。 为此有很多服务: Google Play(适用于 Android 应用程序)就是一个很好的例子:https://developer.android.com/google/play/licensing/index.html 微软和苹果也有类似的服务。 但是,只需在网络上搜索“软件许可服务”或“基于云的软件许可服务”一词。

如果它的用户+单个设备,那么你需要将设备ID传递给你使用的任何服务或制作,然后允许更新机器ID,但不允许恢复到以前的机器id(意味着多个设备)。 但是,所述服务将为您提供客户端代码,如果需要,该代码应负责处理。

经验中的两个场景: 1:任何设备上的用户:我们只是在云中(在网站中)创建了一个 API,并在应用程序中创建了一个登录屏幕,当用户登录时通过 API 进行身份验证并保留一个令牌,并且每当设备连接到网络应用程序将查询 API 并更新登录名和/或令牌。 您也可以在购买时使用登录屏幕(就像他们可能已经登录到要购买的网站一样),生成密钥并将其打包或绑定到应用程序中。

2:用户加机器: 同样的事情,除了当查询 API 时,机器 id 被传递。机器 ID 可以随着用户更新他们的设备而多次更改,但我们保留了机器 ID 的记录并制定了禁止规则:如果我们看到旧的(以前使用过的)机器 ID,那么必须有一定的时间通过了。因此允许用户破坏他们的机器并取出一台旧机器。

还要考虑如果你制作一个,你将如何阻止应用程序运行? Ppl 非常聪明,它需要进行核心编译。

不过,尽管如此,各种许可服务在这方面都很专业,可以满足大多数需求。加上他们的经验,他们已经克服了安全隐患。列出一个我喜欢的名字,除了你要搜索的。

如果你能从你的足迹中获得积极或消极的结果,那就太好了。

【讨论】:

  • The /etc/machine-id file contains the unique machine ID of the local system,您可以轻松地使用工作文件进行修改。
  • Machine-id 可以在重启时更改。它的许可目的是什么?
  • 不,你不能轻易修改机器id文件。它属于root并且是只读的。没有明智的系统管理员会改变它。上面会编辑。
  • @ekerner 那么它对于许可目的是否可靠?
  • @user4271704 取决于您要许可什么,以及您要许可什么。许可软件/硬件/服务?对软件/硬件/用户?您是否阅读了手册页(以上链接)。
猜你喜欢
  • 1970-01-01
  • 2011-03-17
  • 2019-02-16
  • 2011-03-29
  • 2012-02-23
  • 2023-03-25
  • 2011-01-28
  • 2011-09-13
  • 2012-11-04
相关资源
最近更新 更多