2013-03-21 2 views
0

제 질문을 보내 주셔서 감사합니다.쿠키 변수의 직렬화를 해제하십시오.

코드 : (배열에서 연재)

$array = array("zero","one","true","three"); 
echo $beforecookie = serialize($array); //<<-- IT WORKS; 
print_r(unserialize($beforecookie)); //<<--IT WORKS 

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie']; // <<-- it works perfectly same with $beforecookie 

$data = unserialize($aftercookie); 
print_r($data); //<<--RETURN NOTHING (the problem) 
var_dump($data); //<<-- RETURN bool(false); 

문자열 내가 쿠키에서 가져온로 unserialize 할 수 없다; 왜? serialize()를 사용하여 쿠키를 설정 한 다음 배열을 다시 가져올 수 있습니까? 아니면 뭔가 놓쳤을까요?

도움 주셔서 감사합니다.

+3

** NEVER ** 때 unserialize 쿠키 데이터 (또는 사용자가 조작 할 수있는 다른 문자열)! 그렇게하는 것이 중요한 보안 구멍입니다. – ThiefMaster

+0

비 직렬화에 오류가 있습니까? 체크 로그 – sectus

+0

@ ThiefMaster하지만 가능하거나 불가능합니까? – egig

답변

0

쿠키는 스크립트 실행 후 헤더와 함께 설정되므로 페이지를 다시로드하기 전에 쿠키에 액세스 할 수 없습니다. ...

0

당신은 당신의 코드의이 부분을 변경할 수 있습니다

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie'] // <<-- it works perfectly same with $beforecookie 

당신이 원을 설정 한 쿠키 브라우저가 페이지를 새로 고칠 때까지 코드에서 사용할 수 없습니다.

또한이 작업을 실제로 수행하려면 서버 쪽 비밀 정보와 쿠키에 저장하는 데이터의 내용을 기반으로하는 쿠키에 체크섬을 추가해야합니다. 봐봐 hash_hmac(). 믿을 수없는 출처에서받은 값을 맹목적으로 비 직렬화하는 것은 무책임한 행동입니다.

1

이 코드 조각을

if(!$_COOKIE['mycookie']){ 
setcookie('mycookie', $beforecookie, time()+3600); 
} 

은 다음 페이지를 다시로드 :

0

당신이 바로이 줄 끝에서

$_COOKIE['mycookie'] = $beforecookie; 

를 추가 즉시 사용 가능한 (그리고 다른 사람과 같은 페이지 새로 고침 말했다 후) 쿠키를 원한다면

setcookie('mycookie', $beforecookie, time()+3600); 

쿠키 즉시 사용할 수 있습니다 :-)

1

기능 후 base64_encode()을 사용해야합니다. serialize().

세트 :

setcookie('name', base64_encode(serialize($arr))); 

GET :

unserialize(base64_decode($_COOKIE['name']));