2011-04-14 90 views
3

我正在开发一个Web应用程序,该应用程序将免费下载用于生产站点的其他许可证。我知道这些东西是不被赞同的,但我想在安装文件中包含一两行来将当前安装URL保存回我的数据库,这样我就可以与付费用户进行交叉检查。我没有试图验证许可证(但是)除了监控盗版外,这些URL不会以任何方式使用。如果用户删除此代码或没有互联网连接(本地安装),则不会有错误。另外,出于法律方面的原因,我会让用户知道EULA中的这个功能。PHP CMS:安装时的“Call Home”功能

大多数呼叫家庭功能在那里使用file_get_contents但他们正在验证,我只是想存储一个URL。是否发送一个请求,并在GET变量中转义的URL是一个可行的选项?各种服务器设置的安全性,速度和功能是关键。

任何替代建议也受欢迎...我仍然试图找出许可和“保护”这个软件的最佳方式。

在此先感谢您的帮助!

回答

3

这是一个相当简单的系统版本,但它现在应该可以完成这项工作。它通过提供当前服务器的URL作为密钥工作,但您可以将其交换为许可证的唯一ID。

对于CMS /应用:

<?php 
define('SITE_INVALID', 'invalid'); 
define('AUTH_SITE', 'http://www.example.com/verify.php'); 

function verify_install($key){ 
    $result = file_get_contents(AUTH_SITE.'?key='.urlencode($key)); 

    if($result == SITE_INVALID){ 
     return false; 
    } 

    // Valid 
    return true; 
}; 
?> 

(早期),然后在你的页面的话:

<?php 
$site_key = $_SERVER['SERVER_NAME']; // Use current site URL (eg: www.example.com) 

if(!verify_install($site_key)){ 
    // Invalid 
    echo 'Your account is disabled'; 
    exit(); 
} 

// Continue as normal 
?> 

和许可证服务器上:

<?php 
define('SITE_VALID', 'valid'); 
define('SITE_INVALID', 'invalid'); 

function verify_remote_install(){ 
    if(!isset($_GET['key'])){ 
     // Nothing sent - assume fine 
     return true; 
    } 

    $key = urldecode($_GET['key']); 

    // (Check if key in database, etc) 
    $result = key_is_valid($key); // Replace with your own method 

    if(!$result){ 
     // Invalid 
     return false; 
    } 

    // Valid 
    return true; 
} 
?> 

然后验证:

<?php 
$result = verify_local_install(); 

if(!$result){ 
    echo SITE_INVALID; 
} else { 
    echo SITE_VALID; 
} 
?> 

您需要用验证密钥的方法替换key_is_valid()函数,无论是检查密钥是否在数据库中或否则。

如果您不确定(例如:如果与验证服务器的连接失败,或者密钥未发送),您会更好地认为它是有效的,这样应该会出现问题用户的控制,你会给他们带来的好处。您希望为合法用户提供最佳体验,并在可能的情况下阻止盗版者,而不是给付费用户造成不便。

如前所述,任何具有PHP基本知识(甚至只是能够读取)的人都可以很容易地找到它并在代码没有以某种方式混淆时将其禁用。您可以在http://code.google.com/p/phpobfuscator/找到一个开源应用程序。如果您仍然希望开发人员修改应用程序,则可以考虑只是混淆许可代码,将其放在单独的文件中并为其提供一个虚假的无辜名称。

+0

这太棒了,谢谢!正如描述所说,我并不试图仅仅试图将软件安装到的URL聚合到我的数据库中。 Upvoted,因为我很可能会以某种方式实现这一点...但我担心的是我不希望安装程序依赖我的服务器进行响应。我也担心人们看到这个脚本,然后使用提交URL向数据库发送一串错误的URL。有任何想法吗? – RANGER 2011-04-14 05:16:08

+0

@cbh - 我想我明白你的意思,在这种情况下,只发送当前的URL,只要执行'file_get_contents(AUTH_SITE。'?url ='。urlencode($ _ SERVER ['SERVER_NAME']))'发送到远程服务器的URL(最后如果你不需要响应而不能保存页面),那么在远程服务器上只需要在你的数据库中存储'urldecode($ _ GET ['url'])''。如果您最终使用上述授权设置,只需将该密钥保留为网站网址,或将其发送,也可以将其保存。使用某种单独的密钥而不是仅用于验证的URL将会停止批量检查。我希望这有助于! – Adam 2011-04-14 05:29:27

+0

完美。感谢您的帮助! – RANGER 2011-04-14 18:09:15

0

我建议检查一下http://www.socialengine.net/如何加密他们的源代码并获得解密密钥和授权。他们非常大,并会有可靠的方法。我尝试了一段时间后为了好玩而破解它,但是失败了。

+0

谢谢@ohmusama,但我宁愿不走向文件加密的道路。我希望开发人员能够随意调整内容(甚至在试用版中)。这主要是为了检查盗版的基本方法(尽管我知道这种方法很容易从代码中找到并删除)。 – RANGER 2011-04-14 02:36:06

+0

file()也可以读取远程主机,也可以使用数据库连接以“只读”数据库用户名连接到远程SQL主机,并以此方式进行验证。有很多选择。 如果您确实对真正独特的东西感兴趣,请尝试打开套接字并使用您自己的协议。更难以重现...除了$ validated = true bypass ... – ohmusama 2011-04-14 02:47:04

+0

哇,甚至没有考虑过这些选项......都非常酷。远程数据库选项现在不能工作,因为我必须添加远程连接的任何人的IP地址(太糟糕了,我喜欢那个)。自定义协议可能会超出我的范围。至于file(),我不需要从主机读取任何东西,只需将URL作为字符串发送给它即可存储。 – RANGER 2011-04-14 03:54:31