2008-11-28 5 views
3

내 웹샵에 기존 결제 플랫폼을 통합하려고합니다. 성공적인 거래를 한 후 결제 플랫폼은 쿼리 매개 변수에 포함 된 거래 ID로 신청서의 URL로 요청을 보냅니다.PHP에서 세션을 다시 초기화하는 방법은 무엇입니까?

그러나 주문 확인서를 보내는 것과 같은 후 처리가 필요합니다. 이렇게하려면 주문 관련 정보가 많이 저장되어 있으므로 사용자 세션에 대한 액세스가 필요합니다. 이를 위해, 나는 intial 요청 XML에서 SESSION_ID을 포함하고 트랜잭션이 완료된 후 다음을 수행 :

$sessionId = 'foo'; // the sessionId is succesfully retrieved from the XML response 
session_id($sessionId); 
session_start(); 

위의 코드는 잘 작동하지만 $_SESSION은 여전히 ​​비어 있습니다. 나는 뭔가를 간과하고 있는가? 아니면 단순히 불가능한가?

편집 : 모든 답변

감사합니다. 문제는 아직 해결되지 않았습니다. 위에서 말했듯이 이상한 점은 주문을 한 사용자에게 속한 session_id를 사용하여 새 세션을 성공적으로 시작할 수 있다는 것입니다. 다른 아이디어?

+0

두 응용 프로그램이 같은 도메인에 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 응용 프로그램이 동일한 도메인에 있지 않습니다. –

답변

1

모든 답장을 보내 주셔서 감사합니다.

Smazurov's answer 나를 생각해 내 PHP 구성을 한 번 더 간과하게 만들었습니다.

PHP의 기본 동작은 세션 관련 데이터를 암호화하는 것이 아니며 이어야합니다.은 다른 세션에서 이전 세션을 다시 시작한 후에 세션 데이터를 읽을 수 있어야합니다. 그러나 패치 및 일부 보안 문제를 방지하려면 Suhosin을 사용합니다. Suhosin의 기본 행동은 encrypt session data based on the User Agent이며, 다른 사람들의 세션을 읽는 것이 훨씬 어렵습니다.

이것은 또한 내 문제의 원인이었습니다. 이 동작을 비활성화하면 문제가 해결되었습니다.

-1

더러운,하지만 나를 위해 일했습니다

http://yourdomain.com/callbackurl.php?PHPSESSID=SESSIONIDHERE 

PHP 자체 주위 세션을 전달하는 방법을 특정 설정이 바르 (session.use_trans_sid는)를 설정하면 것을 사용하는 사용하는 지불 게이트웨이에게 , PHP가 그렇게하지 않는다고 말한 경우에도 작동하는 것으로 보입니다. 그것은 확실히 나를 위해 일했습니다.

편집 :

귀하의 문제는 당신이 세션의 자동적 true로 설정했는지 될 수있다 - 그래서 세션이 코드가 실행 전에 생성, 어떤 ID 사용하여 자동으로 시작합니다.

+0

아직이 솔루션을 시도하지는 않았지만 세션 ID를 전달하는 것이 문제가 아닙니다. 이것은 작동하는 것 같습니다. $ _SESSION 변수는 비어 있습니다. –

+0

session.auto_start ....에 대한 편집을 참조하여 작업을 중지하고 내 작업을 허용하십시오. – benlumley

+0

답장을 보내 주셔서 감사합니다. session.auto_start가 비활성화됩니다. 요청은 내 프론트 컨트롤러를 통과하지만 세션이 자동으로 시작됩니다. 이 세션을 사용하지 못하도록 ID를 설정하고 새 세션을 시작하기 전에 session_destroy()를 호출합니다. session_id()를 인쇄하면 문제가 없습니다. –

4

고객에게 묻는 것은 아니지만 고객을 결제 서비스로 보내기 전에 데이터베이스에 주문을 보관할 필요가 없습니까? 지불 확인을받을 때 주문의 사후 처리에서 영구 데이터에 의존하는 것이 좋습니다.

세션 확인은 신뢰할 수 없습니다. 확인하는 데 걸리는 시간을 알지 못하기 때문에 (대개 인스턴트이지만 드물지만 지연 될 수 있습니다.)

또한이 기간 동안 웹 서버를 다시 시작하는 경우 관련 데이터를 잃게됩니다.

세 번째 문제는 개별 세션 관리 (매우 일반적인)로로드 균형 조정 솔루션을 사용하는 경우 지불 서버와 클라이언트가 동일한 웹 서버에 도달한다는 보장이 없습니다 (일반적으로 끈적 거림이 보통이므로 source-ip 기반).

+0

부하 분산은 좋은 지적입니다! 또 다른 것은 제공자에게 해쉬 값 (단지 보안 추가를 위해, 사용자가 URL을 추측하는 것을 방지하기 위해)과 id를 순서대로 보낸 다음 콜백에서 순서를 식별하는 데 사용하는 것입니다. – benlumley

+0

답변 해 주셔서 감사합니다. 유효한 포인트를 제공하지만 현재 주문 프로세스는 데이터베이스의 주문 데이터 만 부분적으로 유지합니다. 주문 프로세스 중 일부 주별 데이터는 세션에 저장됩니다. 이는 예를 들어 결제 실패 처리에 편리한 솔루션을 제공하기 때문입니다. –

-1

다른 PHP 페이지에서는 어때? iframe 포함/두 번째 페이지로 사용자 리디렉션합니까?

-1

거래와 수표 사이의 정확한 시간은 확실하지 않습니다. 확실히 세션 쿠키가 만료 된 것 같습니다. 세션은 기본적으로 45 분 정도 후에 만료됩니다. 이것은 더 많은 uniqid를 사용하여 PHP가 세션 하이재킹을 막을 수 있도록 해줍니다.

사용자 지정 세션 처리기가 있고 데이터베이스에 저장되어 있는지 여부는 확실하지 않지만이 페이지의 게시물 및 의견을 추측하여 서버 측 쿠키에 저장되어 있다고 가정합니다.

이제 문제를 해결하려면 데이터베이스에 필요한 데이터를 저장하고 세션 ID를 통해 액세스해야합니다. 물론 주문 테이블과 나란히 앉아 다른 테이블을 만드는 경우에도 마찬가지입니다.

그러나 즉시 조치를 취하는 경우 다른 설명은 사용자가 로그 아웃하거나 세션을 파괴 한 조치 (서버 측 쿠키 제거)를 저지른 것입니다.

이러한 쿠키는 servers/tmp 폴더에 표시됩니다. 쿠키를 찾으려면 'sess'+ $ session_id로 지정해야합니다.

3

도메인이 세션이 설정된 위치와 다르기 때문에 PHP는 세션을 안전하게 재생하고 다른 도메인에서 세션 데이터를 검색하지 않는다고 추측합니다. 누군가가 세션 ID를 추측하여 데이터를 도용하려는 경우 보안 유지를 위해 노력합니다.

이 문제를 해결하려면 동일한 물리적 디스크에서 교환이 일어난다 고 가정하면 직렬화 된 데이터를 임시로 쓰거나 (전체 암호화되지 않은 전체 신용 카드 번호가 추적되는 경우에 따라 암호화 될 수 있음) 전체적으로 다른 이야기입니다) 파일이 즉시 제거됩니다.

본질적으로 모든 것이 귀찮은 보안 부작용없이 세션에서 벗어나려고하는 기능과 중복됩니다.

+0

답장을 보내 주셔서 감사합니다. 그것은 나를 생각하고 마침내 내가 http://stackoverflow.com/questions/325836/how-to-re-initialize-a-session-in-php#328987에서 설명한대로 문제를 해결하는 데 도움이. –

0

새 세션을 시작하기 전에 현재 세션을 닫아야합니다. 따라서해야 할 일 :

$id = 'abc123'; 
session_write_close(); 
session_id($id); 
session_start(); 
관련 문제