2011-04-09 4 views
1

다음은 현재 작성중인 클래스의 일부로, 직렬화를 처리해야합니다. serialize 함수가 제대로 작동하고 적절한 문자열이 생성됩니다. 문제는 deserialize ($ data) 함수에 있습니다. deserialize 함수에서 올바른 serialize 된 문자열이 unserialize로 전달됩니다. $ scl 개체에 예상되는 데이터가 없습니다. 통지 또는 오류가 발생하지 않습니다. 결과적으로 $ scl-> printData()는 클래스 변수의 내용이 아닌 정보를 인쇄합니다. 앞으로 unserialize의 결과를 $ this에 할당하고 싶습니다. 내가 뭘 놓치고 있니?오류는 발생하지 않지만 PHP의 직렬화를 성공하지 못합니다.

public function serialize() { 
    $serial = serialize($this); 
    $df = gzdeflate($serial); 
    $b64 = base64_encode($df); 
    $ue = urlencode($b64); 
    return($ue); 
} 

public function deserialize($data) { 
    $u64 = base64_decode($data); 
    $gf = gzinflate($u64); 
    $scl = unserialize($gf); 
    if(!$scl) 
     echo"Cannot unserialize<br>"; 
    $scl->printData(); 
} 
function __sleep() { 
    return($this); 
} 
function __wakeup() { 
    echo"Waking up"; 
} 
public function printData() { 
    echo"Data: <br> 
    ID: {$this->ID} <br> 
    sID: {$this->sID}<br> 
    ... 
    "; 
} 

답변

3

__sleep 직렬화되어야 키 supposed to return an array이다. 당신은 그 물건을 돌려주고 있습니다.

당신 다음과 같은 통지를 받고해야합니다

serialize(): __sleep should return an array only containing the names of instance-variables to serialize.

이 표시되지 않는 경우, 당신은 오류보고있는 모든 방법을 위로 설정되어 있는지 확인하십시오.

객체 직렬화 키의 배열 대신에 반환되기 때문에, 직렬화 된 객체는 같은 것을 찾고 끝날 것 :

O:3:"Foo":1:{N;} 

푸이었다 내 테스트 클래스 이름을, 그리고 Nnull에 일렬 화된다. 이것이 귀하가 귀하의 데이터를 잃어버린 이유입니다.

전체 개체를 serialize하려면 __sleep에서 모든 속성을 배열로 반환하거나 전혀 구현하지 마십시오. 그것과 __wakeup은 완전히 선택 사항입니다. 당신이 PHP 5.3을 사용하는 경우 당신이


그것은 주목할 필요가 직렬화 및 unserialization 효과를 처리하는 코드를 실행하려는 경우 유용 할 수 있다는 다른 부작용으로

, 대신 implementing Serializable을 고려 거대한 여기에 보안 문제가 있음을 알 수 있습니다. URL 인코딩을 통해 폼이나 URL을 통해 직렬화 된 객체를 전달할 수있는 것처럼 보입니다. 이는 나쁘고 나쁜 생각입니다. 특히 맞춤 수면/깨우기 처리를 만드는 경우에 특히 좋습니다. malicious users to inject arbritary code (PDF 링크, 28 페이지부터 시작)의 벡터가 될 수 있습니다. 당신이 절대적으로 일 경우이 야생에서 직렬화 된 객체를 전달해야한다면 using real encryption을, 그리고 signing the data with an HMAC을 고려하십시오.

+0

잘 작동했습니다. unserialize 결과를 $ this에 할당 할 수 없었습니다. 지금은 불가능합니다. – jallmer

+0

@jallmer, correct,'$ this'에 * anything *을 직접 할당 할 수없고, 속성에만 할당 할 수 있습니다. 또한 중요한 보안 문제에 대한 최종 질문을 추가했습니다. – Charles

+0

고맙습니다. 문제를 해결 한 '복사 생성자'와 같은 것을 만들었습니다. 이제는 보안 문제를 다룰 것입니다. – jallmer

관련 문제