2014-10-02 88 views
0

比方說,我有這樣的在解碼的base64字符串替換保護memeber

class ClassA { 
    public $publicMember; 
    private $privateMember; 
    protected $protected; 
} 

A級和Ⅰ的編碼對象ClassA的是這樣的:

$objectA = new ClassA(); 
$stringA = base64_encode(serialize($objectA)); 

我想更換所有受保護的成員,但我不知道如何。我已經試過這樣:

$newString = str_replace('�*�', '', base64_decode($stringA)); 

我很抱歉它這個問題很容易,但我真的不知道該如何處理這個問題。謝謝!

+0

總是成員標量還是空值? – sectus 2014-10-02 08:05:03

+0

他們有價值。最後,當我反序列化字符串時,我希望所有成員都是公開的,即使我可以獲得一個不完整的PHP類。 – OsomA 2014-10-02 08:08:06

+0

你是以什麼方式取代受保護的成員或將其公諸於衆? – sectus 2014-10-02 08:08:54

回答

1

屬性名稱以長度開頭。

string(92) "O:6:"ClassA":3:{s:12:"publicMember";N;s:21:"\000ClassA\000privateMember";N;s:12:"\000*\000protected";N;}" 
| property name length  ^     ^        ^
| we will try to capture this part             ^  ^ 

如果您要將「保護」轉換爲公共,您需要減少此長度。例如。

class ClassA 
    { 

    public $publicMember; 
    private $privateMember; 
    protected $protected; 

    } 

$objectA = new ClassA(); 
$stringA = serialize($objectA); 
$converted = preg_replace_callback('@:(\d+):"\x00\*\[email protected]', function($match) 
//         ^catch the number 
//           ^ ^ null symbols   
    { 
    $property_name_length = $match[1]; 
    return ':' . ($property_name_length - 3) . ':"'; // reduce catched number and do not return \x00*\x00 
    }, $stringA); 
var_dump(unserialize($converted)); 

主要生產

class ClassA#2 (4) { 
    public $publicMember => 
    NULL 
    private $privateMember => 
    NULL 
    protected $protected => 
    NULL 
    public $protected => 
    NULL 
} 

附:但是,當您開始將序列化的數據存儲爲成員值時,此代碼將失敗。

+0

你可以向我解釋preg_replace的回調嗎? – OsomA 2014-10-02 08:40:16

+0

謝謝,它是:-) – OsomA 2014-10-02 08:49:44

0

讓我們嘗試另一種方式:

  1. 轉換serialzed類stdClass的
  2. 反序列化
  3. 增加公衆保護性
  4. 連載
  5. 轉換序列stdClass的原始

- -

class ClassA 
    { 

    public $publicMember; 
    private $privateMember; 
    protected $protected; 

    } 

$objectA = new ClassA(); 
$stringA = serialize($objectA); 

// 1. convert serialzed class to stdClass 
$stringA = preg_replace('/' . strlen('ClassA') . '/', strlen('stdClass'), $stringA, 1); 
$stringA = preg_replace('/ClassA/', 'stdClass', $stringA, 1); 

// 2. unserialize 
$object = unserialize($stringA); 

// 3. add public protected properties 
while (list($key, $value) = each($object)) // hack with each 
    { 
    if (strpos($key, "\x00*\x00") === 0) 
     { 
     $key = str_replace("\x00*\x00", '', $key); 
     $object->$key = $value; 
     } 
    } 

// 4. serialize 
$stringB = serialize($object); 

// 5. convert serialized stdClass to original 
$stringB = preg_replace('/' . strlen('stdClass') . '/', strlen('ClassA'), $stringB, 1); 
$stringB = preg_replace('/stdClass/', 'ClassA', $stringB, 1); 

var_dump(unserialize($stringB)); 

可生產

class ClassA#3 (4) { 
    public $publicMember => 
    NULL 
    private $privateMember => 
    NULL 
    protected $protected => 
    NULL 
    public $protected => 
    NULL 
} 

P.S.它比第一個更安全,但...:)

+0

我不認爲這是保存和確定,因爲它保持受保護的成員,我希望他們被替換不復制。 – OsomA 2014-10-02 09:04:25

+0

您知道,很難刪除受保護的資產並保留私人資產。 – sectus 2014-10-02 09:27:00

+0

非常感謝你對我的幫助很大 – OsomA 2014-10-02 10:54:47