2011-09-04 41 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)或至少使用一些质询响应方法。

但是,当你的应用程序是开源的,它将是一种绕过它的方式。而且如果不是;-)。