【问题标题】:Protect wordpress theme with license key validation使用许可证密钥验证保护 wordpress 主题
【发布时间】:2011-09-30 11:53:44
【问题描述】:

我正计划开发一些专业的 Wordpress 主题,并希望使用许可证密钥来保护它,可以吗?

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

【问题讨论】:

    标签: wordpress license-key


    【解决方案1】:

    您可以在您自己的服务器上建立一个数据库,保存主题的许可证密钥和许可 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 核心功能,则您不能在 WP(即 GPL)之外的任何其他许可下发布它。

    【讨论】:

    • 如果用户事先知道主题使用某种许可证密钥,他们只需一次不成功的尝试即可找出发生了什么(新的 WP、导出数据库、安装主题、导出数据库、区分两个出口)。忽略这样一个事实,即如果用户确定使用您主题的非法副本,他们会这样做,GPL 不允许混淆代码 (stackoverflow.com/questions/1086445/obfuscation-and-gpl) 而 WP 主题是 GPL (wordpress.org/news/2009/07/themes-are-gpl-too)
    • 我知道你不允许这样做,这就是我自己提到许可证问题的原因。但是,我想举一个例子说明它是如何 完成的。并且忽略它是不允许的事实,我知道有几个主题/插件开发人员使用这种技术来保护他们的产品(到目前为止没有人遇到过问题)。关于您的另一点:我看不出您如何绕过这种方法。即使您知道 API 密钥与您的 URL 相关联。只要您的所有代码都被混淆,唯一的方法就是知道如何为 URL 构建有效的校验和(也称为 API 密钥)。
    • PS:另外,问题不在于这样做是否合法,而在于是否可以这样做。 ;)
    【解决方案2】:

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

    【讨论】:

    • Nikolay,你说得对,用户必须有 php 代码才能使用主题。但他不能拥有您的 php 代码的人类可读副本。看看我的回答,大致了解如何做到这一点。
    • 必须提供人类可读的代码 (stackoverflow.com/questions/1086445/obfuscation-and-gpl)
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2017-05-16
    • 2014-05-25
    • 1970-01-01
    • 2017-03-13
    • 2016-12-20
    相关资源
    最近更新 更多