PHP gelişmiş oturum yönetimini nasıl uygulanacağı

6 Cevap php

i'm working with sessions in PHP, and i have different applications on single domain. Problem is, that cookies are domain specific, and so session ids are sent to any page on single domain. (i don't know if there is a way to make cookies work in different way). So Session variables are visible in every page on this domain. I'm trying to implement custom session manager to overcome this behavior, but i'm not sure if i'm thinking about it right.

Ben tamamen PHP oturum sistemi önlemek ve oturum verilerini saklamak ve veritabanına kaydetmek script ucunda olacağını genel bir nesne, yapmak istiyorum.

  1. Ilk erişim i benzersiz session_id oluşturmak ve bir çerez yaratacak
  2. Script ucunda session_id, oturum ve son erişim başlaması için zaman damgaları ve bu REMOTE_ADDR, REMOTE_PORT, HTTP_USER_AGENT gibi $ _SERVER veri ile oturum verileri kaydetmek.
  3. Istemci cookie gönderilen session_id her erişim chceck veritabanı üzerinde, IP, Port ve (güvenlik) kullanıcı ajan kontrol ve (eğer süresi dolmamış) oturum değişkeni içine veri okumak.
  4. Session_id süresi dolmuşsa, veritabanından silin.

Bu oturum değişken (i bu sınıf ile sıkı bağlantı alacağı biliyorum, ama daha iyi bir çözüm hakkında bilmiyorum) tek olarak uygulanabilir olacaktır.

Ben aşağıdaki faydaları elde etmek çalışıyorum:

  • Aynı sunucu ve aynı etki alanında başka bir komut görünmez Oturum değişkenleri
  • Oturumu sona erme özel yönetim
  • Açık oturumları görmek için bir yol (çevrimiçi kullanıcıların listesi gibi bir şey)

Ben bu çözüm herhangi dezavantajları bakan eğer ben emin değilim. Daha iyi bir yolu var mı?

Teşekkür ederiz!

UPDATE: i did not explain it in enough detail and caused a lot of confusion here, so i want to make clearer what i'm dealing with:

Ben çok farklı ortamlarda görevlendirilecek olan SOA sunucu uygulaması inşa ediyorum. Bu ortamlarda başka bir PHP uygulamalar olabilir, böylece o kendi sunucusuna sahip olmayacaktır. Bu şirketlerin çalışanları bu uygulamada kullanıcı hesaplarına sahip olur, bu yüzden bu uygulama içine oturum kimliği ile bir çerez elde edecektir.

Bildiğimiz gibi, web sunucusu yüklerken PHP çalıştıran oturum verileri (en azından varsayılan) fark etmez hangi dizin oturumu oluşturulur dan ne script. Bütün gereken bir oturumun kimliğidir. Bu oturum kimliği istemciden sunucuya her isteği ile gönderilir. Cevaplarınız i PHP belirli bir dizin için çerezleri kısıtlamak olabilir, nasıl bir yol var, ama onun bilgisayarda depolanan çünkü kötü niyetli bir kullanıcı, çerez düzenlemek mümkün. Benim durumumda kötü niyetli bir kullanıcı benim uygulama erişimi sahip olmamakla birlikte, aynı ortamda php script yazmak ve yürütmek için erişebilir ve veritabanı bulunuyor. Diye bir komut dosyası oluşturursanız, o böylece o izin verilmemesi gerektiğini, okuma ve benim uygulama düzenlemek oturum verileri ve benim uygulama bölümlerine erişmek için erişimi olan, benim uygulama çerez Session id kullanabilirsiniz.

Böyle bir ortamda uygulama dağıtma başka bir güvenlik tehdidi olacak görmek, ne için gidiyorum ben yapabileceği en iyi izolasyon ve varsayılan oturum yönetimi bu gibi kullanımlar için tasarlanmış çok tehlikeli ve değil gibi görünüyor.

Eğer varsayılan oturum yönetimi ile olacağını daha, benim tasarım daha az esnek, daha az güvenli bir şey, görmek Yani benim soru, ..

, Cevaplarınız için teşekkür ederim ..

6 Cevap

Sen kullanmanız gerekir:

session_set_cookie_params ()

http://www.php.net/manual/en/function.session-set-cookie-params.php

Özellikle size webapps her "yol" olarak ayarlamanız gerekir.

session_set_save_handler PHP yöntemi bakabilirsiniz.

http://php.net/manual/en/function.session-set-save-handler.php

Eh, olgusal doğru olduğu, bazı şirketler in-memory/database destekli oturum yönetimini dağıtılmış, çok etki için özel oturum işleyicileri sahip yaklaşım kullanın

Paylaşılan oturumları ile sorunlar yaşamaya istemiyorsanız, uygulama, oturum dosyalarını kurtaracak bir yolunu ayarlamak için session_save_path işlevini kullanabilirsiniz. Bu sunucudaki diğer uygulamalar tarafından kullanılan biri olmayacak gibi, alışkanlık oturum paylaşımı sorunları çalıştırmak.

Sadece bir şey: emin sen oturum dosyalarını kaydetmek yolu web üzerinden erişilebilir olmadığından emin olun. Gibi bir şey:

/YourAppFolder
     /www (web accessible)
     / libs
     /config
     / session (where you put your session files)

I want to completely avoid PHP session system, and make a global object, which would store session data and on the end of script save it to database.

Eğer nesneleri seri düşünüyorsanız, i güvenli ayrıntıları tutmak için onun değil iyi bir uygulama olarak tavsiye olmaz.

http://www.php.net/manual/en/function.session-set-save-handler.php#81761

Yukarıdaki örnekte bir göz, o iyi bir çözüm vermiştir.

Maintaining your state across the domains.

  1. İlk benzersiz tanıtıcı oluşturun.
  2. Her sayfası erişimi okunur bir çerez oluşturabilirsiniz. Her sayfası erişim çerez tarayıcıdan sunucuya gönderilir.
  3. Yerine çerez başka bir yaklaşım istiyorsanız Ayrıca, sen oluşturmak her URL bir parçası olarak benzersiz bir tanımlayıcı iletebilirsiniz.

Update:

  1. Eğer crossdomain.xml sınırlandıran kullanıcılar yoluyla sağlandı olabilir ki bu daha güvenli yapmak istiyorsanız ilk önce, IP adresine dayalı uygulama kullanıcıları kısıtlamak gerekir.

  2. Siz kullanıcı onu kırar bile onu kullanamadı böylece oturum şifreleme içine bakmak gerekir. Veri özel anahtarları ile şifrelenir ve kamu birini kullanarak deşifre edilmelidir. El Sıkışma açık anahtarlar dayanmaktadır.

Burada içine bakmak ne:

  • Oturum kimliği yolunu ve etki alanını ayarlayın. Etki. Mastergaurav.com ise, kurabiye mastergaurav.com, www.mastergaurav.com, blogs.mastergaurav.com vb geri gönderilecektir
  • May be, instead of using session ID as cookie - if you have to really traverse multiple TLD domains - , make it a part of the URL for completely custom implementation:
    abcd.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>&domain=<your-domain>

Ben bu çözüm herhangi dezavantajları bakan eğer ben emin değilim. Daha iyi bir yolu var mı?

onun çok karmaşık - ve onun işe gitmiyor, örneğin REMOTE_PORT REMOTE_ADDR değişebilir, istekleri arasında değişecek.

Işleri işleme yolu oturumu yeniden olmadan en az 2 çok açıktır çözümleri var:

Bkz session_name() - 1) Her app oturumu için farklı bir çerez adı kullanmak

2) farklı bir alt dizindeki her bir uygulama var (örneğin, http://example.com/app1/, http://example.com/app2/, ...) ve çerez yolunu ayarlamak - session_set_cookie_params veya kullanım bakın session.cookie_path farklı ini ayar