2011-09-04 58 views
0

我正在考慮使用有效的串行代碼來實現MySQL數據庫,該代碼將根據用戶輸入進行檢查並授予應用程序的使用,如果檢查返回true,但我知道這是太基本因爲用戶(他將使用基於本地主機的應用程序)很容易破解數據庫並添加他自己的連續劇(或者至少告訴別人誰已經對PHP有基本的瞭解,如果他們認爲應用程序出現了「魔法框」)。如何製作一個PHP串行代碼系統

由於我以前沒有做過這個,有沒有流行的方法?或者更好,如果你只是給了我一些想法,它會很好。

+0

如果我正確理解你,你想添加DRM到你的PHP應用程序。那是對的嗎? –

回答

0

永遠不會有任何100%不可破解的方法。 任何東西都可以進行逆向工程,如果你有時間和專業知識。

但什麼可以做,以最大限度地提高您沒有被破解的機率是使用某種預編譯/混淆的類似Zend GuardionCube(和others),以保護您的代碼。這些大多數(所有?)都帶有預先構建的許可功能,這絕對是推薦的方法。

這些的問題是,它們不是免費的...

編輯

關於它的思考,你可以實現這樣的事情自己,放心地,在一個非常選擇一套情況。如果你正在開發一些可以分發二進制文件的東西,你可以實現一些東西,而不用擔心它可能會被那些不十分認真地知道他們在做什麼的人破解。 HipHop免費available to download from github

儘管遠程數據庫檢查仍然是一個糟糕的主意,因爲人們可以嗅探網絡流量並反向設計密鑰,或者學習如何欺騙響應(一個簡單的hosts file編輯可以攔截網絡流量)。您可以更好地對每個實例的關鍵字進行硬編碼,並在每次調用時使用某種算法對其進行驗證 - this siteGoogle可能會幫助您。

-2

看看這裏http://dev.michaelnorris.co.uk/tests/random_string.php

<?php 
function makePin($lenth=10) { 
// makes a random alpha numeric string of a given lenth 
$aZ09 = array_merge(range('A', 'Z'), range('a', 'z'),range(0, 9)); 
//$aZ09 = array_merge(range('A', 'Z'), range(0, 9)); 
$out =''; 
for($c=0;$c < $lenth;$c++) { 
    $out .= $aZ09[mt_rand(0,count($aZ09)-1)]; 
} 
return $out; 
} 
$obscure = makePin(); 
echo $obscure; 
?> 
+1

我想他想驗證代碼,而不是生成它們。此外,使用編輯按鈕,而不是做一個新的職位。 –

+0

由於兩個答案完全不同,我創建了一個新帖子。我不想混淆OP。 OP沒有具體說明他在哪一部分遇到麻煩,所以我至少在代碼生成方面給了他們一個幫助。人們太快批評這些日子了! – Mike

+0

欣賞你的片段邁克,稍後必須檢查它。 @Nick ODell是的,你說的是正確的,但我發現Mike的帖子並不無關緊要。 PS:我不是那種你可能會想到的PHP Guru。實際上,我查了大部分功能,然後在弄清楚他們做了什麼後建立了邏輯。感謝這兩個。 – menislici

-2

這實際上是對你,我覺得更好。看看這裏http://dev.michaelnorris.co.uk/tests/random_password.php

我不能拿這個例子的功勞,因爲我把它從網上其他來源混合在一起,我不記得但在這裏它是無論如何。

<?php 

// just so we know it is broken 
error_reporting(E_ALL); 

//string passType can be alpha, numeric, or alphanumeric defaults to alphanumeric int $length is the length of the password, defaults to eight 

class randomPassword{ 

    function __construct($passType='alphanumeric', $length=8, $rangeLength=9){ 
     $this->setLength($length); 
     $this->setRangeLength($rangeLength); 
     $this->passType = $this->setPassType($passType); 
    } 

    function setRangeLength($rangeLength){ 
     $this->rangeLength=$rangeLength; 
    } 

    // set the length of the password 
    private function setLength($length){ 
     $this->length=$length; 
    } 


    // set the type of password 
    private function setPassType($passType){ 
     return $passType.'Chars'; 
    } 

    // return an array of numbers 
    private function numericChars(){ 
     return range(0, $this->rangeLength); 
    } 

    // return an array of chars 
    private function alphaChars(){ 
     return range('a', 'z'); 
    } 

    // return an array of alphanumeric chars 
    private function alphaNumericChars(){ 
     return array_merge($this->numericChars(), $this->alphaChars()); 
    } 

    // return a string of chars 
    private function makeString(){ 
     // here we set the function to call based on the password type 
     $funcName = $this->passType; 
     return implode($this->$funcName()); 
    } 

    // shuffle the chars and return $length of chars 
    public function makePassword(){ 
     return substr(str_shuffle($this->makeString()), 1, $this->length); 
    } 

} // end class 

function randomPassword($length) { 
    // create an array of chars to use as password 
    $chars = implode(array_merge(range(0,9), range('a', 'z'))); 

    // randomly snarf $length number of array keys 
    return substr(str_shuffle($chars), 1, $length); 

} 

/* 
try 
{ 
$obj = new randomPassword('alphanumeric', 16, 100); 
echo $obj->makePassword().'<br />'; 
} 
catch(Exception $ex) 
{ 
echo $ex->getMessage(); 
} 
*/ 
echo strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)); 
?> 
+0

代碼問題:1)不要使用變量函數,這是不好的做法。 2)你的makePassword函數對字符串進行置換,然後獲取一個子字符串。隨着你增加「長度」,這個問題會變得更加明顯。 3)如果'length'太大,它會返回一個較短的字符串(使用什麼生成方法的函數會縮短多少)4)'setPassType'被混淆地命名;它不會設置任何東西(續) –

+0

(續)5)如果'rangeLength'設置爲除9之外的任何東西,它將排除字符('rangeLength <9'),不正確地分配它們(例如,比1更多地分配7 )('rangeLength> 9'),或者比字母('rangeLength == 99')更常見的數字6)倒數第二行應該是一個循環7)你可以通過替換'range ('A','z')''帶範圍('A','Z')' –

1

AFAIK如果他們擁有純文本格式的PHP源代碼,他們可以規避您採取的任何保護措施。

也就是說,那裏有諸如ionCube(google it)這樣的服務,它會對代碼進行混淆(編譯?),並且需要一個密鑰(來自某個遠程服務器)來解鎖執行代碼。

或者您可以爲客戶託管軟件,以便他們無法直接訪問應用程序。

1

你可以實現一個「回家」,發送用戶在他們的網站上輸入的序列號。然後檢查數據庫中的序列號,併發送適當的答覆,無論用戶是否有權訪問他的系統。您可以在用戶登錄其網站時執行此操作。

這樣做的問題在於,由於在未使用Zend Guard之類的工具加密/編碼時很容易更改php文件,因此用戶可以通過將該調用更改爲無法生成並始終返回true來規避此問題。或者他們可以改變他們的網絡服務器的hosts文件,將請求重新路由到他們自己的服務器,並在那裏放置一個僞造你的支票的文件,並且總是返回true。

爲了防止發生這種情況,您必須同時加密您的php文件並實施挑戰 - 響應系統來檢查其序列。

如果我明白你的意思。 :-P

+0

那麼應用程序將永遠保持離線狀態,這就是爲什麼我使用本地主機,所以我不能實現一個通話系統。仍然感謝Zend衛隊,必須檢查它。 – menislici

0

因此,您的主機上有一個MySAL數據庫,客戶應用程序連接到它,對吧?

起初我會在數據庫和客戶之間添加一層。像SOAP這樣的http遠程接口或者使用json的東西。

您應該加密連接到它(https)或至少使用一些質詢響應方法。

但是,當你的應用程序是開源的,它將是一種繞過它的方式。而且如果不是;-)。