2013-06-30 6 views
1

사용자가 등록하고 계정에 액세스 할 수있는 웹 사이트를 개발 중이며 사용자가 연결되면 serialization 및 base64 인코딩을 사용하여 쿠키에 User 개체를 저장합니다. PHP 스크립트가 쿠키를 만들고 싶지 않은 것은 완벽하게 작동하고있었습니다. 내 PHP 스크립트입니다 :PHP 쿠키에 개체 저장이 작동하지 않습니다.

/** 
* Function that creates a cookie from an User object 
* @param User $user User object to be stored in the cookie 
* @param int $timeout Lifetime of the cookie (0 if should be destroyed when the navigator is closed) 
*/ 
function setUserCookie($user, $timeout = COOKIE_MAXLIFETIME) { 
    setcookie('user', base64_encode(serialize($user)), $timeout, '/'); 
} 

문제가 어디에서 오는 나는, 나는 누군가가 나를 :) 도움이되기를 바랍니다 모르는

편집 : 이것은 대학의 프로젝트가 나는 입니다 내 웹 사이트가 쿠키에 객체를 저장하는 동안 취약 할 수 있다는 것을 알고 있지만 웹 사이트의 보안보다는 기능에 초점을 맞추어야합니다.

+1

사용자는 쿠키를 변경하고 다른 사람으로 로그인 할 수 있습니다. – SLaks

+2

이 작업을 수행하지 마십시오. 사용자를 세션 내에 저장하십시오. 이는 훨씬 더 깔끔하고 안전한 방법입니다. – Pierre

+0

자, 코드를 세션으로 변경하고 있습니다. 하지만, 탐색기를 닫은 후 연결된 사용자를 저장하는 쿠키보다 깨끗한 방법이 있습니까? –

답변

0

사용자가 웹 사이트에 로그인 할 수없는 경우에도 마침내 $_SESSION을 사용하여 작동하게했습니다.

2

외부 세계에서보고 조작 할 수있는 문자열에 직렬화 된 문자열을 저장하지 마십시오! 그것은 보안상의 구멍입니다! 왜?

직렬화 된 문자열에는 개체를 작성하는 데 사용 된 클래스의 이름이 들어 있습니다. 이것은 변경할 수 있습니다. 임의의 캐릭터 라인의 직렬화를 해제하면 (자), 임의의 오브젝트가 생성됩니다. 이 오브젝트 코드를 사용할 수 있으면 실행됩니다. 이것은 기본적으로 원격 코드 실행 취약점입니다. 외부 공격자가 어느 코드를 실행하려고 하는지를 어느 정도 선택할 수 있기 때문입니다.

실제로 데이터를 쿠키에 저장하려면 데이터 만 포함하고 PHP 객체에 대한 참조가없는 직렬화 형식을 사용하십시오. json_encode()이 올바른 것일 수 있습니다. 더 좋은 방법은 세션을 사용하고 현재 로그인 서버 측과 관련된 것을 저장하는 것입니다.