PHP 8.4.1 Released!

Oturum Yönetiminin Temelleri

Oturum Güvenliği

Oturum modülü bir oturumda saklanan verinin sadece oturumun kullanıcısı tarafından görüldüğünü garanti edemez. Oturumun bütünlüğünü etkin olarak korumak için oturumun önemine bağlı olarak ek tedbirler alınması gerekir.

Oturumlarınız tarafından taşınan verinin önemine ve konuşlandırdığınız ek korumalara bağlı olarak ki, bunun bir fiyatı vardır, kullanıcının rahatı azalır. Örneğin, kullanıcılarınızı basit sosyal mühendislik taktiklerinden korumak için session.use_only_cookies yönergesi etkin kılınmalıdır. Bu durumda, çerezler kullanıcı tarafında koşulsuz olarak etkin kılınmalıdır yoksa oturum çalışmayacaktır.

Bir mevcut oturum kimliğinin üçüncü şahıslara ifşa olmasının çeşitli yolları vardır. Örneğin, JavaScript zerkleri, URL'lerdeki oturum kimlikleri, paket koklama, cihaza fiziksel erişim vb. İfşa edilmiş bir oturum kimliği, üçüncü tarafın o kimlik ile ilişkilendirilmiş tüm özkaynaklara erişmesini mümkün kılar. İlk olarak oturum kimliğini taşıyan URL'ler ifşa olur. Harici bir siteye bir bağ verilirse oturum kimliğini içeren URL, harici sitenin günlük kayıtlarına geçebilir. İkinci olarak, daha etkin bir saldırgan ağ trafiğini dinleyebilir. Eğer şifreleme yapılmıyorsa oturum kimlikleri ağ üzerinden salt metin olarak akacaktır. Bu noktada çözüm, sunucunuzun SSL bağlantılar kurmasını sağlamak ve bunu kullanıcılarınız için zorunlu kılmaktır. Güvenliği arttırmak için HSTS kullanılmalıdır.

Bilginize: HTTPS bile gizli verileri her zaman koruyamaz. Örneğin, CRIME ve Beast güvenlik açıkları, bir saldırganın verileri okumasını sağlayabilir. Ayrıca, birçok ağın denetim amacıyla HTTPS MITM vekilleri kullandığı unutulmamalıdır. Saldırganlar da böyle bir vekil sunucu kurabilir.

Uyumsuz Oturum Yönetimi

PHP'nin oturum yöneticisi şu anda öntanımlı olarak uyarlanabilir durumdadır. Uyarlanabilir bir oturum yöneticisi ek riskler içerir.

session.use_strict_mode etkin olduğunda ve oturum kayıt işleyicisi destekliyorsa, ilklendirilmemiş bir oturum kimliği reddedilir ve yenisi oluşturulur. Bu, kullanıcıyı bilinen bir oturum kimliğini kullanmaya zorlayan bir saldırıyı engeller. Bir saldırgan bağlantıları kopyalayabilir ve oturum kimliği içeren bağlantıları epostalarda yollayabilir. Örneğin, http://example.com/page.php?PHPSESSID=123456789 eğer session.use_trans_sid etkinse, kurban, saldırgan tarafından sağlanan oturum kimliğini kullanarak bir oturum başlatacaktır. session.use_strict_mode bu riski azaltır.

Uyarı

Kullanıcı tanımlı kayıt işleyicileri, oturum kimliği doğrulaması uygulayarak katı oturum kipini destekleyebilir. Tüm kullanıcı tanımlı kayıt işleyicileri, oturum kimliği doğrulamasını gerçeklemelidir.

Oturum kimliği çerezine domain, path, httponly, secure ve PHP 7.3 ve sonrasında SameSite öznitelikleri atanabilir. Tarayıcılarda tanımlı öncelikler vardır. Öncelik kullanarak bir saldırganın kalıcı olarak kullanılabilecek oturum kimliği ataması mümkündür. session.use_only_cookies kullanımı bu sorunu çözümlemez. session.use_strict_mode bu riski azaltır. session.use_strict_mode=On ile ilklendirilmemiş bir oturum kimliği reddedilir.

Bilginize: session.use_strict_mode uyarlanabilir oturum yönetimi riskini azaltsa da, bir saldırgan yine de kullanıcıyı ilklendirilmemiş bir oturum kimliğini kullanmaya zorlayabilir; böyle bir oturum kimliği saldırgan tarafından JavaScript zerki ile oluşturulabilir. Bu saldırının riskleri bu kılavuzun tavsiyelerine uyularak azaltılabilir. Bu kılavuzu izleyerek, geliştiriciler, session.use_strict_mode yönergesini etkin kılmalı, zaman damgalı oturum yönetimi kullanmalı ve tavsiye edilen yordamlarla session_regenerate_id() kullanarak oturum kimliklerini yeniden üretmelidir. Geliştirici yukarıdakilerin tümünü uyguladığı takdirde saldırgan üretimi oturum kimliği silinecektir. Eski oturuma erişim gerçekleştiğinde, bu bilgiler, müteakip bir soruşturma için geçerli olacağından, geliştiriciler kullanıcının tüm etkin oturum verilerini kaydetmelidir. Kullanıcının tüm oturumları zorla kapatılmalı ve yeniden kimlik doğrulaması yapması istenmelidir. Bu, saldırganların çalınan oturumları kötü amaçlarla kullanmasını engeller.

Uyarı

Eski oturuma erişim, mutlaka bir saldırı anlamına gelmez. Kararsız bir ağ ve/veya etkin oturumun derhal silinmesi, meşru kullanıcıların eski oturumlarını kullanmasına sebep olacaktır.

PHP 7.1.0 ve sonrası için, session_create_id() eklendi. Bu işlev, bir kullanıcının oturum kimliklerinin önüne kullanıcı kimliği eklenerek tüm etkin oturumlarına verimli bir şekilde erişmek için çalıştırılabilir. session.use_strict_mode'u etkinleştirmek bu gerçeklenim için çok önemlidir. Aksi takdirde, kötü niyetli kullanıcılar diğer kullanıcılar için kötü amaçlı bir oturum kimliği atayabilir.

Bilginize: PHP 7.1.0 öncesinde gelitiriciler yeni bir oturum kimliği üretmek için /dev/urandom gibi CSPRNG veya aş işlevlerini ve random_bytes() işlevini kullanmalıdır. session_create_id() çakışma algılama özelliğine sahiptir ve oturumun INI ayarlarına göre bir oturum kimliği üretir.

Oturum Kimliğinin Yeniden Üretilmesi

session.use_strict_mode iyi bir acı azaltıcıdır ancak yetersizdir. Geliştiriciler oturum güvenliğini sağlamak için aynı zamanda session_regenerate_id() işlevini de kullanmalıdır.

Oturum kimliğinin yenilenmesi oturum kimliklerinin çalınma riskini azaltır, bu bakımdan session_regenerate_id() belirli aralıklarla sürekli çağrılmalıdır. Örneğin, güvenlik açısından hassas içerik için oturum kimliği her 15 dakikada bir yeniden oluşturulmalıdır. Bir oturum kimliğinin çalınması durumunda bile, hem meşru kullanıcının hem de saldırganın oturumu sona erecektir. Başka bir deyişle, kullanıcı veya saldırgan tarafından erişim, eski bir oturuma erişim hatası üretecektir.

Oturum kimlikleri, kullanıcı ayrıcalıkları yükseltildiğinde, kimlik doğrulamasından sonra yapıldığı gibi yeniden oluşturulmalıdır. Kimlik doğrulama bilgisi $_SESSION dizisine atamadan önce session_regenerate_id() çağrılmalıdır. (PHP 7.0.0'dan itibaren, session_regenerate_id(), zaman damgasını/ve benzerlerini geçerli oturuma kaydetmek için mevcut oturum verilerini otomatik olarak kaydeder.) Yalnızca yeni oturumun doğrulanmış bayrağı içerdiğinden emin olunmalıdır.

Geliştiriciler, session.gc_maxlifetime değerine göre oturum kimliğinin süresinin dolmasına güvenmemelidir. Saldırganlar, süresinin dolmasını önlemek ve kimliği doğrulanmış bir oturum da dahil olmak üzere oturumu kullanmaya devam edebilmek için bir kurbanın oturum kimliğine düzenli aralıklarla erişebilir.

Bunun yerine, geliştiricilerin zaman damgasına dayalı oturum verisi yönetimini gerçeklemesi gerekir.

Uyarı

Oturum yöneticisi zaman damgalarını şeffaf bir şekilde yönetebilse de bu özellik uygulanmaz. Eski oturum verileri çöp toplayıcıya gidene kadar saklanmalıdır. Aynı zamanda, geliştiriciler, eski oturum verilerinin silindiğinden emin olmalıdır. Ancak geliştiriciler, etkin oturum verilerini hemen silmemelidir. Yani session_regenerate_id(true); ve session_destroy() etkin bir oturum için asla birlikte çağrılmamalıdır. Bu çelişkili gelebilir, ancak bu zorunlu bir gerekliliktir.

session_regenerate_id() öntanımlı olarak eski oturumları silmez. Eski kimliği doğrulanmış oturumlar kullanım için mevcut olabilir. Geliştiriciler, eski oturumların herkes tarafından tüketilmesini engellemeli, zaman damgalarını kullanarak eski oturum verilerine kendi başlarına erişimi yasaklamalıdır.

Uyarı

Etkin bir oturumun aniden kaldırılması istenmeyen yan etkilere neden olur. Sunucuya eşzamanlı bağlantılar olduğunda ve/veya ağ kararsız olduğunda oturumlar kaybedilebilir.

Etkin oturumların aniden kaldırılmasıyla olası bir kötü amaçlı erişim tespit edilemez.

Geliştiriciler, güncel olmayan oturumları hemen silmek yerine, $_SESSION'da kısa süreli bir zaman aşımı (bir zaman damgası) belirlemeli ve kulanıcıların oturum verilerine kendi başlarına erişmesi engellenmelidir.

Geliştiriciler, session_regenerate_id() işleminin hemen ardından eski oturum verilerine erişimi yasaklamamalı, daha sonraki bir aşamada yasaklamalıdır. Örneğin. kablolu ağ gibi kararlı ağlar için birkaç saniye sonra ve cep telefonları veya Wi-Fi gibi kararsız ağlar için birkaç dakika sonra.

Bir kullanıcı eski bir oturuma (süresi dolmuş oturum) erişirse, buna erişim reddedilmelidir. Ayrıca, bir saldırıyı temsil etmesi muhtemel olduğundan, kimlik doğrulamalı durumunun kullanıcının tüm oturumlarından kaldırılması önerilir.

session.use_only_cookies ve session_regenerate_id() öğelerinin doğru kullanımı, saldırganlar tarafından ayarlanan silinemeyen çerezlerle kişisel DoS'a neden olabilir. Bu durumda geliştiriciler, kullanıcıları çerezleri kaldırmaya davet edebilir ve bir güvenlik sorunundan etkilenebileceklerini bildirebilir. Saldırganlar, güvenlik açığı bulunan bir web uygulaması, açıkta kalan/kötü niyetli bir tarayıcı eklentisi, fiziksel olarak güvenliği ihlal edilmiş bir cihaz vb. aracılığıyla kötü amaçlı çerezler atayabilir.

Uyarı

DoS riski yanlış anlaşılmasın. session.use_strict_mode=On genel oturum kimliği güvenliği için zorunludur! Tüm sitelerin session.use_strict_mode'u etkinleştirmesi önerilir.

DoS, yalnızca hesap saldırı altındayken gerçekleşebilir. Bir uygulamadaki JavaScript zerki güvenlik açığı en yaygın sebeplerdendir.

Oturum Verisinin Silinmesi

Eski oturum verisi erişilemez ve silinmiş olmalıdır. Geçerli oturum modülü bunu gerektiği gibi yerine getiremez.

Eski oturum verileri mümkün olan en kısa sürede silinmelidir. Ancak, etkin oturumlar hemen kaldırılmamalıdır. Bu gereksinimleri karşılamak için geliştiriciler, zaman damgasına dayalı oturum veri yönetimini kendi başlarına uygulamalıdır.

$_SESSION içinde zaman aşımı damgası ayarlanmalı ve yönetilmelidir. Güncel olmayan oturum verilerine erişim yasaklanmalıdır. Eski oturum verilerine erişim tespit edildiğinde, kullanıcının oturumlarından tüm kimliği doğrulanmış durumları kaldırıp yeniden kimlik doğrulamaya zorlanması önerilir. Eski oturum verilerine erişim bir saldırıyı temsil edebilir. Bunu başarmak için geliştiriciler, her kullanıcının tüm etkin oturumlarını takip etmelidir.

Bilginize: Eski bir oturuma erişim, kararsız bir ağ ve/veya siteye eşzamanlı erişim nedeniyle de gerçekleşebilir. Örneğin, sunucu bir çerez aracılığıyla yeni bir oturum kimliği belirlemeye çalışmış, ancak bağlantının kesilmesi nedeniyle Set-Cookie paketi istemciye ulaşmamış olabilir. Bir bağlantıya session_regenerate_id() tarafından yeni bir oturum kimliği verilebilir, ancak başka bir eşzamanlı bağlantı henüz yeni oturum kimliğini almamış olabilir. Bu nedenle, geliştiriciler daha sonraki bir aşamada eski oturuma erişimi yasaklamalıdır. Yani zaman damgası tabanlı oturum yönetimi zorunludur.

Özetle, oturum verileri ne session_regenerate_id() ne de session_destroy() ile yok edilmeli, oturum verilerine erişimi denetlemek için zaman damgaları kullanılmalıdır. session_gc()'nin oturum veri deposundaki eski verileri silmesine izin verilmelidir.

Oturum Kilitleme

Yarış koşullarından kaçınmak için oturum verileri öntanımlı olarak kilitlenir. Oturum verilerinin istekler arasındaki tutarlılığını sağlamak için kilitleme zorunludur.

Ancak oturum kilitleme, saldırganlar tarafından DoS saldırıları gerçekleştirmek için kötüye kullanılabilir. Oturum kilitleyerek DoS saldırısı riskini azaltmak için kilitler en aza indirilmelidir. Oturum verilerinin güncellenmesi gerekmediğinde salt okunur oturumlar kullanılmalıdır. session_start() işlevi 'read_and_close' seçeneği ile kullanılmalıdır: session_start(['read_and_close'=>1]); session_commit() kullanarak $_SESSION güncellendikten hemen sonra, mümkün olan en kısa sürede oturum kapatılmalıdır.

Geçerli oturum modülü, oturum etkin olmadığında $_SESSION üzerinde herhangi bir değişiklik algılamaz. Oturum etkin değilken $_SESSION üzerinde değişiklik yapmamak geliştiricinin sorumluluğundadır.

Etkin Oturumlar

Geliştiriciler, her kullanıcı için tüm etkin oturumları izlemelidir. Ve kullanıcılara kaç tane etkin oturum, hangi IP'den (ve alandan), ne kadar süredir etkin oldukları vs. bildirilmelidir. PHP bunları takip etmez. Bunu geliştiricilerin yapacağı varsayılır.

Bunu uygulamak için çeşitli yollar mevcuttur. Olası bir uygulama, gerekli verileri takip eden ve ilgili tüm bilgileri depolayan bir veritabanı oluşturmaktır. Geçersiz oturum verileri çöp toplayıcıya gittiğinden, geliştiricilerin etkin oturum veritabanı tutarlılığını korumak için çöp toplayıcı verileriyle de ilgilenmesi gerekir.

En basit uygulamalardan biri "oturum kimliği ile öncelenmiş kullanıcı kimliği"dir ve gerekli bilgiler $_SESSION içinde saklanır. Birçok veritabanı, bu öneki seçebilmektedir. Geliştiriciler bunun için session_regenerate_id() ve session_create_id() kullanabilir.

Uyarı

Gizli verileri asla önek olarak kullanmayın. Kullanıcı kimliği gizliyse hash_hmac() önerilir.

Uyarı

Bu uygulama için session.use_strict_mode yönergesinin etkinleştirilmesi zorunludur. Etkin olduğundan emin olun. Aksi takdirde aktif oturum veritabanı tehlikeye girebilir.

Eski oturumlara erişimi tespit etmek için zaman damgasına dayalı oturum yönetimi zorunludur. Eski bir oturuma erişim tespit edildiğinde, kullanıcının tüm etkin oturumlarından kimlik doğrulama bayrakları silinmelidir. Bu, saldırganların çalınan oturumlardan yararlanmaya devam etmesini önler.

Oturum ve Otomatik Oturum Açmak

Oturumun çalınma riskini artırdığından, geliştiriciler otomatik oturum açma için uzun ömürlü oturum kimlikleri kullanmamalıdır. Otomatik giriş özelliğini geliştirici gerçeklemelidir.

setcookie() kullanarak otomatik oturum açma anahtarı olarak tek seferlik güvenli bir aşlama anahtarı kullanın. SHA-2'den daha güçlü bir aşlama algoritması kullanın. Örneğin, /dev/urandom veya random_bytes()'dan rastgele verilerle SHA-256 veya üstü.

Kullanıcının kimliği doğrulanmamışsa, tek seferlik otomatik giriş anahtarının geçerli olup olmadığına bakılmalıdır. Geçerli olması durumunda, kullanıcının kimliği doğrulanmalı ve yeni bir güvenli tek seferlik aşlama anahtarı atanmalıdır. Otomatik oturum açma anahtarı yalnızca bir kez kullanılmalıdır, yani bir otomatik oturum açma anahtarının asla yeniden kullanılmaması gerekir. Her zaman yeni bir tane oluşturulmalıdır.

Otomatik oturum açma anahtarı, uzun ömürlü bir kimlik doğrulama anahtarıdır, mümkün olduğunca korunması gerekir. Güvenli hale getirmek için path/httponly/secure/SameSite çerezinin öznitelikleri kullanılmalıdır. Yani otomatik giriş anahtarı, gerekmedikçe asla aktarılmamalıdır.

Geliştirici, otomatik oturum açmayı devre dışı bırakan ve gereksiz otomatik oturum açma anahtarı tanımlama bilgisini kaldıran özellikleri uygulamalıdır.

CSRF (Siteler Arası Talep Sahtekarlıkları) Saldırıları

Oturumlar ve kimlik doğrulama, CSRF saldırılarına karşı koruma sağlamaz. Geliştiriciler, CSRF korumasını kendileri gerçeklemelidir.

CSRF koruması için output_add_rewrite_var() kullanılabilir. Daha fazla bilgi işlevin sayfasında bulunabilir.

Bilginize: PHP 7.2.0 öncesinde, şeffaf oturum kimliği ile aynı çıktı tamponu ve INI ayarı kullanılırdı. Bu nedenle, 7.2.0 öncesi PHP sürümleri ile output_add_rewrite_var() kullanılması önerilmez.

Çoğu sayfa uygulama çerçevesi CSRF korumasını destekler. Daha fazla ayrıntı için sayfa uygulama çerçevesi kılavuzunuza bakılabilir.

PHP 7.3'ten itibaren, oturum çerezi için SameSite özniteliği ayarlanabiliyor. Bu, CSRF güvenlik açıklarını azaltabilecek ek bir önlemdir.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top