2011-04-14 83 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