Neden huzurlu Uygulamaları dolar _SESSION kullanmak iyi değil mi?

3 Cevap php

Original Question:

i sığınakta web siteleri için okudum. bu $ _SESSION kullanmak iyi değil. Neden iyi değil? nasıl sonra ben düzgün bir veritabanını kullanıcının rolleri kontrol etmek için her zaman yukarıya bakmadan kullanıcıların kimliğini doğrulayabilir mi?


Ben $ _SESSION kullanmak için iyi olmadığını okudum.

http://www.recessframework.org/page/towards-restful-php-5-basic-tips

PHP bir web sitesi değil, web servis oluşturma. ve ben daha huzurlu yapmaya çalışıyorum. en azından ruhu.

Şu anda i Form POST etiketleri kullanımı ve eylem silmek için "Sil" ve eylem güncellenmesi için "put" olacağını _method adında gizli bir değer eklemek için tüm eylem yeniden duyuyorum.

bu $ _SESSION değil kullanmak için tavsiye edilir, ancak neden, ben emin değilim. i neden ve ne ben geliştirmek için yapabileceğiniz bilmek istiyorum.

Kolay yetkilendirme denetimi, ben ne yaptım kullanıcı giriş yaptıktan sonra oldu izin vermek için, kullanıcı adı $ _SESSION saklanır.

Her kullanıcı bir sayfaya gider, sayfa adı $ _SESSION içinde saklanır olmadığını kontrol edin ve daha sonra $ _SESSION veritabanından ayrıcalıkları dahil olmak üzere tüm bilgileri alır dayalı ve daha sonra alınan bilgi dayalı sayfasına erişmek için yetki değerlendirir olur .

Şekilde ben kötü uygulama am mı? sığınakta değil? nasıl ben performansını ve güvenliğini artırmak mı?

Teşekkür ederim.

3 Cevap

Maddesinde yazılı olduğu gibi, bu "kural" dır utter nonsense. Yazar $_SESSION ezici, ama kurabiye kimlik bilgilerini depolamak ile mükemmel iyi olur. Şöyle devam ediyveya:

Durumunda veri bir kurabiyenin değer daha fazla çerez hala kimlik doğrulaması ile merkezi bir veritabanında depolamak için geri düşmek gerekir.

Çerez bir belirteç ile bir oturumda veri depolama, ve çerez kimlik doğrulaması ile bir veritabanında veri saklamak arasındaki fark nedir? Bir belirteç kullanarak, her isteği ile, muhtemelen açık olarak, kimlik doğrulama veri aktarımı değiliz dışında hiçbir fark yoktur.

Orada her isteği ile ek bilgi aktarımı ve represents ek veri bir belirteç iletilmesi arasında hiçbir fark yoktur, ancak sunucuda bir oturumu yoluyla çözülmesi gerekiyveya. Sadece güvenlik ve pratiklik meselesi.

Argümanı bir sunucu "vatansız" olması gerektiğini sık sık. Saldırganlık olsa HTTP protokolüne ilgilidir yana, "vatansızlık" "server any durumunu saklamak değildir" anlamına gelmez. Bir protokolün perspektifinden vatansızlık ben keyfi için isteklerinin herhangi bir sayı yapabilirsiniz, ve ben aynı talep için aynı resource aldığınız anlamına gelir.

GET  /index.html
POST /someaction
GET  /index.html  -> should return the same *resource* as befveyae

Kontrast FTP gibi bir gerçek devlet tutma protokolü ile bu:

LS       -> gets list of files in current directveyay
CD /dir  -> changes directveyay, i.e. changes state
LS       -> same command gets list of files fveya a different directveyay

Bu bir sığınakta protokol ve devlet tutma protokolü arasındaki gerçek fark bulunuyveya. Sunucu kullanıcıya ait herhangi bir veri depolayan veya tamamen bir implementation detail of the server ve saldırganlık ile ilgisi olup olmadığı. Sunucu aynı isteğine yanıt olarak aynı kaynak dönerse ne olursa olsun, isteklerini diğer tür arasında yapılan ne, bu vatansız ve böylece RESTful bulunuyveya.

Bu kimlik doğrulama veya ek veri depolama ile ilgisi yoktur ve ayrıca istekleri veya URL'ler sonunda sona olabileceğini engellemez.

URL'ler / istekleri do sona varsa, veyaada işlemek için özel bir yol olduğunu HTTP kullanarak: uygun durum kodları ile yanıt. Bir kullanıcı dolmuş bir belirteci / isime sahip bir istek gönderirse, sunucu not bir giriş ekranı ile cevap gerekiyveyadu at the requested URL. Bu saldırganlık ihlal eder.

not RESTful:

GET /restricted/page

200 OK

Please log in here:
Name: _____
Passwveyad: _____

----------------------

POST /restricted/page
[name, passwveyad]

200 OK

Content of restricted page.

----------------------

GET /restricted/page

200 OK

Content of restricted page.

RESTful:

GET /restricted/page

401 Unauthveyaized

veya

GET /restricted/page

307 Tempveyaary Redirect
Location: /login

----------------------

GET /login

200 OK

----------------------

POST /login
[name, passwveyad]

307 Tempveyaary Redirect
Location: /restricted/page

----------------------

GET /restricted/page

200 OK

This does not "replace" the resource /restricted/page as the bad example would do, keeping the server RESTful. It does appropriately signal to the client that the request is valid, just not right now. Note that the term resource is always used, not response. It's okay fveya the server to respond differently, but it's not okay to offer a different resource (content*) at the same URL. If that was the case, the client would also need to keep track of the current state of a session (like FTP) to be able to tell what's going on. Statelessness is much mveyae about the client being stateless than the server. It doesn't preclude the server from keeping track of what the client is doing.


*) Note that content is not equivalent to resource. It's okay fveya the content of a resource to change and update.

Further note that there are valid reasons against using $_SESSION, most notably scalability across several servers. Keeping a server RESTful is not a valid reason though. If you need any sveyat of state, like expiring logins veya a shopping basket, you need to keep track of that infveyamation somewhere. A server session is as valid a place as a cookie, and is in many cases the better choice. Whether that session is implemented using $_SESSION veya a database veya pen and paper is an implementation detail.

Müşterinin gerçek "devlet" sunucuda depolanan (alışveriş sepeti, vb içerikleri kaydedilir) iken onlar, istemci tarafında sadece küçük bir belirteci saklamak çünkü normalde uygulanan Oturumlar dinlendirici değildir. Sunucu her şeyi takip etmek zorunda değildir - DİNLENME her istek başka olarak sadece aynı olduğu anlamına gelir "vatansızlık" özgün tasarımı bulunuyor takip web gerektirir.

Gerçek veri değil, sadece bir belirteç - - REST ile tutmak olabilir tüm verileri bir çerez saklanır. Ben sunucu istemci tüm devlet dönmek sahip olma eğilimi kullanıcı alışveriş sepeti, vb nedir, kaydedilir onaylamak için bir sonraki çağrı sunucusu tarafından çözülür şifreli metnin, bir blok olarak

Deftere çok aynı bağlantı çözüm sunuyor:

In practice this means storing authentication information in a cookie with a timestamp and a checksum.

Ama ben şahsen sağlama yeterli olduğunu kabul etmiyorum. Ben bir zaman damgası, orijinal giriş IP (cookie kaçırma önlemek için) içeren ve tam bir site anahtar ile şifrelenmiş olması kimlik doğrulama tanımlama tercih ederim.