我有一个脚本,我把它卖给有些人。我需要一种方法来确保我的脚本不能在我客户列表中的任何网站上运行。
避免让人们窃取我的脚本的最佳方法是什么?
我读到了在脚本中创建许可证密钥,因此任何没有许可证的脚本都不起作用。但是,有许多方法可以在未经我许可的情况下生成许可证密钥吗?
我需要的是不要激活任何域名中的任何脚本,除非我在我的客户列表中有它。
答案 0 :(得分:5)
有一个原因,Adobe,微软和其他人并没有过度主动追捕海盗(不是说他们没有,只是没有史诗般的绝对主义水平) - 他们的大部分资金来自企业对企业的销售和支持。简单的许可和支持结构通常足以让您自己从合法的企业和想要您的产品的各方获利。
如果您要向任何人提供代码,技术保护是一场失败的战斗。这就是SaaS如此受欢迎的原因。
答案 1 :(得分:4)
你的问题非常有趣,因为有太多的php开发人员想知道同样的事情。如何保护我的产品不被盗取和复制?
有些评论谈论的不是贪婪,但事实上很多人都是以谋生为目的,所以这不仅仅是你作为业余爱好建立的一些软件的问题,而是你的工作,你应得的就像任何其他职业一样,获得报酬。
可悲的是,PHP是一种很难保护的语言,但我会给你一些指示:
1)不信任加密:我已经看到太多用于解密代码的工具,甚至一些我曾经信任过像Zend Guard那样的工具也很容易受到攻击。我见过的最先进的工具可以在几分钟内显示您的代码。
编辑:我忘了提到加密的另一件事。它将要求服务器安装某些特殊模块以使您的代码正常工作,这对所有使用共享主机并且无法安装解密模块的人来说是一个交易破坏者。2)尝试混淆:即使你的代码仍然可读,如果混淆器在混合变量,添加废话和在函数内创建函数方面做得很好,代码本身将变得几乎不可修改,因此它将是没用来试图修改它。
3)利用模糊处理在您的软件本身中插入域锁代码:只需将软件出售给某个客户,而不是许可文件,只需在软件本身内部使用某些域验证代码,该方法与混淆相结合,将很难弄清楚要改变什么以使其在其他领域中起作用,所以你可能会实现你的目标。 4)创建一个优秀的软件:这是最重要的部分,构建一个人们愿意支付的优秀软件,为它创建一个合适的网站,在那里宣传。我希望我能帮到你。
答案 2 :(得分:2)
锁定您提供的基于脚本的代码的唯一真正方法是保持代码的核心部分在您控制的服务器上执行 - 并将您提供给客户端的代码调用回家'每次执行时都到你的服务器。然后,您所要做的就是根据请求的IP阻止访问此“call home”脚本。
此外,在这个'call home'机制中,执行简单的连接测试或握手是不对的,因为这可以解决 - 服务器上的脚本必须对整个系统执行某些操作,以便客户端必须重写丢失的部分才能在不知情的情况下在其他地方使用您的代码。这可能是一些关键的计算或数据提供。
显然这并不理想,因为许多客户端不喜欢调用远程服务器的脚本,而且你必须确保你的网络和服务器能够处理请求的数量 - 否则你会减慢或超时你的客户端自己的系统。
答案 3 :(得分:2)
这将用作参考,并应根据您的方案进行调整。
我刚刚在我自己的小引擎上评论了一些东西;你必须
1)确保MySQL数据库允许从机器远程连接
2)确保您的数据库引擎不正确
3)在下面运行此脚本:
数据库:
CREATE TABLE IF NOT EXISTS `software` (
`ID` int(255) NOT NULL AUTO_INCREMENT,
`CompanyName` varchar(255) NOT NULL,
`valid` int(1) NOT NULL DEFAULT '0',
`license` varchar(255) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
确保在与1个特定用户不同的架构中运行此操作,以便仅读取数据库!
然后从PHP中,做出类似这样的事情:
<?php
$dsn = 'mysql:dbname=DATABASENM;host=LicenseServerIP';
$user = 'USER';
$password = 'PASSWORD';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$license = "test";
$sth = $dbh->prepare("SELECT * FROM software WHERE license='$license' AND valid='1'");
$sth->execute();
$result = $sth->fetchAll();
if (count($result) === 0)
{
die("Your License Has Expired!");
}
?>
答案 4 :(得分:2)
我需要的是不要激活任何域名中的任何脚本,除非我在我的客户列表中有它。
好的,你缩小了它。
创建openssl证书,将公共部分硬编码为检查代码,在使用您的私钥发布许可证签名domain.name字符串时,在许可证中签署许可证部分:
$lic=<<<EOL
LICENSE CODE HERE - SIGNATURE of string contained domain name
EOL;
在您的代码中检查许可证:
include 'license.php';
$cert=<<<EOK
PUBLIC KEY DATA HERE
EOK;
$pub_key=openssl_get_publickey($cert);
$ok = openssl_verify($_SERVER['SERVER_NAME'], $lic, $pub_key);
if ($ok !== 1) {die ('bad license!')}
O'c都应尽可能加密。
这可能对特制的libopenssl二进制文件很脆弱,但我希望它会对你有所帮助。 为了避免运行这样的代码你可以添加这样的条件:
if (int(random()*100))==6) {check_license();}
但这取决于哪个部分应该受到保护。
另外,在代码的所有部分中,您应该检查包含许可证检查代码的文件的md5summ。
答案 5 :(得分:2)
您可以使用http://www.ioncube.com对源代码进行模糊处理,或http://www.phplicengine.com远程或本地许可您的PHP代码。
答案 6 :(得分:1)
我的想法是你无法成功保存代码。我真的不喜欢创建非免费应用程序,但我不会评判你。保护代码的最佳解决方案有时不值得,因为许多人(阅读网站)的托管非常有限,他们无法安装离子立方体...最好的保护是加入多种类型的保护(例如IonCube +注入许可证连接到您的数据服务器在不同的地方使用不同的代码+如果站点需要使用某些ssl,您可以尝试通过在数据服务器上使用公钥检查来销售ssl,或许多,其他方式,只是创造性的)
但是,正如我所说,如果你想要非常高的保护,你会因为创造它而损失金钱,并且因为他们使用一些廉价的托管而失去了你的客户资金......
你需要考虑一切......
忘了说:在你的服务器上托管是最好的保护,但有缺点:你需要增加'模板'网站的可能性,访问创建一些插件,以及类似的东西...但有时客户只是不喜欢在托管服务器上保留所有数据。
我想我以某种方式帮助了......
答案 7 :(得分:1)
其他海报对此有一些好评。根据您正在使用的ionCube编码器的版本,您已经使用了所需的功能(在Pro和Cerberus中),包括允许您根据需要制作自己的许可层的功能,但这不应该是必要。一些基本步骤带来了最大的胜利,而且正如其他人所说的那样,通常不值得拥有庞大的许可基础设施。还要记住,许可的主要好处不在于阻止那些打算作弊而不是付钱的人,而是阻止付费用户排队。
假设您为使用软件的每个域收取费用。如果你在某个地方提到但没有做任何事情来执行它,那么当一个诚实的客户在第二个域上尝试你的脚本并发现它有效时,很可能他们只是在没有意识到他们应该付费的情况下使用它。相反,如果您的软件提醒他们需要新的许可证,他们可能会购买第二个域名。
实际上,不可能阻止最坚定的小偷,而且从长篇角度来看,一个海报可能是有益的,因为欺骗者可以免费使用软件,而不是根本不使用软件,但许可证肯定会锁定来自诚实的大多数人都乐于购买优质软件(加上支持,错误修复,升级等),而且不这样做是愚蠢的。