2014-07-15 5 views
0

내 SF 1.4 앱에서 memcached (igbinary api 사용)를 구현 중이며 문제가 발생하여 진행 방법에 대한 통찰력이 필요합니다.Symfony 1.4 - sfCacheSessionStorage

기본적으로 sfCacheSessionStorage를 확장하고 다음 메서드를 재정의하는 자체 캐싱 클래스를 만들었습니다. initialize, regenerateshutdown. 나는이 메소드들을 모두 오버라이드 시켜야만했다. 그들은 PHP의 직렬화 API를 호출하지만 대신에 igbinary 직렬화 API를 사용하는 것을 선호한다.

모든 것을 얻은 후에 나는 sfCacheSessionStorage::regenerate()이 세션이 이미 재생성되었는지 여부에 관계없이 자신의 세션 ID를 생성한다는 사실을 발견했습니다. 예를 들어 상위 sfSessionStorage::regenerate() 클래스에는 세션이 이미 다시 생성되었는지 여부를 확인하는 데 사용되는 싱글 톤이 있습니다. 이렇게하면 세션 데이터가 이전에 재생성 된 session_id와 연결되어 있고 새로 생성 된 session_id로 옮겨지지 않아서 세션 데이터가 손실 될 수있는 문제가 방지됩니다.

SF 1.4는 사용자를 인증 (로그인), 로그 아웃, 자격 증명을 지우거나 추가하는 경우 언제든지 regenerate() 메서드를 호출합니다. 내가 가진 문제는 사용자가 인증 된 것으로 표시되고 자격 증명을 지우고 그룹 연결을 추가하는 수신기를 호출하면 세션 데이터가 손실되는 sfCacheSessionStorage::regenerate()에 대한 두 건의 호출이 발생합니다. 그러나 쿠키를 편집하고 세션을 처음 재생성 된 session_id로 설정하면 세션이 예상대로 작동하지만 세션 ID가 새로 생성 된 세션 ID로 인해 세션 데이터가 손실된다는 것이 명확한 자격 증명으로 인한 두 번째 호출입니다.

내 생각은 sfSessionStorage의 논리를 따르고 세션이 이미 재생성되었는지 여부를 확인하기 위해 싱글 톤을 사용하는 것이지만 sfCacheSessionStorage::regenerate() 세션이 EVERYTIME을 재생성하는 이유가있을 수 있습니다. 그래서 제 질문은 싱글 톤 전략을 진행하는 것이 안전한지, 아니면 언제나 재생성을 시도해야합니까? 로그인/아웃하거나 자격증 명을 추가/제거 할 때 session fixation 하이재킹 시나리오를 피하는 것이 유일한 이유는 session_id를 다시 생성해야한다는 것입니다. sfCacheSessionStorage

내 코드에 대한 sfSessionStorage

  • 소스 코드에 대한

    • 소스 코드가 정확히 동일의 직렬화/때 unserialize 전화에 저장합니다.

  • 답변

    0

    불필요한 다중 session_id 재생성을 피하기 위해 OP에서 언급 한 싱글 톤을 추가했습니다. 또한 $this->cache->set 호출에 대한 체크를 추가했습니다. 캐시에 빈 배열을 저장하는 것은 의미가 없으므로 shutdown() 메서드는이를 수행합니다.