我正在分发像Wordpress插件这样的PHP创建的插件,但是我想为它实现一个API密钥,用户需要输入一个API密钥来解锁它才能使它工作。
怎么办?是的,我已经知道它可以很容易地被绕过,因为PHP没有被编译,但至少它会阻止一些没有PHP知识的人。
谢谢..
答案 0 :(得分:6)
我认为您不了解API密钥是什么。
API密钥是允许您或脚本访问API或在线服务并与之交互的密钥。
您似乎在描述的是某种许可证密钥,这会阻止用户在没有付款或注册的情况下操作您的脚本。
虽然API密钥经常 需要付款或注册,但这两者实际上并不是一回事。
API密钥通常用于跟踪使用情况,并防止滥用在线服务和数据。
在您的情况下,您似乎只是想限制对脚本的访问。
除非您的脚本对远程数据源有基本依赖性,否则此方法将无法工作,因为任何具有PHP远程知识的用户只会删除执行验证的代码。
使用PHP,同样适用于许可证密钥。用户将找到绕过它的方法,除非他们需要它来执行脚本。
验证必须远程执行,并且必须有一些动力让它保持原状(远程数据的访问是显而易见的)。
答案 1 :(得分:1)
您可以使用API密钥对实际源代码进行加密。加密源代码的一些重要部分(例如使用libmcrypt),并让脚本加载和解密源代码。当然,找到相关例程的人可以轻松地将源转储到磁盘并使用它,但它不会像删除支票那样微不足道。
答案 2 :(得分:0)
如果您不关心人们删除您的支票,那么您实际上只需要添加一个if
语句来验证所配置的许可证密钥是否有效。
我注意到你提到你的许可证密钥只是SHA1哈希。您可以轻松地向哈希附加4个字符,您可以将其用作校验和。
例如:
function generate_key()
{
$serial = sha1(uniqid(rand(), true));
$checksum = substr(md5($serial), 0, 4);
return $serial . $checksum;
}
function verify_key($key)
{
$serial = substr($key, 0, 40);
$checksum = substr($key, -4);
return md5($serial, 0, 4) == $checksum;
}
这是一个非常简单的例子,但它只是教学。
基本上,您将验证许可证密钥在主机服务器上是否有效,而不是在服务器上ping脚本。
这样做的缺点是任何人都可以通过打开源代码并找到validate_key
来生成有效密钥。
你可以让它调用外部脚本来执行verify_key
,但这真的值得付出努力吗?此外,您将牺牲页面加载时间来验证密钥。
我记得vBulletin有一个非常容易破解的许可系统,但是他们在几个部分中有一个隐藏的1x1图像,这些图像在他们的域上ping了一个脚本。使用这些日志,他们能够确定哪些域名托管了他们软件的非法副本,他们只是向管理员发送了一封律师的信。
如果你想要一个更强大的解决方案,我建议可能会考虑Zend Guard,但你似乎并不关心人们如何亲自破解你的软件我会尽可能简单。
答案 3 :(得分:0)
它绝对毫无意义。作为它的php,您必须发送源代码,任何用户都可以删除许可证检查代码并运行它。
除非人们不喜欢弄乱许可证密钥,除非你的软件非常,非常有用,可取或必不可少,否则他们会找到许可证密钥免费替代品,或者只是不打扰它。