Nasıl PHP yeniden başlatmak bir oturum için?

7 Cevap php

Benim Webshop'undan içine varolan bir ödeme platformu entegre çalışılıyor. Başarılı bir işlem yaptıktan sonra, ödeme platformu kimlik sorgu parametreleri dahil işlem ile benim uygulamada bir URL için bir istek gönderir.

Ancak, sipariş ile ilgili bir çok bilgiyi orada saklanır çünkü bunu yapmak için bir sipariş onayı, gönderme vs gibi, ben, kullanıcının oturumuna erişim gerekiyordu bazı post-processing yapmak gerekir. Bunu yapmak için, ben intial isteği XML session_id dahildir ve işlem sonrasında aşağıdaki tamamlandıktan yapın:

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

Yukarıdaki kod çalışıyor, fakat $_SESSION hala boş. Ben bir şey ya da bu sadece mümkün değil bakan muyum?

EDIT:

Tüm cevaplar için teşekkürler. Sorun henüz çözülmüş değil. Dediği gibi, garip bir şey başarıyla sipariş kullanıcıya aittir session_id kullanarak yeni bir oturumu başlatabilirsiniz olmasıdır. Diğer fikirler?

7 Cevap

Tüm cevaplar için çok teşekkürler.

Smazurov's answer beni düşünme var ve beni bir kez daha benim PHP yapılandırma bakmaktadır yaptı.

PHP'nin varsayılan davranış should mümkün başka bir müşteri bir eski oturumu yeniden başlattıktan sonra oturum verilerini okuma yapmak oturum ilgili verileri şifrelemek için değil. Ancak, Suhosin bazı güvenlik sorunları yama ve önlemek için kullanın. Suhosin varsayılan davranışı çok daha zor diğer insanların oturumları okumak için yapım, encrypt session data based on the User Agent etmektir.

Bu da benim sorunların nedeni; Bu davranışı devre dışı sorunu çözmüştür.

Gerçekten ne sormak için, ama siz ödeme hizmet için müşteri göndermeden önce veritabanına sırasını devam gerekmez? Bu ödeme onay aldığınızda sipariş sizin post-processing kalıcı verilere güvenmek daha iyidir.

Bu onay (genellikle anlık, ama nadir durumlarda bu bir gecikme olacak) ne kadar süreceği hakkında hiçbir fikrim yok çünkü oturumlarda dayanarak güvenilir değildir.

Ayrıca, bu süre boyunca web sunucusu yeniden başlaması durumunda, sen ilgili verileri kaybetmek yapacaktır.

Üçüncü sorun, tek oturum yönetimde (çok yaygın) bir yük dengeleme çözümü, varsa o zaman yapışkanlık, genellikle tabanlı kaynak-ip olduğu ödeme-sunucu ve istemci (aynı web sunucusu ulaşacağını hiçbir garantisi olacaktır .)

Ben etki oturumunda okumak için çalışıyoruz nerede ayarlanır yerden farklı olduğundan, php güvenli oynamaya ve farklı bir etki tarafından belirlenen oturum verilerini almak olmadığını tahmin girişim olacaktır. Bu durumda birileri güvenliği korumak için bir çaba yapar oturum kimliğini tahmin ve verileri kaçırmak vardı.

Bunun için geçici çözüm, değişim aynı fiziksel diskte olur varsayarak, dosya bir kez (başka bir hikaye, bir bütün olup, tam kredi kartı numarası izleniyor ve muhtemelen wether olmamasına bağlı olarak şifreli) tefrika geçici yazma sipariş verileri için Alıcı sonunda okunan derhal kaldırılır.

Özünde yaptığı tüm çiftleri size can sıkıcı güvenlik yan etkileri olmadan oturumları çıkmak için çalışıyoruz işlevselliği.

Eğer yeni bir başlangıç ​​denemeden önce geçerli oturumu kapatmadan emin olun. Yani yapıyor olmalıdır:

$id = 'abc123';
session_write_close();
session_id($id);
session_start();

Kirli, ama benim için çalıştı:

Kullanmak için ödeme geçidi söyle

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

Belirli yapılandırma değişkenler (session.use_trans_sid) ayarlarsanız PHP kendi etrafında bir oturumu geçen bu yöntemi kullanır, ve PHP yapmak değil söylendiğini bile çalışmaya görünüyor. Onun kesinlikle her zaman benim için çalıştı.

Edit:

Böylece kod çalışır önce oturumu, oluşturduğu neyse kimliği kullanılarak otomatik olarak başlıyor - Senin sorunun session.auto_start doğruya ayarlanmış olabilir.

Peki başka bir PHP sayfasında bunu, ve bir iframe ikinci sayfaya / yönlendirme kullanıcı eklerim?

Ben senin işlem ve kontrol arasındaki zaman tam uzunluğu emin değilim; ama kesinlikle oturum tanımlama doldu gibi görünüyor. Oturumlar varsayılan olarak 45 dakika kadar sonra genellikle sona erer. Bu potansiyel oturum ele kullanmak ve önlemek için php için daha uniqid bulunuyor kadar özgür olmaktır.

Bir özel oturum işleyicisi var ve veritabanında saklanan ama mesajların ve bu sayfadaki yorumlardan tahmin ben sunucu tarafı kurabiye depolanan kabul edip eğer ben emin değilim.

Şimdi sorunun çözümü, bu yan siparişlerinizi tablo birlikte oturmak için başka bir tablo yaratmak anlamına gelse bile, kabullenmesini ve veritabanında gerekli verileri depolamak ve oturum kimliği üzerinden erişmek olacaktır.

Hemen eylem yapıyor ancak sonra başka bir açıklama kullanıcı ya da dışarı açmış veya (sunucu tarafı çerez kaldırma) oturumuna tahrip eylemi işlediği olmasıdır.

Eğer çerez için bir göz deneyin, sizin sunucuları / tmp klasöründe bu çerezleri göreceksiniz, 'sess' + $ session_id adlı olmalıdır.