PHP: $ _SESSION - $ _SESSION değişkeni geçici olarak kullanılan veri depolama artıları ve eksileri nelerdir

15 Cevap php

Ben son zamanlarda daha sık yapmaya başladım bir şey görevin başında retrieving some data olup and storing it in a $_SESSION['myDataForTheTask'].

Şimdi bunu yapmak için çok uygun görünüyor ama ben bu yaklaşımı kullanarak, performans, güvenlik riskleri veya benzeri hakkında hiçbir şey bilmiyorum. Düzenli olarak daha fazla uzmanlığa sahip programcılar tarafından yapılan ya da yapılacak bir amatör şey daha olduğunu şey mi?

For example:

if (!isset($_SESSION['dataentry']))
{
    $query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=" . mysql_real_escape_string($_GET['wave_id']);
    $result_taskinfo = $db->query($query_taskinfo);
    $row_taskinfo = $result_taskinfo->fetch_row();

        $dataentry = array("pcode" => $row_taskinfo[0], "modules" => $row_taskinfo[1], "data_id" => 0, "wavenum" => $row_taskinfo[2], "prequest" => FALSE, "highlight" => array());

        $_SESSION['dataentry'] = $dataentry;
}

Ben bir amatör böylece kodun diğer yönlerini yorum yapmaktan çekinmeyin değilim.

15 Cevap

Peki Session değişkenleri gerçekten bir istismar dışında (başka bunları düzenlemek için bir kullanıcı için gerçek bir yolu yoktur, ziyaretçinin web sitesinde olduğu süre boyunca bu değişkenlerin mevcut olmasının tek yolu (ve muhtemelen en verimli) biri sizin kodu veya PHP yorumlayıcı) bu yüzden oldukça güvenli.

Bir oturumun başında bir kez veritabanından ayarlarını okuyabilir ve bu oturumun tamamı için geçerli olduğu gibi, kullanıcı tarafından değiştirilebilir ayarları saklamak için iyi bir yoldur, sadece yapmanız gereken daha fazla veritabanı ararsa ayarları değişti ve size kod göstermek gibi tabii ki, bu ayarlar zaten mevcut olup olmadığını ya da veritabanından elde edilmesi gerekip gerekmediğini öğrenmek için Önemsiz edilir.

Ben (ookies kolaylıkla modifiye edilebilir ve bu çoğu durumda istenmeyen olacaktır beri) güvenli bir şekilde geçici değişkenleri depolamak başka bir şekilde düşünemiyorum yani $ _SESSION gitmek için yol olurdu

$ _SESSION Mekanizması çerezleri kullanıyor.

Firefox durumunda (ve belki de yeni IE, kendimi kontrol etmedi) anlamına gelir session is shared between opened tabs. Bu varsayılan olarak beklediğiniz bir şey değildir. Ve oturum artık "tek bir pencere / kullanıcı için özel bir şey" demektir.

Eğer ilk sekmesini kullanarak root olarak daha sitenize erişmek için iki sekme açılmış varsa Örneğin, sen diğeri root yetkileri kazanacaktır.

Bu e-posta istemcisi veya (e-dükkan gibi) başka bir şey kodlayacak, özellikle, gerçekten rahatsız edici. Bu durumda elle oturumları yönetmek veya URL sürekli rejenere anahtarı tanıtmak veya başka bir şey yapmak zorunda kalacaktır.

Nerede geçici veri depolamak için karar verirken dikkate almak isteyeceksiniz birkaç faktör vardır. Oturum depolama tek bir kullanıcıya özgü veriler için harika. Eğer varsayılan dosya tabanlı oturum saklama işleyicisi verimsiz bulursanız muhtemelen bir veritabanı veya backend memcache türünü kullanarak, başka bir şey uygulayabilirsiniz. session_set_save_handler daha fazla bilgi için bkz.

Ben bir kullanıcının oturumunda ortak veri depolamak için kötü bir uygulamadır bulmak. Sık sık birçok kullanıcı tarafından ve bu verileri gereken her kullanıcı için veri çoğaltarak olacak oturumda bu verileri depolamak tarafından erişilebilir olacak verilerini depolamak için daha iyi yerler vardır. Örnekte, bir kullanıcının oturumuna özellikle bağlı DEĞİLDİR (wave_id dayanarak) bu dalga veri depolama motoru farklı bir türünü ayarlayabilirsiniz. Bu şekilde aşağı bir kez veri çekme edeceğiz ve onları birkaç kullanıcıların başka çekme gerektirmeden verilere erişebilir bir yerde saklayın.

Ben kullanıcılar için bilgi saklamak için oturum değişkeni her zaman kullanabilirsiniz. Ben performansı ile herhangi bir sorun görmedim. (Çerezler kapalı varsa ya PHPSESSID) oturum verileri çerezine dayalı çekilir. Ben muhtemelen kullanıcıların çerez gerçek verileri depolamak daha güvenli başka bir çerez tabanlı kimlik daha bir güvenlik riski daha fazla olan, ve görmüyorum.

Just to let you know though, you do have a security issue with your SQL statement: "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".$_GET['wave_id'];

Sen NEVER, I REPEAT NEVER, kullanıcı sağlanan veri almak ve ilk sanitasyon olmadan bir SQL deyimini çalıştırmak için kullanmak gerekir. Ben tırnak içinde sarın ve işlevini eklemek "() mysql_real_escape_string" olacaktır. Yani çoğu saldırılarından sizi koruyacaktır. Yani çizgi gibi görünecektir:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id='".mysql_real_escape_string($_GET['wave_id'])."'";

Kendi sunucu üzerinde çalışan ediyorsanız, ya da hiç kimse sunucusundaki dosyaları / bellek snoop bir ortamda, oturum verileri güvenli. Onlar sunucuda depolanan konum ve sadece bir kimlik tanımlama istemciye gönderilir. Diğer insanlar elbette, çerez kapmak ve başkasının kimliğine bürünebilir eğer sorundur. HTTPS kullanarak ve URL'ler olarak oturum kimliği koymak değil emin bu sorunların en güvende kullanıcıların tutmalı. (XSS hala dikkatli değilseniz, çerezleri koparmada çok Jeef Atwoods post on this görmek için kullanılabilir.)

Bir oturum değişkeni saklamak için ne gelince, bir alışveriş sepeti gibi, başka bir sayfada tekrar başvurmak istiyorsanız oraya veri koymak, ancak bu sonuç üretmek için kullanılır sadece geçici veri eğer oraya koymayın anda görüntülenen yazı için etiket listesi gibi sayfa. Oturumlar kullanıcı başına kalıcı veri vardır.

Giriş doğrulama geliştirmek için başka bir yolu değişken ['wave_id'] _GET döküm için:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".(int)$_GET['wave_id']." LIMIT 1";

Ben wave_id bir tamsayı, ve tek bir cevap olduğunu varsayarak yaşıyorum.

Irade

$ _SESSION Ürün varsayılan olarak, disk üzerinde tutulur, bir oturumda, saklanır. Kendi dizi yapmak ve yaptığın gibi bir 'DataEntry' dizisi girişteki şeyler için gerek yoktur. Sadece böylece $ _SESSION ['pcode'], $ _SESSION ['modüller'] kullanabilirsiniz.

Dediğim gibi, oturum diskte depolanır ve oturuma bir işaretçi bir tanımlama saklanır. Kullanıcı böylece kolayca oturum verilerinin ulaşamıyoruz.

IMO, bu oturumda şeyleri saklamak için mükemmel kabul edilebilir. Bu veri kalıcı yapmak için harika bir yoldur. Bu, birçok durumda, aynı zamanda çerezleri her şeyi saklamak daha güvenlidir. İşte birkaç endişeleri vardır:

  • Birisi bir oturumu kaçırmak için mümkün, böylece kullanıcı yetkilendirme takip etmek için kullanmak için gidiyoruz eğer, dikkatli olun. this daha fazla bilgi için okuyun.
  • Bu verileri tutmak için çok tembel bir yol olabilir. Daha sonra bunun için sorgulamak zorunda kalmamak sadece oturumda her şeyi atmayın.
  • Eğer oturum sonraki isteği üzerine başlatıldığında ya da bir otomatik yükleyici yapılandırılmış olması gerekir önce kendi sınıf dosyaları dahil edilmesi gerekir, ya oturumda nesneleri saklamak için gidiyoruz.

Zend Framework bitiminden ve (captcha'lar gibi şeyler için) güvenlik ile olur oturum veri yönetimi için kullanışlı bir kütüphaneye sahiptir. Onlar da oturumları yararlı bir açıklama var. Bkz http://framework.zend.com/manual/en/zend.session.html

Ben çok yararlı olduğu oturumları bulundu, ancak dikkat edilmesi gereken bir kaç şey var:

1) Bu PHP sunucu üzerindeki diğer kullanıcılar tarafından erişilebilir olabilecek bir tmp klasörü veya başka bir dizinde oturumları saklayabilirsiniz. Sen oturumları php.ini dosyasına giderek saklanır edildi dizini değiştirebilirsiniz.

2) Eğer oturuma göndermeden önce verileri şifrelemek istiyorum, ve bunu kullanmak için şifresini olabilecek çok sıkı güvenlik ihtiyacı yüksek bir değer sistemi kuruyorsanız. Not: Bu trafik / sunucu kapasitesine bağlı olarak çok fazla yükü oluşturabilir.

3) I) 'in (yani session_destroy bulmuşlardır; hemen oturumu silmez, yine oturumlarını temizlemek için PHP çöp toplayıcısı için beklemek zorunda. Sen çöp toplayıcı php.ini dosyasında çalıştırılır frekansı değiştirebilirsiniz. Ama yine de çok güvenilir görünmüyor, daha fazla bilgi http://www.captain.at/howto-php-sessions.php

Bu nasıl REST ful düşünebilirsiniz?

yani "A Brief Introduction to REST" paragraf "statelessly iletişim" bakın ...

"REST mandates that state be either turned into resource state, or kept on the client. In other words, a server should not have to retain some sort of communication state for any of the clients it communicates with beyond a single request."

(Ya da için wikipedia üzerinde diğer herhangi bir bağlantıları REST)

Yani sizin durumunuzda, GET için mantıklı bir kaynak olduğunu 'wave_id', ama sen gerçekten OTURUM saklamak istiyorsunuz? Şüphesiz memcached çözüm nesne Kaynak önbellekleme için mi?

Oturumları kullanılmasının bir diğer birkaç dezavantajları:

  1. $_SESSION veri hareketsizlik * session.gc_maxlifetime * saniye sonra sona erecek.
  2. Siz oturum verileri kullanacak her komut için session_start() aramak için hatırlamak gerekir.
  3. Kullanıcı aynı sunucuya her zaman yönlendirilmiş olması gerekir, çünkü birden çok sunucu üzerinde yük dengelemesi ile web ölçekleme bir sorun olabilir. "Sticky Sessions" ile çözün.

Bu yaklaşım adil biraz kullanın, ben onunla herhangi bir sorun görmüyorum. Kurabiye aksine, veriler genellikle büyük bir hatadır istemci tarafında, saklanmaz.

Şey gibi olsa da, sadece her zaman SQL sorgusu bu değişkeni kullanarak daha o zaman, $ _SESSION değişkeni kullanıcı girişini koyarak, özellikle eğer kullanıcı girişi sterilize ediyoruz dikkatli olun.

Bunu yapmak için oldukça yaygın bir şeydir, ve oturumu genellikle sürekli veritabanı hitlerinden daha hızlı olacak. Onlar PHP Devs Session Kaçırma önlemek için çok çalışmış gibi, aynı zamanda oldukça güvenli konum.

Tek sorun bir şey değiştiğinde oturum girişini yeniden hatırlamak gerekiyor olmasıdır. Bir şey bu tuşa yenilemek için bir ihtiyaç neden olur oturumun sahibi olandan başka bir kullanıcı tarafından değiştirilebilir Ve eğer, bu oturum anahtarını yenilemek için sisteme bildirmek için kolay bir yolu yoktur. Muhtemelen büyük bir anlaşma değil, ama sen farkında olması gereken bir şey.

Bir kullanıcı sayfalarında aktif durumdayken gerçek php dosya veya sunucu sömürülen zayıf yönleri vardır olmadıkça bu nedenle zor hack, bilgi depolamak için bir sunucu tarafı yoldur beri $ _SESSION, güvenlik çok yararlıdır. Bir çok iyi bir uygulama kullanıcı oturum olduğunu onaylamak için bir değişken depolama ve sadece oturum teyit edilmesi durumunda alınacak önlemler izin veriyor