使用许可证密钥验证保护WordPress主题

5

我计划开发一些专业的WordPress主题,并希望使用许可证密钥进行保护,这是否可能?

如果是这样,是否有人愿意链接到一些文章或帖子来帮助我入门?

2个回答

4
您可以在自己的服务器上设置数据库,保存主题的许可证密钥和许可证 url。然后,为您的主题设置一个管理页面。首先注册一个许可证设置数组。然后在同一页面上实现一个隐藏的设置字段,每当站点管理员更新许可证密钥时,该字段就会被更新。更新函数将向您的服务器发送请求,传递许可证密钥和 $_SERVER 的主机,并将隐藏的 license_settings 字段设置为 true 或 false。
一个非常简化的代码如下所示:
functions.php
<?php
// functions.php
require("myadminpage.php");

# Functions follow here...
?>

myadminpage.php

<?php
// myadminpage.php

// register settings
function my_settings_init() {
  register_setting('settings_license', 'settings_license');
}
// register admin page
function my_add_admin_page() {
  add_menu_page(__( '' ), __( 'Manage License' ), 'administrator', 'myadminpage', 'my_admin_page');
}
add_action('admin_init', 'my_settings_init');   
add_action('admin_menu', 'my_add_admin_page' );

if(isset($_GET["settings-updated"]) && $_GET["settings-updated"] == true) { 
    $options = get_option('settings_license');
    $key = $options["key"];
    $host = parse_url($GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI'], PHP_URL_HOST);
    $url = sprintf("http://you.com/check-license.php?key=%s&url=%s", $key, $host);
    $options["valid"] = trim(file_get_contents($url)) == 1) ? "true" : "false"; 
    update_option('settings_license', $options);
}

// callback function that renders your admin page
function my_admin_page() {
  settings_fields('settings_license'); 
  $options = get_option('settings_license'); 
  ?>
  <form method="post" action="options.php"> 
  <input id="settings_license[key]" type="text" name="settings_license[key]" value="<?php echo $options["key"]; ?>">
  <input id="settings_license[valid]" type="hidden" name="settings_license[valid]" value="<?php echo $options["valid"]; ?>">
  <input type="submit" value="Save"> 
  </form> 
  <?php
}
?>

现在你可以随时获取许可证选项并以任何你想要的方式处理无效使用。例如(一种粗鲁的方式):header.php
<?php
// very first line
$license = get_option('settings_license');
// see: http://ckon.wordpress.com/2006/08/09/server-request_uri-doesnt-always-work-correctly-heres-how-to-fix/
$ruri = $GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI'];
if(!preg_match("#wp-admin#", $ruri) && $license["valid"] != "true") {
  wp_die( __('This website uses unlicensed software.<br>Administrators can update their license key <a href="'. get_bloginfo('url') .'/wp-admin/admin.php?page=myadminpage.php">here</a>.') );
}

# rest of header.php comes here..    

最后将您的php代码混淆(例如http://www.ioncube.com/sa_encoder.php),然后就完成了。但是,请确保您没有违反其他许可证,比如WP的许可证。如果您的最终代码中使用了WordPress核心函数的任何一行,那么您不能将其发布到除了GPL之外的其他许可证下。

如果用户事先知道主题使用某种许可证密钥,他们只需要一次不成功的尝试就可以找出发生了什么(新鲜的WP,导出数据库,安装主题,导出数据库,比较两个导出)。忽略一个事实,即如果用户决心使用您的主题的非法副本,他们将这样做,GPL不允许混淆代码(http://stackoverflow.com/questions/1086445/obfuscation-and-gpl)而且WP主题是GPL(http://wordpress.org/news/2009/07/themes-are-gpl-too/). - Nikolay Yordanov
我知道这样做是不允许的,这就是为什么我自己提到了许可问题。然而,我想举个例子,说明它可以被完成。忽略它不被允许的事实,我认识一些主题/插件开发者使用这种技术来保护他们的产品(迄今为止没有人遇到过问题)。关于你提出的另一个观点:我不知道你如何绕过这种方法。即使你知道API密钥与你的URL相关联,只要你的所有代码都被混淆,唯一的方法就是知道如何为URL构建有效的校验和(也称为API密钥)。 - eyecatchUp
PS:另外,问题并不是是否合法这样做,而是是否可能这样做。 ;) - eyecatchUp

1

我不这么认为。毕竟,用户必须拥有PHP代码才能使用主题,如果他们拥有它,他们可能会以这样的方式修改它,使其不再需要密钥。


1
Nikolay,你说得对,用户必须拥有php代码才能使用主题。但是他不必拥有可读的php代码副本。请看我的答案,了解如何实现这一点的基本思路。 - eyecatchUp
必须提供易于阅读的代码(http://stackoverflow.com/questions/1086445/obfuscation-and-gpl) - Nikolay Yordanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接