Oturum değişkenlerinden kaçınılmalı mıdır?


36

Geçmişte oturum değişkenlerine çok güveniyordum, ancak son zamanlarda sorgu dizesi parametreleri gibi şeyleri kullanmanın gereksiz olduğunu gördüm.

Bir meslektaşım oturum değişkenlerini kullanmayı reddediyor. Bu gerçekçi bir amaç mıdır ve pratik sebeplerden dolayı oturum değişkenlerinden kaçınılmalı mıdır? Oturum değişkenlerinden tamamen kaçınılabilir mi (oturum açma izni veren oturum çerezleri hariç) ve bu daha iyi tasarımlarla sonuçlanabilir mi?

Meslektaşımın bunları kullanmamasının sebeplerinden bazıları:

  • Oturum değişkenlerinin türsüz yapısı
  • Oturum zaman aşımına uğradı devlet kaybına neden
  • Oturum değişkenlerinin global kapsamı
  • Dengeleme sunucularını oturumlarını kaybetme yüklüyor (Net mi?
  • Uygulama havuzları / sunucuları yeniden başlatılıyor
  • Gereksiz

3
using things like query string parameters instead- Bu durumda, mümkünse her zaman sorgu dizesi parametrelerini kullanın. Bu tür parametre için oturumu kullanmak kırılgandır ve kullanıcılar birden fazla sekme açık olduğunda garip hatalara neden olabilir.
Izkata

2
kişisel öneri - ne hakkında konuştuğunu açıkça bilmediği için meslektaşınızdan tavsiye almayın. Oturum zaman aşımına uğradı mı? Oturum sürelerinin web uygulaması tarafından kontrol edildiğini bilmiyor mu?
GrandmasterB

2
@GrandmasterB Ahem. Ne yaptıklarını bilmiyorlar ya da bu mermi noktalarının her biri tarafından kariyerleri boyunca yakıldılar (kendim yaklaşık 4 kişiyi vurdum) ve geçici durumla başa çıkmanın daha uygun yollarını biliyorlar.
Ed James,

Birisi lütfen oturum durumu ile birden fazla sekme açmak arasındaki ilişkiyi açıklayabilir mi? Yeni bir sekme açtığınızda, önceki sekmedeki durumu içeriyor mu, yoksa şimdi içeriyor mu? Teşekkürler.
Ray

Yanıtlar:


41

Uygulamanızda bir oturum değişkeni varsa, kendinize şunu sorun:

Tarayıcımın geri düğmesine tıkladığımda, değişkenimin hangi değere sahip olmasını istiyorum?

Cevap "mevcut değer" ise, oturum değişkenleri yararlı olabilir. Bir örnek, bir alışveriş sepeti olacaktır: tarihe geri döndüğünüzde alışveriş sepetinden şeylerin kaldırılmasını beklemiyorsunuz. Her zaman şu anki durumunda.

Cevap "önceki bir değer" ise, oturum değişkenlerini kullanmamalısınız. Gördüğüm kötü kullanımlar, sayfalar arasında bir parametre geçirmeyi içerir. Bir sayfaya geri dönmek için geri düğmesine tıklarsam, sayfa mutlaka doğru parametreyi almaz. Ayrıca, iki sekme açarsam, sitem nasıl davranacak?

Geri düğmesi davranışını doğru yapmak, her şeyden önce sonuçta olmak değildir, ancak bir web sitesini vatansız bir uygulama olarak düşünmenize yardımcı olur. Genelde, oturum değişkenlerinin uygun kullanımlarını az ve uzak arasında buluyorum.


Katılıyorum. İstenen semantikleri çoklu sekmelerle düşündüğünüzde, genellikle oturum değişkenleri veya istek parametreleri doğru seçim ise ortaya çıkar.
CodesInChaos,

Bu tür hataları tam olarak oturum değişkenleriyle gördüm ve kuşkusuz zor yoldan öğrendim.
Tjaart

Bir kullanıcı geri düğmesine bastığında, oturum süresi sona erinceye kadar eşyaların alışveriş sepetinde kalmasını mı bekliyor yoksa öğeler tükenene kadar kalmasını mı istiyor? Başka bir kalıcılık mekanizması (bir veritabanı gibi) kullanmak, tek oturumun ötesinde kalıcılık sağlar ve geri düğmeniz kullanıcının beklediği gibi çalışır.
Lawtonfogle

25

HTTP protokolü durumsuzdur. Oturumlar, istemci durumunu HTTP istekleri arasında korumanın bir yoludur. Bunu bir platformun yerleşik oturum işlemesiyle yapmayı veya sorgu dizesi parametreleriyle kendiniz yapmayı seçebilirsiniz. Her iki durumda da bir oturumun bazı kavramı birçok görev için gereklidir.

Meslektaşınız muhtemelen belirli bir uygulamadan hoşlanmıyor veya oturumları amaçlarına uygun olarak kullanmıyor. HTTP istekleri arasında belirli bir müşteri bağlantısıyla ilgili bilgileri korumanız gerekirse, bir tür oturum kalıcılığı gerekir.

Aşağıdaki konular uygulamaya özeldir:

Oturum değişkenlerinin türsüz yapısı

Oturum değişkenlerinin global kapsamı

Dengeleme sunucularını oturumlarını kaybetme yükü

Uygulama havuzları / sunucuları yeniden başlatılıyor

Örneğin, en sık PHP'de çalışıyorum ve oturum bilgilerimi ilişkisel bir veritabanında saklıyorum. Bu yüzden oturum değişkenlerim yazıldı. Yük dengeleme ve sunucu yeniden başlatmaları herhangi bir oturum sorununa neden olmaz.

Bu daha ilginç:

Oturum zaman aşımına uğradı devlet kaybına neden

Seanslar çoğunlukla çerezlerle korunur. Bunlar müşteri tarafından herhangi bir zamanda silinebilir. Ancak bir sorgu dizesi parametresi ile de korunabilirler ve bu nedenle istemcide asla zaman aşımına uğramazlar. Sunucu zaman aşımı size kalmış. Bu yüzden bile bu konu uygulamaya özeldir.

Belirli bir uygulamayı sevmediğimiz için bütün oturum konseptini atmayalım. Herhangi bir iyi web uygulama çerçevesi, kullanıcı girişlerini korumak veya kullanıcının mevcut ziyaretine özgü herhangi bir şeyi saklamak için oturumların uygun şekilde kullanılmasını kolaylaştıracaktır. Bir kullanıcının veritabanı kaydı, oturum açtıklarında kendilerine özgü şeyleri saklamak için kullanılabilir (ve gerekir). Ancak, anonim ziyaretçiler, ziyaret ettikleri sayfaların kısa bir listesi veya tercih edilenlerin tercihleri ​​gibi, oturumlarında korunmaya değer geçici bilgiler içerebilir. daha önce gördükleri bir bildirimi gizle. Genellikle yalnızca daha küçük geçici bilgiler oturum depolaması için uygundur.


Dürüst olmak gerekirse. Net'in yanı sıra çerçevelerle sınırlı bir deneyimim oldu. .Net, oturumlarınız için zaman aşımı değerini zorlamaktan kaçınır. Oturum değişkenleri, ayrıca yazılmamış bir sözlük olarak sunucu tarafı koduna da çıkar. Genelde bu sözlüğü zaten düzgün bir şekilde yazılan sınıflara ekliyorum, bu yüzden de bunu bir problem olarak görmüyorum. Oturum bilgilerinizi veritabanında sakladığınızdan bahsettiniz. ASP.Net'te, depolama işlemi .Net istemcisinde, veritabanında (otomatik olarak yönetilir) veya ayrı bir Windows hizmetinde aksi durumda ele alınır.
Tjaart

Oturumlar için amaçlanan bazı örnekler verebilir misiniz?
Tjaart

@Tjaart: Son paragrafı biraz genişlettim. Umarım yardımcı olur.
Matt S

14

Diğerleri (tekrar etmekten kaçınacağım) birçok iyi noktaya değindi, ancak arkadaşınızın tekniğinin henüz tartışılmamış bir yönü var: güvenlik .

Şifreye bakmadan ne tür güvenlik açıkları açtığınızı bilmek imkansız, ancak işte kafamın üstünde düşünebileceğim birkaç şey.

  • Oturum sabitlemesi : Kullanıcının URL’de zaten gerekli bilgilere sahip bir bağlantıyı tıklatmasını (kullanıcının çerezlerini uygun şekilde ayarlanmış bir makine kullanmasını sağlamak yerine) tıklatmanız durumunda biraz daha kolay olan güçlü bir saldırı.
  • SQL enjeksiyonu (veya başka bir zararlı giriş) : Asla kullanıcıdan gelen hiçbir şeye güvenmeyin. Oturum değişkenleri, sunucuyu asla terk etmeme avantajına sahiptir, dolayısıyla kullanıcı bunları doğrudan değiştiremez. Eğer koyarak önce verileri sterilize gerekirken içine oturumda, her zaman sonradan çıkmak değerleri güvenebilirsiniz. Sorgu dizgisinde her şey iletilirse, kötü amaçlı girdiyi kabul etmediğinizden emin olmak için yapmanız gereken bir sürü onaylama hakkınız vardır.
  • Sahte girdiler kullanarak verileri bozma : SQL enjeksiyonuna benzer şekilde, ne kadar ileri ve geri veri aktarıyorsunuz? Ne kadar önemli? Sorgu dizesindeki bir değeri değiştirerek uygulamanızın davranışını değiştirebilir miyim? Değerleri değiştirerek sunucunuzdaki verileri bozabilir miyim? Sunucudaki verileri bozmayı başarırsam, diğer kullanıcıları etkiler mi? (Cevabınız "hayır" ise, cevabım " emin misiniz? Kontrol etmeniz gereken birçok yeriniz var.").

Bunların hepsi Oturumları kullanırken hala gerçekleşebilir, ancak arkadaşınız ne yaptığını bilmiyorsa, daha kolay bir hale gelebilir .


2

Oturum değişkenleri bir dereceye kadar eski Temel küresel değişkenler gibidir. Yükü takip etmek, kullanıcının içinde ne olduğunu, kapsamını ve nasıl kullanıldığını takip etmek; sadece BASIC'in eski versiyonlarında olduğu gibi. Bununla birlikte, birisi programlama modelinin (ASP, MVC vb.) Ayrılmaz ve çok önemli bir parçası olarak açıkça tasarlanan bir mekanizmanın kullanılmasını neden tamamen indirgeyecek?

Session değişkenlerini kullanırken karşılaştığım tek kötü şey, onları takip etmenin, relavent verilerle doldurulduğundan ve onları elden çıkardıklarından emin olmanın yükünü üzerinize koymasıdır.

Herhangi bir şekilde programlama yaparken yaptığımız şey bu değil mi?


1

Meslektaşım gibi, oturum değişkenleriyle ilgili hata ayıklama sorunlarımı yaşadığım, çünkü benim açımdan gerçekten beceriksiz olan bazı şeyler yüzünden düşünürdüm. Evet, sorgu dizelerini, formlardaki gizli alanları ve diğer şeyleri kullanarak oturum değişkenleri olmadan bir dereceye kadar alabilirsiniz. Ancak, uygulamanızın durumu belirlemek için en temel mantık akışının ötesinde bir şey varsa, bu şekilde yapılması çok çabuk zahmete girer. Ayrıca, uygulamanızın iç işleyişini, herhangi biri saldırı vektörü olarak kullanılabilecek sorgu dizeleri ve gizli alanlar aracılığıyla göstermenin güvenlik riski de vardır.

Oturum değişkenleriyle çalışırken, uygulamanın mantık akışını belirleyeceğinden, ne zaman ayarlandıkları ve ayarlanmadıklarını takip etmeniz yeterli olacaktır. C gibi bir dilde hafıza yönetimi gibidir.

Bunun sadece PHP ile çerçevesiz göreceli olarak küçük bir projede çalışma deneyimimden kaynaklandığını, başka platformlarda da durumların farklı olabileceğini ama genel prensibin hala geçerli olduğunu düşünüyorum.


2
Kontrol akışınıza dahil olan durum için oturumları kullanırken çoklu sekme anlambilimini nasıl elde edersiniz? Oturumlar, giriş yapma ve özellikler gibi ayarlar için iyi çalışır, ancak diğer birçok kullanım için doğru semantiği yoktur.
KodlarInChaos

Gönderdiğim içerik PHP / MySQL'de veritabanı tabanlı bir web uygulaması oluşturma konusunda sınırlı bir deneyime dayanıyordu. Tarayıcılarda bulunan birden fazla sekme tipik olarak nasıl işlenir (bence bunu kastediyorsunuzdur)?
primehunter326

@ primehunter326 Rota params veya sorgu dizeleri veya gizli form alanları ile.
Casey,

0

Daha önce belirtildiği gibi HTTP, Vatansızlık ve Oturum Değişkenidir. HTTP tasarımının vatansız olması, kaynakların önbelleğe alınmasına yardımcı olur. Halka açık kaynaklar için.

Oturum değişkeni olmayan bir web sitesi tasarlamak mümkündür, ancak daha zordur. En zoru (IMHO) süslü giriş / çıkış, HTTP kimlik doğrulama şemaları, bir HTML formu aracılığıyla kimlik doğrulaması yapmak için gereken araçları sağlamaz (javascript - XHR - https: // untel: passowrd@mydomain.com ) Çıkış yapmak ve tarayıcılar arası uyumlu olmak daha da zor. Bu konuda w3 posta gönderme listelerinde bazı tartışmalar oldu ancak doğru hatırlıyorsam bu fikir reddedildi.

Gerisi için, Oturum değişkenleri olmadan yaşayabilmeniz gerekir. Bir veritabanında, dosyalarda veya herhangi bir yerde bir miktar duruma sahip olacaksınız, ancak Oturum değişkenleri için kullanımı nadir olmalıdır.

Kullanıcınızın bir alışveriş sepeti varsa, yalnızca alışveriş sepetini paylaşmadan iki bilgisayara / tarayıcıya göz atması gerekiyorsa değişken bir oturumdur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.