插件更新:保護(hù)下載鏈接

    給你的下載鏈接添加授權(quán),方便你出售你的任何文件

    自發(fā)布插件更新檢查器庫以來,提出的最常見問題之一是:“如何保護(hù)我的下載鏈接,以便只有購買了我的插件的用戶才能下載更新?”

    在本文中,我將嘗試在使用WP Update Server提供插件更新的上下文中回答該問題。我還將從我的一個(gè)商業(yè)插件中提供一些實(shí)際示例。

    讓我們開始吧。有許多方法可以確保更新下載的安全,但是大多數(shù)方法可以歸結(jié)為:

    1. 給每個(gè)用戶某種安全令牌。這可以是會(huì)員站點(diǎn)的登錄名+密碼,許可證密鑰,或者更深?yuàn)W的東西。
    2. 每當(dāng)有人在其站點(diǎn)上安裝您的插件時(shí),都要求他們輸入密鑰/登錄/以其他方式輸入。
    3. 修改插件以將令牌附加到每個(gè)更新請(qǐng)求。
    4. 編寫一個(gè)服務(wù)器腳本,該腳本在允許下載之前驗(yàn)證令牌。

    選擇一個(gè)安全令牌

    實(shí)施前兩個(gè)步驟的方式會(huì)因插件UI以及所使用的在線商店,購物車軟件或成員資格插件而有很大差異。您可能已經(jīng)存在某種客戶身份驗(yàn)證機(jī)制,只需要進(jìn)行一些調(diào)整即可用于更新,或者您可能需要從頭開始構(gòu)建自己的身份驗(yàn)證機(jī)制。這里沒有“一刀切”的解決方案。

    就個(gè)人而言,我更喜歡使用許可證密鑰。每當(dāng)有人購買我的Admin Menu Editor Pro插件時(shí),訂單處理腳本都會(huì)生成一個(gè)隨機(jī)密鑰,將其存儲(chǔ)在數(shù)據(jù)庫中,然后將密鑰和下載鏈接發(fā)送到客戶的電子郵件中。然后,當(dāng)他們安裝插件時(shí),將提供一個(gè)輸入許可證密鑰的鏈接。

    我不會(huì)在此處包括許可證管理代碼,因?yàn)樗辉诒疚牡挠懻摲秶鷥?nèi),而是為該特定插件構(gòu)建的,但是用戶界面看起來像這樣(單擊放大):

    插件更新:保護(hù)下載鏈接
    插件更新:保護(hù)下載鏈接

    將令牌添加到更新請(qǐng)求

    現(xiàn)在,我們?nèi)绾螌踩钆铺砑拥矫總€(gè)更新請(qǐng)求中?您可以使用addQueryArgFilter($callback)更新檢查器的方法來執(zhí)行此操作?;卣{(diào)函數(shù)將接收查詢參數(shù)的關(guān)聯(lián)數(shù)組。只需將令牌添加到列表中并返回修改后的數(shù)組即可。

    這是一個(gè)例子:

    /* ... Code that initializes the update checker ... */
     
    //Add the license key to query arguments.
    $updateChecker->addQueryArgFilter('wsh_filter_update_checks');
    function wsh_filter_update_checks($queryArgs) {
        $settings = get_option('my_plugin_settings');
        if ( !empty($settings['license_key']) ) {
            $queryArgs['license_key'] = $settings['license_key'];
        }
        return $queryArgs;
    }

    使用令牌授權(quán)下載

    最后,讓更新服務(wù)器在允許用戶下載更新之前驗(yàn)證安全令牌。為此,您需要?jiǎng)?chuàng)建一個(gè)自定義服務(wù)器類(請(qǐng)參閱擴(kuò)展服務(wù)器)并至少重寫該

    Wpup_UpdateServer::checkAuthorization($request)方法。這是使用此方法應(yīng)做的事情:

    1. 通過使用檢索包含令牌的查詢參數(shù)$request->param('arg_name')
    2. 驗(yàn)證令牌。同樣,這部分取決于您。您可以在數(shù)據(jù)庫中查找它,使用校驗(yàn)和來驗(yàn)證它,或進(jìn)行其他操作。
    3. 如果令牌是好的,則無需執(zhí)行任何特殊操作。
    4. 如果令牌無效,請(qǐng)調(diào)用$this->exitWithError('Error message')以輸出錯(cuò)誤并停止腳本執(zhí)行。

    以下是腳本的簡化版本,用于為Admin Menu Editor Pro實(shí)施安全更新??。它比上面的概述要先進(jìn)一些,但是總體思路是相同的。

    (同樣,許可證管理超出了本文的范圍,因此,我省略了大多數(shù)與加載和驗(yàn)證許可證有關(guān)的代碼。只需將verifyLicenseExists()和其他許可功能視為偽代碼。)

    class SecureUpdateServer extends Wpup_UpdateServer {
        protected $licenseServer;
     
        public function __construct($serverUrl, $licenseServer) {
            parent::__construct($serverUrl);
            $this->licenseServer = $licenseServer;
        }
     
        protected function initRequest($query = null, $headers = null) {
            $request = parent::initRequest($query, $headers);
     
            //Load the license, if any.
            $license = null;
            if ( $request->param('license_key') ) {
                $result = $this->licenseServer->verifyLicenseExists(
                    $request->slug,
                    $request->param('license_key')
                );
                if ( is_wp_error($result) ) {
                    //If the license doesn't exist, we'll output an invalid dummy license.
                    $license = new Wslm_ProductLicense(array(
                        'status' => $result->get_error_code(),
                        'error' => array(
                            'code' => $result->get_error_code(),
                            'message' => $result->get_error_message(),
                        ),
                    ));
                } else {
                    $license = $result;
                }
            }
     
            $request->license = $license;
            return $request;
        }
     
        protected function filterMetadata($meta, $request) {
            $meta = parent::filterMetadata($meta, $request);
     
            //Include license information in the update metadata. This saves an HTTP request
            //or two since the plugin doesn't need to explicitly fetch license details.
            $license = $request->license;
            if ( $license !== null ) {
                $meta['license'] = $this->licenseServer->prepareLicenseForOutput($license);
            }
     
            //Only include the download URL if the license is valid.
            if ( $license && $license->isValid() ) {
                //Append the license key or to the download URL.
                $args = array( 'license_key' => $request->param('license_key') );
                $meta['download_url'] = self::addQueryArg($args, $meta['download_url']);
            } else {
                //No license = no download link.
                unset($meta['download_url']);
            }
     
            return $meta;
        }
     
        protected function checkAuthorization($request) {
            parent::checkAuthorization($request);
     
            //Prevent download if the user doesn't have a valid license.
            $license = $request->license;
            if ( $request->action === 'download' && ! ($license && $license->isValid()) ) {
                if ( !isset($license) ) {
                    $message = 'You must provide a license key to download this plugin.';
                } else {
                    $error = $license->get('error');
                    $message = isset($error) ? $error : 'Sorry, your license is not valid.';
                }
                $this->exitWithError($message, 403);
            }
        }
    }

    來源于: https://w-shadow.com/blog/2013/03/19/plugin-updates-securing-download-links/

    給TA贊賞
    共{{data.count}}人
    人已贊賞
    ??
    Npcink上的部份代碼及教程來源于互聯(lián)網(wǎng),僅供網(wǎng)友學(xué)習(xí)交流,若您喜歡本文可附上原文鏈接隨意轉(zhuǎn)載。
    無意侵害您的權(quán)益,請(qǐng)發(fā)送郵件至 1355471563#qq.com 或點(diǎn)擊右側(cè) 私信:Muze 反饋,我們將盡快處理。
    ?
    購物車
    優(yōu)惠劵
    搜索
    主站蜘蛛池模板: 交换国产精品视频一区| 一本岛一区在线观看不卡| 天堂va视频一区二区| 日韩人妻无码一区二区三区99 | 无码少妇一区二区三区| 国产精品视频分类一区| 日本精品啪啪一区二区三区| 无码一区二区三区在线观看| 麻豆文化传媒精品一区二区| 在线精品日韩一区二区三区| 免费观看一区二区三区| 国产精品久久一区二区三区| 国产亚洲情侣一区二区无| 欧美日韩国产免费一区二区三区 | 加勒比精品久久一区二区三区| 日韩精品人妻一区二区中文八零| 国产精品视频无圣光一区| 冲田杏梨高清无一区二区| 精品人妻少妇一区二区三区在线| 中文字幕aⅴ人妻一区二区| 国内自拍视频一区二区三区 | 国精品无码一区二区三区左线| 国产精品特级毛片一区二区三区 | 国产精品电影一区| 中文字幕一区二区三区在线不卡| 精品国产一区在线观看| 女人和拘做受全程看视频日本综合a一区二区视频 | 亚洲国产成人精品无码一区二区| 在线视频国产一区| 午夜影院一区二区| 曰韩人妻无码一区二区三区综合部| 国产成人精品久久一区二区三区av| 成人在线观看一区| 亚洲国产欧美国产综合一区 | 国产视频一区在线播放| 91福利视频一区| 无码国产精品久久一区免费| 日本一区二区视频| 国产一区二区视频免费| 国产在线一区二区视频| 精品无码一区二区三区电影|