AJAX istekleri PHP Oturum bilgilerini tutar mı?


154

Sitemde oturum açmış, kimliğini saklamış bir kullanıcı olsaydı $_SESSIONve tarayıcısından sunucuya AJAX isteği yapacak bir 'Kaydet' düğmesine tıkladı. Onun olacak$_SESSION ve çerezleri bu istekte saklanacak ve içinde bulunan kimliğe güvenle güvenebilir miyim $_SESSION?

Yanıtlar:


191

Cevap Evet:

Oturumlar sunucu tarafında tutulur. Sunucu ile ilgili olarak, AJAX isteği ile normal sayfa isteği arasında bir fark yoktur. Her ikisi de HTTP isteğidir ve her ikisi de başlıkta aynı şekilde çerez bilgileri içerir.

İstemci tarafından, aynı çerezler, düzenli bir istek veya AJAX isteği olsun, sunucuya her zaman gönderilir. Javascript kodunun özel bir şey yapmasına gerek yoktur, hatta bu durumun farkında olmak için, sadece normal isteklerde olduğu gibi çalışır.


10
Takip: sunucu HttpOnlybir çerez ayarlarken bir bayrak ayarlayabilir, bu da Javascript'inizin çerezi göremeyeceği anlamına gelir. Ancak çerez olacak hala AJAX ve düzenli sayfa istekleri ikisi için gönderilecek ve tam olarak işe aynı devam ediyor. Javascriptiniz bunu görmeyecek document.cookie.
thomasrutter

PHP hata bildirimi açıksa, AJAX yanıtıyla döndürülen bir oturum hatası alabilirsiniz. Warning: session_write_close(): Failed to write session data (user)Son zamanlarda bir projede zaman zaman hata alıyorum , ancak yalnızca sayfanın geri kalanının yüklenmesi sırasında AJAX isteği gerçekleştiğinde. Oturum verileri için bir MySQL DB kullanıyorum ve ana sayfa isteği AJAX isteğinin erişmesini önleyerek, bu tablo kilitleme olmasıdır.
Buttle Butkus

@ButtleButkus, sunucu tarafı kodunuzda bir sorun gibi görünüyor ve eminim insanlar bunu kendi sorusu olarak gönderirseniz yardımcı olmaya istekli olacaklardır. Bu hatayı, oturumlar için MySQL kullandığınız için bir hata ile başarısız olacak şekilde kilitlememesi gerektiği için almamanız gerekir. MySQL bağlantılarının doygun olması veya başka bir ilgisiz sorun olabilir.
thomasrutter

Bir vagrant makinede oluyor, bu yüzden MySQL bağlantıları doymuş olmalı. Yakında çözemezsem kesinlikle bir soru gönderirim.
Buttle Butkus

23

PHP dosyasında AJAX istekleri varsa session_start()oturum bilgileri korunur. (isteklerin engellenmesi aynı alan içindedir)


2
gerçekten, ben yapmayı unuttum :-)
sivann

23

Gerçekten ne elde edersiniz: AJAX isteği ile çerezler gönderiliyor mu? AJAX isteğinin aynı etki alanına (veya çerezin etki alanı kısıtlamaları dahilinde) ait olduğunu varsayarsak, cevap evettir. Böylece aynı sunucuya AJAX istekleri aynı oturum bilgilerini korur (çağrılan komut dosyalarının oturum bilgilerine erişmek isteyen diğer PHP komut dosyalarına göre bir session_start () oluşturduğu varsayılarak).


1
Yanlış olabilirim, ama diğer alanlara (alt alan adları hariç) ajax istekleri göndermenin bile mümkün olmadığını düşündüm?
Emil H

Dinamik kod hile ile hile yapabilirsiniz. Yine de hiç yormadım.
cletus

1
Evet, diğer alanlara ajax istekleri yapılamaz. Bununla birlikte, sayfaya dinamik olarak bir <script> etiketi ekleyebilir ve src'sini, javascript'i yansıtan bir alan dışı URL'ye ayarlayabilirsiniz.
Click

1
ajax istekleri diğer alan adlarına yapılamaz. ancak php kodunuzda bir proxy oluşturabilirsiniz. proxy'ye ajax isteği, diğer etki alanına proxy isteği.
Peter Long

2
Sadece bir not ... ajax istekleri etki alanları arası yapılabilir, ancak yalnızca yanıt türü jsonp ise. Bunu her zaman yaparım.
Epiphany

8

Her zaman değil. Çerezleri kullanarak iyisiniz. Ancak "mevcut kimliğe güvenli bir şekilde güvenebilir miyim?" Tartışmayı önemli bir nokta ile genişletmeye çağırdı (çoğunlukla referans olarak, bu sayfanın ziyaretçi sayısı oldukça yüksek göründüğü için).

PHP, oturumları çerezler yerine URL yeniden yazma yoluyla sürdürecek şekilde yapılandırılabilir. ( Ne kadar iyi veya kötü (<- örneğin en üste bakınız) ayrı bir soru , şimdi sadece bir yan notla şu anki soruya bakalım: URL tabanlı oturumlarda en belirgin sorun - açık Çıplak oturum kimliğinin görünürlüğü - dahili Ajax çağrılarıyla ilgili bir sorun değildir; ancak sonra, Ajax için açıksa, sitenin geri kalanı için de açılır, bu yüzden orada ...)

URL yeniden yazma (cookieless) oturumlarında, Ajax çağrıları , istek URL'lerinin düzgün bir şekilde hazırlandığına dikkat etmelidir . (Ya da kendi özel çözümünüzü oluşturabilirsiniz. İstemci tarafında , daha az talepkar durumlarda oturumların sürdürülmesine bile başvurabilirsiniz .) Buradaki nokta, çerezleri kullanmıyorsa oturum sürekliliği için gereken açık bakımdır :

  1. Ajax sadece ararsa özü URL'ler (PHP alınan gibi) HTML kelimesi kelimesine zaten pişer gibi, yani sorun olmaz (umm, cookified).

  2. İstek URI'lerini kendileri bir araya getirmeleri gerekiyorsa , oturum kimliğinin URL'ye manuel olarak eklenmesi gerekir. ( Nasıl yapıldığını görmek için burayı veya PHP tarafından oluşturulan sayfa kaynaklarını ( URL yeniden yazma açıkken ) kontrol edin.)


Gönderen OWASP.org :

Etkili bir şekilde, web uygulaması hem mekanizmaları, çerezleri hem de URL parametrelerini kullanabilir veya hatta belirli koşullar karşılanırsa (örneğin, çerez desteği olmayan web istemcilerinin varlığı veya çerezler karşılanmadığında) birinden diğerine geçebilir (otomatik URL yeniden yazma) kullanıcının gizlilik endişeleri nedeniyle kabul edilir).

Bir itibaren Yakut-forum sonrası:

Php çerezleri ile kullanıldığında, oturum kimliği Ajax XMLHttpRequests için bile istek başlıklarına otomatik olarak gönderilir. URL tabanlı php oturumlarını kullanır veya bunlara izin verirseniz, oturum kimliğini her Ajax istek URL'sine eklemeniz gerekir.


Oturum çerezlerini kaç kişinin devre dışı bıraktığına dair güvenilir istatistikler var mı? (Ben hiç bulamadım. Sadece Javascript'te: ABD / Avrupa'da yaklaşık% 2 ve ~% 1.2 dünya ortalaması gibi görünüyor.)
Sz.

URL'deki oturum kimlikleri eski, güvenli olmayan bir uygulamadır. Bugünkü web'de, hiç kimse çerezleri devre dışı bırakarak sörf yapabileceklerini ve hesap sahibi oldukları web sitelerine giriş yapabileceğini düşünmemelidir. Ziyaretçilerinizden birinde çerezler devre dışı bırakılmışsa, muhtemelen a) gizlilik nedeniyle herhangi bir sitede oturum açmak istemediklerini; veya b) bunu yanlışlıkla yaptılar ve şimdi yalnızca sitenize değil, herhangi bir siteye giriş yapamıyorlar.
thomasrutter

3

AJAX isteklerinin oturum tutmasını istemek çok önemlidir. En kolay örnek, yönetici paneli için bir AJAX isteği yapmaya çalıştığınızdır. Tabii ki, yönetici oturum açtıktan sonra oturumunuz olmayan başkaları tarafından erişilemeyecek şekilde, istekte bulunduğunuz sayfayı koruyacaksınız. Mantıklı?


0

Özellikle bir çerçeve kullanıyorsanız, dikkat edilmesi gereken bir şey, uygulamanın istekler arasında oturum kimliklerini yeniden oluşturup oluşturmadığını kontrol etmektir. oturum etkilenmeyecektir.

Uygulama bu şekilde oturum kimliklerini yeniden oluşturuyorsa, geçerli bir ajax isteğinin istekte bulunan sayfadaki oturum kimliğini geçersiz kıldığı / değiştirdiği bir durumla karşılaşabilirsiniz.


0

Çerçeveler bunu yapar; örneğin, Ön Denetleyici veya boostrap komut dosyasında oturumu başlatırsanız, sayfa denetleyicileri veya ajax denetleyicileri için başlatılmasını önemsemeniz gerekmez. PHP çerçeveleri her derde deva değildir, ancak böyle birçok yararlı şey yaparlar!


0

ajax isteğini kabul eden tüm sunucu tarafı sayfalarında session () yetkinizi koyun:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

bu benim şimdiye kadar yaptığım tek yolla ilgili.

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.