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.