2013-07-08 139 views
6

我已經使用PHP創建了一個應用程序,並且我將它賣給我的本地市場。我將親自去他們的位置安裝/配置Apache & MySQL以及安裝我自己的代碼。從PHP獲取計算機唯一ID

我想要一個安全系統,這樣如果有人試圖將我的代碼複製到未經授權的機器上,它將不會運行。

我知道沒有人可以阻止逆向工程應用程序。即使.exe(二進制)文件也被破解,任何人都可以使用PHP(源代碼)。

在我國,這些反向工程師們真的很難找到,所以我想提出像最小的安全選項:

1)創建類(比方說,Navigation)識別,如CPU ID,電腦名稱的系統信息或硬件ID的任意組合來創建一個UNIQUE_ID,並與我給定的UNIQUE_ID(向我銷售該應用程序的個人)進行匹配。如果它有效,它將返回導航菜單。否則,它只會破壞數據庫,並制止通過拋出一個異常的執行,也許像:

class Navigation { 

    public function d() { 
     return current system UNIQUE_ID; 
    } 

    public function get() { 
     $a = file_get_contents('hash'); 
     $c = $this->d(); 
     if (crypt($c) != $a) { 
      //destory database 
      throw new Exception(''); 
     } else { 
      return "<ul><li><a>home</a></li></ul>"; //navigation menu 
     } 
    } 

} 

2)然後在安裝過程中,我會改變系統UNIQUE_ID在「哈希」文件,創建一個對象,並在的header.php

(install.php了)

<?php 
     $a=new Navigation; 
     $out=serialize($a); 
     file_put_contents('nav.obj', $out); 

3)(其被包括在每一個文件):將其保存到一個文件(nav.obj)

<?php 
    $menu=file_get_contents('nav.obj'); 
    $menu=unserialize($a); 
    echo $menu->get(); 
?> 

我知道這種方法並不是完全的證據,但我確信大約60%的PHP開發人員無法破解它!

現在我只需要獲得當前的系統UNIQUE_ID。

+0

DOMAIN呢?將其設置爲應該工作的域,並對其進行散列檢查。 – Robert

+0

有沒有這樣的事情作爲一個系統獨特ID – Anigel

+0

現在,當你公開發布這些,60%將下降到10%... –

回答

12

我已經創建了此功能以獲取基於硬件的唯一ID(硬盤UUID)。根據您的需要,可以使用不同的資源,例如計算機名稱,域名或甚至硬盤大小來獲得更好的方法。

function UniqueMachineID($salt = "") { 
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
     $temp = sys_get_temp_dir().DIRECTORY_SEPARATOR."diskpartscript.txt"; 
     if(!file_exists($temp) && !is_file($temp)) file_put_contents($temp, "select disk 0\ndetail disk"); 
     $output = shell_exec("diskpart /s ".$temp); 
     $lines = explode("\n",$output); 
     $result = array_filter($lines,function($line) { 
      return stripos($line,"ID:")!==false; 
     }); 
     if(count($result)>0) { 
      $result = array_shift(array_values($result)); 
      $result = explode(":",$result); 
      $result = trim(end($result));  
     } else $result = $output;  
    } else { 
     $result = shell_exec("blkid -o value -s UUID"); 
     if(stripos($result,"blkid")!==false) { 
      $result = $_SERVER['HTTP_HOST']; 
     } 
    } 
    return md5($salt.md5($result)); 
} 


echo UniqueMachineID(); 
+0

你有沒有使用shell_exec的替代方案? –

+0

結果是我的電腦和手機有相同的ID。 wah .... – 2017-06-23 02:36:52

+0

請爲上面的代碼提供一個示例diskpartscript.txt文件。它應該是什麼樣子? – user4271704

0

http://man7.org/linux/man-pages/man5/machine-id.5.html

$machineId = trim(shell_exec('cat /etc/machine-id 2>/dev/null')); 

編輯鐵托:

[[email protected]**** ~]$ ls -l /etc/machine-id 
-r--r--r--. 1 root root 33 Jul 8 2016 /etc/machine-id 

EDIT 2鐵托:有些事情要考慮和方案:

被允許獲得用戶一臺新機器?我猜是的。 或在多個設備上運行? 你的情況下,機器的聲音可能無關緊要嗎?

如果它的用戶只有(沒有機器限制),那麼Id去一個授權服務(依賴於網絡)。 有很多這方面的服務: Google Play(對於Android應用程序)就是一個很好的例子:https://developer.android.com/google/play/licensing/index.html MS和Apple有類似的服務。 但是,只需在網絡上搜索術語「軟件許可服務」或「基於雲的軟件許可服務」即可。

如果它的用戶+單個設備,那麼你需要將設備ID傳遞給你使用的任何服務或使,然後允許機器ID更新,但不允許恢復到以前的機器ID(意味着多個設備)。 但是,如果服務需求滿足要求,上述服務將爲您提供客戶端代碼。

兩種經驗場景: 1:任何設備上的用戶:我們只需在雲中(在網站上)和應用程序中的登錄屏幕上創建一個API,當用戶通過API對其進行身份驗證並保存一個令牌,每當設備連接到網絡時,應用程序將查詢API並更新登錄和/或令牌。 您也可以在購買時擁有登錄屏幕(例如,他們可能已登錄到網站購買),生成密鑰並將其打包或綁定到應用程序中。

2:用戶加機器: 除了在查詢API時傳遞機器標識時,除外。機器ID可以隨用戶更新設備而多次更改,但是我們保留了機器ID的記錄並且禁止了規則:如果我們看到舊的(以前使用過的)機器ID,則需要一定的時間通過。因此允許用戶打破他們的機器並拔出舊機器。

另外要考慮如果你做一個,你將如何停止應用程序的工作? Ppl非常聰明,需要進行核心編譯。

然而,所有人都說,各種許可服務都是專業人士,可以滿足大多數需求。再加上他們的經驗,他們已經克服了安全隱患。 Id名稱是我喜歡的一個,除了它的搜索外。

不錯,如果你能回來與正面或負面的結果從你的足跡。

+0

'/ etc/machine-id文件包含本地系統的唯一機器標識,您可以使用該標識輕鬆修改工作標識。 – Tito

+0

機器ID可以在重新啓動時更改。它的許可目的是什麼? – user4271704

+0

不,您不能輕鬆修改機器標識文件。它屬於根,是隻讀的。沒有明智的系統管理員會改變它。上面編輯錯誤。 – ekerner