我用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。
2条答案
按热度按时间enyaitl31#
我创建了这个函数来获取基于硬件的唯一ID(硬盘UUID)。根据您的需要,可以使用不同的资源,如机器名、域甚至硬盘大小来获得更好的方法。
j2datikz2#
按照http://man7.org/linux/man-pages/man5/machine-id.5.html
编辑蒂托:
蒂托的编辑2:需要考虑的一些事项和场景:
用户可以得到一台新机器吗?我猜是的。或者在多个设备上运行?听起来机器可能与您的情况无关?
如果它的用户只有(没有机器限制),那么我去许可证服务(依赖于网络)。有很多服务:Google Play(适用于Android应用程序)就是一个很好的例子:https://developer.android.com/google/play/licensing/index.html MS和苹果也有类似的服务。不过,只要在网上搜索“软件许可服务”或“基于云的软件许可服务”就可以了。
如果它的用户+单个设备,那么你需要把设备ID传递给你使用的任何服务或使,然后允许机器ID被更新,但不允许恢复到以前的机器ID(将意味着多个设备)。然而,如果它是一个要求,所说的服务将给予你的客户端代码应该照顾。
经验中的两种情景:1:任何设备上的用户:我们只是在云中创建了一个API(在网站中)和应用程序中的登录屏幕,当用户登录时通过API进行身份验证并保留令牌,每当设备连接到网络时,应用程序将查询API并更新登录和/或令牌。您也可以在购买时拥有登录屏幕(比如他们可能已经登录到某个网站进行购买),生成密钥并将其打包或绑定到应用程序中。
2:用户加机器:相同的事情,除了当API被查询时,机器ID被传递。机器ID可以随着用户更新他们的设备而多次更改,但我们保留了机器ID的记录,并制定了禁止规则:如果我们看到一个旧的(以前使用过的)机器id,那么一定已经过去了一定的时间。因此允许用户打破他们的机器,并拉出一个旧的。
另外要考虑的是,如果你做了一个,你将如何停止应用程序的工作?Ppl是相当聪明的,它将需要核心编译。
然而,尽管如此,各种许可服务在这方面都很专业,可以满足大多数需求。另外,根据他们的经验,他们已经克服了安全隐患。我会说出一个我喜欢的,除了它是你的搜索。
如果你能从你的足迹中带着积极或消极的结果回来,那就太好了。