Menü
Bedava
kayıt
ev  /  sorunlar/ PHP'de Oturum Kimliği koruması. Makale Gönderme

PHP'de oturum kimliği koruması. Makale Gönderme

Web sitesi güvenliği, oturum yönetimine dayanmaktadır. Bir kullanıcı güvenli bir siteye bağlandığında, genellikle bir kullanıcı adı ve şifre biçiminde kimlik bilgileri sağlar. Web sunucusu, hangi kullanıcının zaten oturum açtığını ve sayfadan sayfaya nasıl gezindiğini bilmiyor. Oturum mekanizması, kullanıcıların her yeni eylem gerçekleştirmek veya yeni bir sayfaya gitmek istediklerinde parola girmek zorunda kalmamalarını sağlar.

Temel olarak, oturum yönetimi, o anda oturum açmış olan kullanıcının bağlı olmasını sağlar. Ne yazık ki, oturumlar, bir web sunucusuna kimlik doğrulama ihtiyacı olmadan erişime izin verebildiklerinden, bilgisayar korsanları için bariz bir hedef haline geldi.

Kullanıcının kimliğini doğruladıktan sonra, web sunucusu ona bir oturum kimliği sağlar. Bu tanımlayıcı tarayıcıda saklanır ve kimlik doğrulama gerektiğinde değiştirilir. Bu, tekrarlayan kullanıcı adı / şifre giriş işlemlerini önler. Bütün bunlar arka planda gerçekleşir ve kullanıcıya herhangi bir rahatsızlık vermez. Her görüntülediğinizde kullanıcı adınızı ve şifrenizi girdiğinizi hayal edin. yeni sayfa!

Bu yazıda PHP'de bir oturum tanımlayıcısını nasıl koruyacağımı bildiğim tüm yolları özetlemeye çalışacağım.

Çerez kullanımı

Varsayılan olarak, kimlik de dahil olmak üzere tüm oturum bilgileri bir tanımlama bilgisine iletilir. Ancak bu her zaman böyle değildir. Bazı kullanıcılar tarayıcılarında çerezleri devre dışı bırakır. Bu durumda tarayıcı, oturum kimliğini URL'ye iletir.

Burada kimlik iletilir açık form, bilgilerin HTTP başlığında gizlendiği bir çerez oturumunun aksine. en basit bir şekilde bundan korunma, oturum tanımlayıcısının aracılığıyla iletilmesinin yasaklanması olacaktır. adres çubuğu... Bunu, Apache sunucusunun.htaccess yapılandırma dosyasına aşağıdakileri yazarak yapabilirsiniz:

Php_flag session.use_only_cookies açık

Şifreleme kullanma

Sitenizin kredi kartı numaraları (Sony'den merhaba) gibi hassas bilgileri işlemesi gerekiyorsa, SSL3.0 veya TSL1.0 şifrelemesi kullanmalısınız. Bunu yapmak için, çerezi ayarlarken güvenli parametre için true belirtmelisiniz.

Oturum parolasını $ _SESSION değişkeninde saklarsanız (sonuçta sql kullanmak daha iyidir), o zaman onu açık metin olarak saklamamalısınız.

if ($ _SESSION ["şifre"] == $ kullanıcı şifresi) (// kod)

Parola bir oturum değişkeninde düz metin olarak saklandığından yukarıdaki kod güvenli değildir. Bunun yerine md5 şifrelemesini kullanın, bunun gibi bir şey:

if ($ _SESSION ["md5password"] == md5 ($ userpass)) (// kod)

tarayıcı kontrolü

Başka bir tarayıcıdan (bilgisayardan) bir oturum kullanma olasılığını kesmek için, kullanıcı aracısı HTTP başlık alanına bir kontrol girmelisiniz:

Oturum_başlangıç(); if (isset ($ _ SESSION ["HTTP_USER_AGENT"])) (if ($ _SESSION ["HTTP_USER_AGENT"]! = md5 ($ _ SERVER ["HTTP_USER_AGENT"])) (// kod)) else ($ _SESSION [" HTTP_USER_AGENT" ] = md5 ($ _ SERVER ["HTTP_USER_AGENT"]);)

Oturum sona erme

Oturum ömrünü ve çerez süresini sınırlayın. Varsayılan olarak, oturum 1440 saniye sona erer. Bu değeri php.ini ve .htaccess ile değiştirebilirsiniz. .htaccess için örnek:

# Saniye cinsinden oturum ömrü
php_value session.gc_maxlifetime 3600
# Saniye cinsinden çerez ömrü
php_value session.cookie_lifetime 3600

IP adresine göre bağlama

Belirli durumlarda (her zaman değil), IP adresine göre bağlamanız gerekir. Çoğunlukla kullanıcı sayısı sınırlı olduğunda ve statik IP'ye sahip olduğunda. Kontrol, izin verilen IP adresleri listesine karşı olabilir,

Dahil et ("ip_list.php"); // $ ip_white_list = dizi ("admin1" => "111.222.333.444", "admin2" => "555.666.777.888"); if (! boş (array_search ($ _ SUNUCU ["REMOTE_ADDR"], $ ip_white_list))) (başlık ("Konum: admin.php"));) else (echo "ERİŞİM ENGELLE!";)

Veya her istek için IP adresine göre (yalnızca statik IP'ler için):

if (isset ($ _ SESSION ["ip"]) ve $ _SESSION ["ip"] == $ _SERVER ["REMOTE_ADDR"]) (başlık ("Konum: admin.php");) else (session_unset (); $ _SESSION ["ip"] = $ _SERVER ["REMOTE_ADDR"];)

Bilgisayar korsanlığından tamamen kaçınmanın imkansız olduğunu bilmelisiniz. Bu hacklemeyi ancak bilinen herhangi bir yolla mümkün olduğu kadar zorlaştırabilirsiniz. Ancak, bu tür bir koruma ile hayatlarını zorlaştırmamak için yasal kullanıcılarınızı da unutmamalısınız.

Bu makale 2009 yılında yazılmıştır ve en popüler yazılarımızdan biri olmaya devam etmektedir. PHP ve MySQL hakkında daha fazla bilgi edinmek istiyorsanız, bunu çok ilgi çekici bulabilirsiniz.

NOT: Bu makale PHP 4.2 veya sonraki sürümlerde çalışacak şekilde yeni güncellendi!

Geçenlerde bir grup insanla küçük bir proje üzerinde çalışma fırsatım oldu. O e-postanın tek başına herkesi döngüde tutmak için yeterli olmayacağına erken karar vermiştik, bu yüzden proje için küçük bir Web sitesi oluşturmakla görevlendirildim. Basit bir mesaj panosu, ekibin geri kalanının kullanması için belgeleri ve diğer dosyaları yükleyebileceğimiz bir yer ve çeşitli ekip üyelerinin iletişim bilgilerini içerecektir.

Bu özelliklerin birçoğunun çalışması için, sitenin ilgili bölümlerine erişmeden önce kullanıcıların giriş yapması gerektiğini biliyordum. İhtiyacım olan, kullanıcıların siteye erişmek için bir kullanıcı kimliğine kaydolmalarını ve ardından herhangi bir müdahalem olmadan bu kimliği hemen kullanmalarını sağlayacak bir sistemdi.

Bu yazıda, ilk yarıdan başlayarak kullanıcı kayıt süreci ile birlikte geliştirdiğim sistemin bir özetini sunacağım. İkinci yarıda, sitenin kendisine, kullanıcıların nasıl oturum açmasını gerektirdiğine ve ardından ziyaretleri boyunca oturum açma durumunu nasıl koruduğuna odaklanacağım. PHP'de oturum yönetimi özelliklerinin kullanımına özellikle dikkat edeceğim. Sonunda, kendinize ait benzer bir sistemi uygulamak için ihtiyacınız olan tüm bilgilere sahip olmalısınız.

Bu makale boyunca, PHP diline, bir PHP betiğine bilgi göndermek için formların kullanımına ve PHP'nin bir MySQL veritabanıyla etkileşimde bulunmak için nasıl kullanılabileceğine ilişkin temel bir aşinalığa sahip olduğunuzu varsayacağım. Bunlardan herhangi biri size yabancı kavramlarsa, bir önceki yazımı okuyarak başlamalısınız.

Birinci Bölüm: Kayıt Süreci

Kayıt Formu

Kullanıcıların erişim için kaydolmasını gerektiren bir site oluşturmaya başlamak için doğal bir yer, kayıt işleminin kendisidir. Beklendiği gibi, basit bir Web tabanlı form hile yapacak. İşte nasıl görüneceği:

Ve işte bu formun kodu:




yeni kullanıcı kaydı



Yeni Kullanıcı Kayıt Formu


* Bir alanın zorunlu olduğunu gösterir


">























*



*

E




*

Diğer notlar












Aslında bu forma zaten gömülü bir PHP kodu parçası var:

">

action niteliğine dikkat edin. Adını verdiğim tanıdık bir tasarım deseninde çok amaçlı sayfalarönceki yazılarda formun form kodunu içeren aynı sayfaya gönderilmesine neden oluyoruz. Bu formdaki gönder düğmesi tarafından oluşturulacak olan PHP değişkeni $ _POST ["submitok"]'u izleyerek (uyarı adı = etikette "submitok"), komut dosyamız form gönderimlerini olduğu kadar işleyebilecektir. formun kendisinin görüntülenmesi.

Ayrıca $ _SERVER ["PHP_SELF"] değişkenini yazdırmak için nispeten yeni bir sözdizimi biçimi kullanıyoruz. Bu sözdizimine aşina değilseniz, bunu açıklığa kavuşturmama izin verin.ifade?> işlevsel olarak aynıdırifade; ?>. Böylece, bu durumda, bunun yerine aşağıdakileri yazabilirdik:

">

Artık formumuzun kodunu aldığımıza göre, tam kayıt komut dosyasını yazmaya geçebiliriz.

Kayıt Komut Dosyası

Veritabanına dayalı Web siteleri yazmaya alışkınsanız, kayıt komut dosyası oldukça basit görünmelidir. Öncelikle, site için kullanıcı adlarını ve şifreleri depolayacak olan veritabanına bağlanmak gibi ortak işlevleri gerçekleştirecek birkaç kod parçacığı yazmamız gerekiyor. Bu parçacıklar, içerme dosyalarında saklanan PHP işlevleri biçimini alacaktır. Veritabanıyla ilgili işlevleri (db.php) barındırmak için bir içerme dosyası ve daha genel işlevleri (common.php) depolamak için başka bir dosya kullanacağız.

İlk olarak, işte db.php kodu:

yerel ana bilgisayar"; $ dbuser =" kullanıcı"; $ dbpass =" parola"; function dbConnect ($ db =" ") (global $ dbhost, $ dbuser, $ dbpass; $ dbcnx = @mysql_connect ($ dbhost, $ dbuser, $ dbpass) veya die (" Site veritabanı çalışmıyor görünüyor. " ); if ($ db! = "" ve [e-posta korumalı] _select_db ($ db)) die ("Site veritabanı kullanılamıyor."); $ dbcnx döndür; )?>

Burada tanımlanan dbConnect işlevi, işlev bildiriminde $ db bağımsız değişkenine varsayılan bir değer ("") atadığımız için bağımsız değişkenle veya bağımsız değişken olmadan çağrılabilir. İşlev, dosyanın üstündeki $ dbhost, $ dbuser ve $ dbpass değişkenlerini kullanarak MySQL sunucusuna bağlanarak başlar ( bunları sunucunuz için uygun değerlere ayarlamanız gerekecek) ve sonra bir veritabanı adı verilmişse, o veritabanını seçer. Her şeyin hatasız ilerlediğini varsayarsak, veritabanı bağlantısına yapılan referans döndürülür.

İkinci içerme dosyası, common.php, ayrıca tek bir işlev içerir:

Kullanıcıya yanlış bir şey yaptığını söylemek için bu hata işlevini kullanacağız. Argüman olarak bir hata mesajı alır ve ardından önceki sayfaya yedeklenmeden önce bunu bir JavaScript açılır mesajında ​​görüntüler. Bu işlev, onu çağıran komut dosyasını çıkış komutuyla sonlandırır, bu nedenle komut dosyalarınızdan birinde bir şeyler ters gittiğinde kullanım için uygundur.

Bu sıkıcı ayrıntılar ortadan kalktığında, artık dikkatinizi kayıt komut dosyasına (signup.php) çevirebilirsiniz. Komut dosyası, az önce yazdığımız iki içerme dosyasını yükleyerek başlar:

Bu, söz konusu dosyaların içerme yolunda mevcut olduğunu varsayar. Örneğin, php.ini dosyamda kullandığım aşağıdaki içerme yolunu düşünün:

Include_path = ".; C: php4pear; d: wwwphpinclude"

Bir Unix sunucusunda şöyle görünebilir:

Include_path = ".: / Usr / local / php / lib / php: / home / kyank / phpinclude"

Her iki durumda da, içerme dosyalarınızı, onları kullanan dosya(lar) ile aynı dizine koymayı veya bunları dahil etme yolunda listelenen bir dizine yerleştirmeyi seçebilirsiniz. İkinci seçenek, parolalar gibi hassas bilgileri içeren dosyalar için daha güvenlidir, çünkü Web sunucunuzdaki PHP desteği başarısız olursa, sunucunuzun Web kök dizininin altında depolanmayan PHP dosyalarındaki bilgiler meraklı gözlere maruz kalmaz.

Ardından komut dosyası, kayıt formunun gönderildiğini gösterecek olan bir $ _POST ["submitok"] değişkeninin varlığını kontrol eder. Değişken bulunamazsa, komut dosyası, kullanıcının doldurması için önceki bölümdeki formu görüntüler:

If (! Isset ($ _ POST ["submitok"])): // Kullanıcı kayıt formu görüntülensin mi?> yeni kullanıcı kaydı ...

Komut dosyasının geri kalanı, yeni kullanıcıyı veritabanına ekleyerek form gönderimini işlemekten sorumludur, bu yüzden bir an duralım ve veritabanı tablosunun tasarımına bakalım. Tabloyu oluşturmak için MySQL komutu:

Mysql> CREATE TABLE user (-> ID INT PRIMARY KEY AUTO_INCREMENT, -> kullanıcı kimliği VARCHAR (100) UNIQUE NOT NULL, -> password CHAR (16) NOT NULL, -> tam adı VARCHAR (100) NOT NULL, -> VARCHAR e-postası ( 100) NULL DEĞİL, -> METİN notları);

Gördüğünüz gibi, tablo oldukça basit. Uygulamanızda ek sütunlara ve hatta birden çok tabloya ihtiyacınız olabilir, ancak bu örnek için bu basit tasarım yeterli olacaktır.

Bu nedenle, komut dosyasına geri dönersek, $ send değişkeni algılandığında, komut dosyasının db.php'den dbConnect işlevini kullanarak veritabanına yeni girişi eklemeye hazırlanması gerekir:

oturumlar");

Kullanıcı tablosunu içeren veritabanının oturumlar olarak adlandırıldığını varsaydığımı unutmayın. Farklı bir veritabanı adı kullanıyorsanız bunu değiştirdiğinizden emin olun.

Komut dosyasının yapması gereken bir sonraki şey, formdaki gerekli alanların doldurulup doldurulmadığını kontrol etmektir. Karşılık gelen değişkenlerden herhangi birinin boş dizeler olduğu tespit edilirse, komut dosyası, kullanıcıya neyin yanlış gittiğini bildirmek ve forma geri dönmek için common.php'den error işlevini çağırır:

if ($ _POST ["newid"] == "" veya $ _POST ["newname"] == "" veya $ _POST ["newemail"] == "") (hata ("Bir veya daha fazla gerekli alan boş bırakıldı . \ n "." Lütfen bunları doldurun ve tekrar deneyin. ");)

Ardından, komut dosyasının, kullanıcı tarafından seçilen kimliğin veritabanında zaten mevcut olup olmadığını belirlemesi gerekir, bu durumda kullanıcının yeni bir kimlik seçmesi gerekir. Bu sorgunun işlenmesi biraz olağandışıdır, çünkü pratikte 0 veya 1 olacak tek bir değer (eşleşen kullanıcı kimliklerine sahip girişlerin sayısı) alırız. Ayarlamak. Bunun yerine, ilk satırın (indeks 0) ilk sütununun (indeks 0) değerini almak için mysql_result işlevini kullanırız:

// Yeni kimliği olan mevcut kullanıcıyı kontrol edin $ sql = "SELECT COUNT (*) FROM user WHERE userid =" $ _POST ""; $ sonuç = mysql_query ($ sql); if (! $ sonuç) (hata ("Gönderiniz işlenirken bir veritabanı hatası oluştu". "gönderiniz. \ nBu hata devam ederse lütfen". "iletişim kurun" [e-posta korumalı] . ");) if (@mysql_result ($ sonuç, 0,0)> 0) (hata ("Seçtiğiniz kullanıcı kimliğine sahip bir kullanıcı zaten var. \ n "." Lütfen başka bir tane deneyin. ");)

Hata mesajındaki e-posta adresini değiştirmeyi unutmayın!

Tüm kontroller yapıldıktan sonra, girdi veritabanına eklenmeden önce tamamlanması gereken tek bir görev kalır. Kayıt formunda, kullanıcının şifre girmesi için bir alan içermediğini fark etmiş olabilirsiniz. Bu kasıtlı olarak yapıldı. Kullanıcının önceden bir parola belirlemesine izin vermek yerine, birçok sitenin kullandığı yaygın bir hile, otomatik olarak bir başlangıç ​​parolası oluşturmak ve bunu kullanıcı tarafından girilen e-posta adresine göndermektir.

Bu, geçerli bir adresin girilip girilmediğini kontrol etmek için etkili bir yöntemdir; ancak pratik bir sistemde, veritabanında çok sayıda “kötü” girişle karşılaşabilirsiniz. Bunu düzeltmek için bir çözüm, kullanıcı veritabanına iki sütun eklemek olacaktır. İlki, kullanıcının oluşturulduğu zaman için bir zaman damgası tutar. İkincisi, başlangıçta false olarak ayarlanacak ve kullanıcı ilk kez oturum açtığında true olarak ayarlanacak bir Boolean (doğru/yanlış) değeri olacaktır. Ardından, bir haftadan uzun bir süre önce kaydolmuş ve henüz oturum açmamış olan kullanıcılar için herhangi bir girdiyi silmek için otomatik bir görev olarak (örneğin cron kullanarak) haftada bir kez çalıştırılacak bir komut dosyası yazabilirsiniz. Pratikte bunlar, şifreleri kullanıcılarına hiç ulaşmamış geçersiz e-posta adreslerine sahip girişler olacaktır.

Komut dosyasının bundan sonra yapması gereken görev, kullanıcı için bir parola oluşturmaktır. Parola olarak kullanılmak üzere yarı rasgele metin dizeleri oluşturmanın birçok yöntemi olsa da, aşağıdaki tek satır bana iyi hizmet etti:

$ yenigeçiş = substr (md5 (zaman ())), 0.6);

Bu, geçerli zamanı alarak ve üzerinde bir MD5 karma işlemi gerçekleştirerek çalışır. Bu temelde bir metin dizesine tek yönlü bir şifreleme kodlamasıdır ve daha sonra substr işlevi kullanılarak 6 karaktere bölünür. Sonuç, tahmin edilmesi oldukça zor olan 6 karakterli bir şifredir.

Son olarak, komut dosyası veritabanı eklemesini gerçekleştirir:

$ sql = "INSERT INTO user SET userid =" $ _POST ", password = PASSWORD (" $ yenipass "), tam ad =" $ _POST ", e-posta =" $ _POST ", notlar =" $ _POST ""; if (! mysql_query ($ sql)) hatası ("Gönderiniz işlenirken bir veritabanı hatası oluştu. \ nBu hata devam ederse lütfen". "iletişim kurun. [e-posta korumalı] .");

Bir kez daha, mesajdaki e-posta adresini kendinize göre değiştirin.

Yukarıdaki kodda bahsetmeye değer tek nokta MySQL'in PASSWORD fonksiyonunun veri tabanındaki şifreyi kodlamak için kullanılmasıdır. Elbette, şifreleri düz metin olarak saklayabilirsiniz, ancak bir sistemin kullanıcıları, yönetici şifrelerini okuyamadığında genellikle daha rahat hissederler. Bu, güvenlik açısından fazla bir şey eklemese de, muhtemelen yöneticinin veritabanına tam erişimi olduğundan, kullanıcılar genellikle elde edebilecekleri her türlü gizliliği takdir eder.

Kullanıcı veritabanına kayıtlı olduğuna göre, komut dosyasının kullanıcıya atanan parolayı belirten bir e-posta mesajı göndermesi gerekir. Bu, PHP'nin e-posta işlevi kullanılarak kolayca yapılır:

// Kişiye yeni şifreyi e-posta ile gönder. $ mesaj = "G" Günü! Proje Web Sitesi için kişisel hesabınız oluşturuldu! Giriş yapmak için aşağıdaki adrese gidin: http://www.example.com/ Kişisel giriş kimliğiniz ve şifreniz aşağıdaki gibidir: kullanıcı kimliği: $ _POST şifre: $ newpass Bu şifreye takılıp kalmadınız! Giriş yaptıktan sonra istediğiniz zaman değiştirebilirsiniz. Herhangi bir sorun yaşarsanız, bizimle iletişime geçmekten çekinmeyin. et<[e-posta korumalı] >. -Adınız Senin siten Webmaster "; mail ($ _ POST [" yeniemail "]," Şifreniz Senin internet siten", $ mesaj," Gönderen: Adınız <[e-posta korumalı] >");

Mesajı kendi amaçlarınız için özelleştirin ve uygun olduğunda kendi e-posta adresinizi ve sitenizin URL'sini ve adını girdiğinizden emin olun.

Son olarak, komut dosyası, kullanıcının başarılı kayıttan sonra göreceği sayfanın HTML'sini verir:

?> Kayıt tamamlandı

Kullanıcı kaydı başarılı!

Kullanıcı adınız ve şifreniz şu adrese e-posta ile gönderildi: , kayıt formunuzda az önce verdiğiniz e-posta adresi. Giriş yapmak için, giriş sayfasına dönmek için burayı tıklayın ve yeni kişisel kullanıcı adınızı ve şifrenizi girin.

Bu mesajın kullanıcıyı site için "giriş sayfası" olarak index.php'ye yönlendirdiğine dikkat edin. Bu, kayıt sayfasının kendisi hariç, tüm sitenizin erişim için kayıt gerektireceğini varsayar. Eğer sitenizin sadece belirli bir alanını korumayı amaçlıyorsanız, muhtemelen bu mesajı kullanıcıyı sitenin şifre korumalı alanına yönlendirmek için değiştirmelisiniz. Onları belirli bir giriş sayfasına yönlendirmeniz gerekmez; Bu makalenin 2. Kısmında göreceğimiz gibi, sitenin korunan herhangi bir sayfası, kullanıcı henüz oturum açmamışsa erişim isteyecektir.

Kayıt işlemi başlamaya hazırken, kullanıcıların erişim için kaydolmasını gerektiren bir Web Sitesinin temellerini attık. Kullanıcılar artık kendileri için bir hesap oluşturabilir ve site yöneticisinin herhangi bir müdahalesine gerek kalmadan anında bu hesabı kullanabilirler. Her yeni kullanıcı için otomatik olarak bir başlangıç ​​şifresi oluşturarak ve bu şifreyi kayıt sırasında verdikleri adrese e-posta ile göndererek, her kullanıcının verdiği e-posta adresinin geçerli olduğundan emin olabilirsiniz. Bu aynı zamanda, uygun olduğuna karar verirseniz, kullanışlı bir "unuttuğum şifremi bana e-posta ile gönder" özelliğinin kapısını açar.

İkinci Bölüm: Erişimi Kontrol Etme

Bir sonraki adım, sitenin kendisini oluşturmaktır ve kullanıcıdan bir kullanıcı adı ve şifre isterken ve girilen değerleri MySQL veritabanındaki bir girişle eşleştirirken, uygulama açısından oldukça basit süreçlerdir, bu süreçte karşılaşılması gereken en büyük zorluktur. Bu makalenin ikinci yarısı, kullanıcının siteye herhangi bir belirli ziyaret sırasında yalnızca bir kez oturum açması gerektiği şekilde yapıyor. Göstereceğim gibi, PHP oturumları için yerleşik destek bu amaç için mükemmel bir araçtır.

PHP Oturumları

Sürüm 4.0'da PHP'ye eklenen oturum desteğini hiç kullanmadıysanız, oturumların gerçekte ne olduğu konusunda biraz kafanız karışmış olabilir. Kulağa karmaşık gelen isme rağmen, oturumlar, bir kullanıcının sitenizde kaldığı süre boyunca sabit kalan değişkenler oluşturmak için gerçekten kolay bir yöntemdir. Aksi şekilde yapılandırılmadığı sürece, bir PHP oturumu, kullanıcının tarayıcısında, ziyaret süresi boyunca o kullanıcıyı sitenizde benzersiz bir şekilde tanımlamaya yarayan uzun bir harf ve sayı dizisi olan bir oturum kimliği içeren bir tanımlama bilgisi ayarlayarak çalışır. Tarayıcı daha sonra sitenizden bir sayfa için yapılan her istekle birlikte bu tanımlama bilgisini gönderir, böylece PHP bunu, isteğin potansiyel olarak devam eden birçok oturumdan hangisine ait olduğunu belirlemek için kullanabilir. PHP, Web sunucusunda depolanan bir dizi geçici dosya kullanarak, her oturumda kaydedilmiş değişkenleri ve değerlerini takip eder.

Devam etmeden ve PHP'deki şık oturum yönetimi özelliklerini kullanmadan önce, php.ini dosyanızın ilgili bölümünün doğru şekilde kurulduğundan emin olmanız gerekir. Web sunucunuza ait bir sunucu kullanıyorsanız, bunun sizin için yapıldığını varsaymak muhtemelen güvenlidir. Aksi takdirde, php.ini dosyanızı bir metin düzenleyicide açın ve işaretli bölümü arayın. Altında, oturum kelimesiyle başlayan yirmi kadar seçenek bulacaksınız. Çoğu, olduğu gibi bırakılırsa gayet iyi, ancak burada kontrol etmek isteyeceğiniz birkaç önemli şey var:

Session.save_handler = dosyalar session.save_path = "C: WINDOWSTEMP" session.use_cookies = 1

session.save_path, PHP'ye oturumları izlemek için kullanılan geçici dosyaların nerede oluşturulacağını söyler. Sistemde var olan bir dizine ayarlanmalıdır, yoksa sayfalarınızdan birinde oturum oluşturmaya çalıştığınızda çirkin hata mesajları alırsınız. Unix altında / tmp popüler bir seçimdir. Windows'ta C: WINDOWSTEMP veya tercih ederseniz başka bir dizini kullanabilirsiniz (D: PHPSESSIONS kullanıyorum). Yapılan bu ayarlamalarla, değişikliklerin etkili olabilmesi için Web sunucusu yazılımınızı yeniden başlatın.

Artık PHP oturumlarıyla çalışmaya başlamaya hazırsınız. Erişim kontrolü komut dosyasına geçmeden önce, PHP'deki en yaygın oturum yönetimi işlevlerine hızlıca bakalım. PHP'ye bir oturum kimliği aramasını veya bulunamazsa yeni bir oturum başlatmasını söylemek için session_start'ı çağırmanız yeterlidir. Bu işlev çağrıldığında mevcut bir oturum kimliği bulunursa, PHP, oturuma ait değişkenleri geri yükler.

Oturum_başlangıç();

PHP'ye belirli bir değişkenin geçerli oturumda saklanmasını istediğinizi ve böylece aynı oturumda çalıştırılan diğer komut dosyaları için kullanılabilir olmasını istediğinizi söylemek için, $ _SESSION dizisinde bir değişken ayarlamanız yeterlidir. Örneğin, aşağıdaki, geçerli oturumda $ _SESSION ["pwd"] adlı değişkeni saklayacaktır:

$ _SESSION ["pwd"] = değer;

Geçerli oturumdan bir değişkeni kaldırmak için PHP'nin unset işlevini kullanmanız yeterlidir:

Ayarlanmadı ($ _ OTURUM ["pwd"]);

Son olarak, işlemdeki tüm kayıtlı değişkenleri silerek mevcut oturumu sonlandırmak isterseniz, $ _SESSION dizisini boşaltabilir ve ardından session_destroy'u kullanabilirsiniz:

$ _SESSION = dizi (); session_destroy();

Bunlar ve PHP'deki diğer oturum yönetimi işlevleri hakkında daha ayrıntılı bilgi için PHP Kılavuzunun ilgili bölümüne bakın: Oturum işleme işlevleri.

Erişim Kontrol Komut Dosyası

Bu erişim kontrol şemasıyla korumak istediğiniz her sayfa için (böylece sadece kayıtlı kullanıcılar görebilir), betiğiniz aşağıdaki akış şemasında açıklanan prosedürü izlemelidir.

Korumalı bir sayfa ilk kez istendiğinde, kullanıcı henüz oturum açma bilgilerini girmemiş olacaktır. Komut dosyası bunu algılar ve istenen sayfayı görüntülemek yerine kullanıcıdan bir oturum açma formuyla bir kullanıcı adı ve parola ister. Bu form gönderildiğinde, sayfa yeniden yüklenir, bu sefer belirtilen bir kullanıcı adı ve şifre ile. Komut dosyası, oturum açma ayrıntılarının belirtildiğini görür ve kullanıcının ziyaretinin geri kalanında kullanılabilir durumda kalmaları için bunları oturum değişkenleri olarak kaydeder. Son olarak, komut dosyası, kullanıcı adı / şifre kombinasyonunun geçerli olduğundan emin olmak için veritabanını kontrol eder. Eğer öyleyse, istenen sayfa görüntülenir. Değilse, kullanıcıyı tekrar oturum açmayı denemeye davet eden bir bağlantıyla birlikte “erişim reddedildi” mesajı görüntülenir.

Bu prosedür tüm korunan sayfalar için aynı olacağından, onu ortak bir içerme dosyası olarak uygulamak mantıklıdır. Bu, dosyanın en üstüne aşağıdaki satırı ekleyerek bir sayfayı korumanıza olanak tanır:

Hedef artık netleştiğinde, size accesscontrol.php kodunda yol göstereceğim. Kullanışlı iki ekleme dosyanızı ekleyerek başlayın:

Ana dosyanın da bu içerme dosyalarını kullanması durumunda, burada include yerine include_once kullanıyorum. Örneğin, common.php iki kez dahil edilmişse, PHP, hata işlevinin iki kez bildirildiğine dair bir uyarı verir.

Sonra, ya yeni bir oturum başlatmak için (bu, kullanıcının ziyaretindeki ilk sayfaysa) ya da kullanıcının mevcut oturumuna ait değişkenleri yüklemek için session_start'ı çağırırım.

Oturum_başlangıç();

Bu noktada, kullanıcının oturum açma ayrıntıları, ister bir oturum açma formundan ($ _POST dizisinde) yeni gönderilmiş olsun, isterse kullanıcının oturumunda ($ _SESSION dizisinde) saklanmış olsun, erişilebilir olmalıdır. Bu nedenle, ilk iş olarak, komut dosyasının oturum açma kimlik bilgilerini $ _POST veya $ _SESSION dizisinden çekmesi gerekir:

$ kullanıcı kimliği = isset ($ _ POST ["uid"])? $ _POST ["uid"]: $ _SESSION ["uid"]; $ pwd = isset ($ _ POST ["pwd"])? $ _POST ["pwd"]: $ _SESSION ["pwd"];

Bu iki satır, kullanışlı (kafa karıştırıcıysa) sözdizimi kullanır. üçlü operatör, bu formu alır:

Şart? eğer_doğruysa_değer: değer_yanlışsa_değer

Eğer şart doğrudur, ifade eşit olacaktır değer_eğer_doğruysa... Değilse, eşit olacak değer_eğer_yanlışsa.

Yani bunu yukarıdaki ilk satırla karşılaştırırsanız, $ _POST dizisinde (isset ($ _ POST ["uid"])) bir "uid" değeri varsa, $ uid'nin şu şekilde ayarlanacağını görürsünüz. $ _POST ["uid"] değeri. Değilse, $ _SESSION ["uid"] değerine ayarlanacaktır. Aynı şey $ _POST veya $ _SESSION dizisinden $ pwd oluşturmak için de olur.

Üçlü operatörle gerçekten rahat değilseniz, aynı şeyi if ifadeleriyle nasıl yapabileceğiniz aşağıda açıklanmıştır:

if (isset ($ _ POST ["uid"]) ($ uid = $ _POST ["uid"];) else ($ uid = $ _SESSION ["uid"];) if (isset ($ _ POST ["pwd) "] ) ($ pwd = $ _POST ["pwd"];) else ($ pwd = $ _SESSION ["pwd"];)

Gördüğünüz gibi, üçlü operatör, kafanızı çevirebilirseniz çok fazla yazmadan tasarruf edebilir!

Şimdi, bu aşamada, kullanıcının kimliği ve şifresinin mevcut olmayacağı tek durum, siteye bu ziyaret sırasında girilmemiş olsaydı.

If (! Isset ($ uid)) (?> Lütfen Erişim için Giriş Yapın

oturum açmak gereklidir

Sitenin bu alanına erişmek için giriş yapmalısınız. Kayıtlı bir kullanıcı değilseniz, anında erişim için kaydolmak için buraya tıklayın!

"> Kullanıcı Kimliği:
Parola:

Yukarıdaki giriş formu gönderildiğinde, sayfa bu sefer $ uid ve $ pwd değişkenleri kullanıcının ID ve şifresine ayarlanmış olarak yeniden yüklenecektir. Yukarıdaki akış şemasına göre bir sonraki adım, bunları oturum değişkenleri olarak kaydetmek ve bunların kullanıcının bu ziyaret sırasında görüntülediği diğer tüm korumalı sayfalarda kullanılabilir olmasını sağlamaktır. Bu noktada, komut dosyasının girilen kullanıcı kimliği ve parolanın geçerli olup olmadığını hala bilmediğini unutmayın. Senaryonun işleri neden bu sırayla yaptığını birazdan açıklayacağım.

$ _SESSION ["uid"] = $ kullanıcı kimliği; $ _SESSION ["pwd"] = $pwd;

Kullanıcı kimliği ve parolanın geçerli olup olmadığını öğrenmek için komut dosyası, eşleşen girişler için veritabanını arar. SELECT sorgusunda, MySQL'in PASSWORD işlevini kullanarak $ pwd değişkenini, aynı zamanda kodlanmış olan saklanan parolayla eşleştirmek için kodladım. Burada kendi veritabanı adınızı kullandığınızdan emin olun - maden oturumlarını aradım - ve hata mesajında ​​kendi e-posta adresinizi.

DbConnect (" oturumlar"); $ sql =" SELECT * FROM user WHERE userid = "$ uid" AND password = PASSWORD ("$ pwd") "; $ sonuç = mysql_query ($ sql); if (! $ sonuç) (hata (" A "." oturum açma bilgileriniz kontrol edilirken veritabanı hatası oluştu. \ nBu hata devam ederse lütfen "." ile iletişime geçin [e-posta korumalı] ."); }

Veritabanında eşleşen satır bulunamazsa, sağlanan oturum açma ayrıntıları yanlıştır. Komut dosyası bunu mysql_num_rows işlevini kullanarak kontrol eder ve siteye erişimi reddeden ve kullanıcıyı yeniden oturum açmayı denemeye davet eden bir mesaj görüntüler. Bunu mümkün kılmak için, komut dosyası ayrıca iki oturum değişkeninin ($ _SESSION ["uid"] ve $ _SESSION ["pwd"]) kaydını siler, böylece komut dosyası bir sonraki çalıştırılışında oturum açma formunu görüntüler. Değişkenler, geçerlilikleri kontrol edilmeden önce komut dosyasında daha önce kaydedildiğinden, komut dosyasının kaydını silmeye çalışmadan önce kayıtlı olup olmadıklarını kontrol etmesi gerekmez.

if (mysql_num_rows ($ sonuç) == 0) (unset ($ _ SESSION ["uid"]); unset ($ _ SESSION ["pwd"]);?> Erişim reddedildi

Erişim reddedildi

Kullanıcı kimliğiniz veya şifreniz yanlış veya bu sitede kayıtlı bir kullanıcı değilsiniz. Tekrar oturum açmayı denemek için "> burayı tıklayın. Anında erişim için kaydolmak için burayı tıklayın.

Oturum açma ayrıntıları oturum değişkenleri olarak saklandığına ve geçerliliği kontrol edildiğine göre, komut dosyası istenen sayfaya güvenli bir şekilde erişim verebilir. Accesscontrol.php'yi sonlandırmadan ve kontrolü korumalı sayfaya geri vermeden önce yaptığım son şey, daha önce oluşturulan MySQL sonuç kümesinde bulunan kullanıcının tam adını almaktır. Bunun bir oturum değişkeni olarak kaydedilmesi gerekmez, çünkü oturumda depolanan "uid" ve "pwd" değerleri kullanılarak korunan her sayfa tarafından tekrar alınır.

$ kullanıcı adı = mysql_result ($ sonuç, 0, "tam ad"); ?>

Bu, accesscontrol.php'yi ve onunla birlikte erişim kontrol sistemini tamamlar! Yinelemek gerekirse, artık herhangi bir sayfa, komut dosyasının en üstüne accesscontrol.php eklenerek yalnızca üyelere özel erişimle sınırlandırılabilir. Kullanıcının adını görüntülemek için $ username değişkenini kullanan çok basit bir örnek:

Üyelere Özel Sayfa

Hoş geldin,! Sitenin üyelere özel alanına girdiniz. Kendini özel hissetmiyor musun?

Sarmak

Bu noktada, size basit bir erişim kontrol sisteminin tüm özelliklerini sağladım. İşte bir oyun indirmeniz için bir ZIP dosyasında! Kendi sunucunuzda kullanmak için bazı şeyleri değiştirmeniz gereken yerlerin tümü aşağıda belirtilmiştir. gözü pek Bu makalede.

Yine de eklenecek birkaç şey var:

  • Kullanıcıların parolalarını, e-posta adreslerini ve kullanıcı profillerinizde saklamak istediğiniz diğer seçenekleri ve bilgileri değiştirebilecekleri bir sayfa. Bu açıkça üyelere özel bir sayfa olacak ve $ uid değişkeni, veritabanında hangi kaydın güncelleneceğini belirlemede kullanışlı olacaktır.
  • Kullanıcının kendisine e-postayla gönderilen oturum açma bilgilerini unutmasını sağlayacak bir "bana şifremi gönder" özelliği. Tabii ki, bu özelliği uygulamak istiyorsanız MySQL'in ŞİFRE işlevi kullanılarak şifrelenmiş şifreleri saklayamazsınız (çünkü ŞİFRE geri alınamayan tek yönlü bir işlemdir). Daha fazla güvenlik istiyorsanız, kullanıcının kayıt sırasında unuttuğu bir parolayı almak için yanıtlaması gereken bir soru seçtiği şemalardan birini uygulayabilirsiniz.
  • HTML olmayan dosyalara yalnızca üye erişimi. PHP eşit olarak gönderme yeteneğine sahip olduğundan HTML ve ikili bilgi, yalnızca geçerli oturumda doğru bir $ uid / $ pwd kombinasyonu bulunursa istenen dosyayı alacak bir doğrudan geçiş komut dosyası oluşturabilirsiniz.

Bunlar başlamanıza yardımcı olacak birkaç fikir, eminim daha heyecan verici fikirler düşünebilirsiniz. Onları bir egzersiz olarak tamamlamanız için bırakacağım, ancak sıkışırsanız yardım istemek için uğramaktan çekinmeyin!

Bu gönderiyi okumaktan zevk aldıysanız, Öğrenilebilir'i seveceksiniz; ustalardan yeni beceriler ve teknikler öğrenebileceğiniz yer. Üyeler, SitePoint'in tüm e-kitaplarına ve PHP ve Yeni Başlayanlar için MySQL Web Geliştirme gibi etkileşimli çevrimiçi kurslarına anında erişim elde eder.

Kevin Yank başarılı bir web geliştiricisi, konuşmacısı, eğitmeni ve PHP ve MySQL Kullanarak Kendi Veritabanına Dayalı Web Sitenizi Oluşturun kitabının yazarı ve Simply JavaScript ve CSS Hakkında Bildiğiniz Her Şey Yanlış! Kevin bilgi zenginliğini paylaşmayı seviyor ve bu "kitaplarda bitmedi", aynı zamanda web geliştirmede 3 çevrimiçi kursun kurs eğitmeni. Şu anda Kevin, Culture Amp'de Ön Uç Mühendisliği Direktörüdür.

PHP'deki oturumlar veya sitenin sayfaları arasında gezinirken siteye giren bir kullanıcı veya müşteri hakkındaki verilerin çok fazla zorlanmadan nasıl kaydedildiği. Ders çok önemlidir. Sitelerin %95'inin oluşturulmasıyla ilgilidir.

php'de oturum nedir

Oturumlar, aynı sitenin sayfaları arasında gezinirken geçici veriler (örneğin, kullanıcının siteye girdiği) hakkındaki bilgileri depolamak için kullanılır. Oturumları kullanırken, veriler sunucudaki geçici dosyalara kaydedilir.
Çoğu zaman, çevrimiçi mağazalar, forumlar, mesaj panoları oluştururken oturumlar (ve çerezler de) kullanılır. sosyal ağlar, bloglar ve diğer kaynaklar. Oturum sisteminin kolaylığı, oturum açmış olan kullanıcının/alıcının, verilerinin içinde bulunduğu geçici bilgilerinin saklanmasıdır. hızlı erişim kesin zaman... Oturumun doğal bir sona erme tarihi vardır - tarayıcı kapanana kadar. Yalnızca sayfayı kapatırsanız, siteyi açtığınızda, kullanıcı / alıcı ile ilgili veriler yine mevcut olacaktır.

Oturum mantığı

Oturum (veya oturum) bir tür geçici veri depolamadır. Sizi hemen uyarıyorum, az miktarda veri kaydetmeye değer. Örneğin, oturum açan kullanıcının oturum açma adı ve parolası veya veritabanındaki seri numarası.

iş örneği
1. Kullanıcı bir kullanıcı adı ve şifre girer ve siteye girer
2. Giriş ve şifre ile veriler, sitenin sayfalarından birinin oturumuna kaydedilir:

Dosya index.php

Oturum_başlangıç(); // oturum verilerini kullanmak istediğiniz her dosya, kodun başında "oturum başlat" komutunu içermelidir

$ giriş = "yönetici";
$ şifre = "geç";
$ _SESSION ["giriş"] = $ giriş; // oturum açmayı içeren değişkeni kaydedin
$ _SESSION ["şifre"] = $ şifre; // şifreyi içeren değişkeni kaydet

3. Sitenin başka bir sayfasına gittiğinizde bu veriler de mevcut olacaktır:

Dosya örnek.php(veya başka bir sayfa)

Echo "Giriş bilgileriniz" $ _ SESSION ["giriş"]; // Bu sayfada veri kaydetmemiş olmamıza rağmen, "Girişiniz admin" görüntülenecektir!
Bak, çok basit!

4. Oturum verilerini silmek istiyorsanız, bu yeterlidir:

Dosya örnek.php

Oturum_başlangıç(); // "oturumu yeniden başlat"

Ayarlanmadı ($ _ SESSION ["giriş"]); // değişken bu şekilde kayıtlı değil veya "yok edildi"
echo "Giriş bilgileriniz" $ _ SESSION ["giriş"]; // "Oturum açma bilgileriniz" görüntülenecektir. Son satırda yok ettiğimiz için veri de yok.

Session_destroy(); // oturumu yok et. $ _SESSION ["şifre"] dahil tüm veriler gitti. İstendiğinde, bir hata görüntülenecektir
Genel olarak, böyle bir transfer şuna benzer: POST yöntemi, ancak artık çok fazla gereksiz kod yazmak zorunda değilsiniz ve sayfadan sayfaya aktarılan tüm veriler sunucudaki geçici dosyalarda saklanır. Yine, oturumlar az miktarda veri içermelidir, bu nedenle kullanıcı adı / şifre, alışveriş sepeti ve diğer küçük hacimleri depolamak için uygundur.

PHP oturumu kullanarak bir değer veya dizi geçirme

Bir oturumda, yalnızca bir dize değil, aynı zamanda bir dizi veri de yazabilirsiniz. Sadece dizinin boyutuyla aşırıya kaçmayın, çünkü tüm bunlar sunucudaki performansı ve işgal edilen alanı etkileyecektir.

Biz yine belirli bir başlangıç ​​sayfası index.php

Oturum_başlangıç();

$ r = dizi ("bir", "iki", "üç");

$ _SESSION ["dizi"] = $r;

Her şeyin görüntülendiği sayfaya
Verileri oturumda kaydettik ve tüm verileri göstereceğimiz başka bir sayfanın bağlantısını takip ettik.

Dosya alıcısı, sayfa test.php diziyi nerede açıyoruz

Oturum_başlangıç();
print_r ($ _ OTURUM ["dizi"]);
// çıktı alacak
/*
Dizi
=> bir
=> iki
=> üç
*/
?>
Bir öğretici üzerinde tazelemek isteyebilirsiniz. Genel olarak, her şey açık olmalıdır.

Oturumlarla çalışmak için diğer işlevler

session_unregister (dize)- oturum belirtilen global değişkenin değerini unutur;
session_destroy ()- oturum kapatılır (örneğin, kullanıcı sistemden çıkış düğmesine basarak sistemden ayrıldıysa);
session_set_cookie_params (int ömür boyu [, string yolu [, string etki alanı]])- bu işlevi kullanarak, oturumun ölüm zamanını belirleyen unix_timestamp ayarını yaparak oturumun ne kadar süreceğini ayarlayabilirsiniz.

PHP'de oturumlarla (oturum) çalışmak için işlevlerin listesi
session_cache_expire - Geçerli önbelleğin sona erme tarihini döndürür
session_cache_limiter - Geçerli önbellek sınırını al ve/veya ayarla
session_commit - session_write_close () için bir takma ad
session_decode - Dizedeki oturum verilerinin kodunu çözer
session_destroy - Oturum için kayıtlı tüm verileri yok eder
session_encode - geçerli oturum verilerini bir dize olarak şifreler
session_get_cookie_params - Oturum tanımlama bilgisi parametrelerini alır
session_id - geçerli oturum kimliğini alır ve/veya ayarlar
session_is_registered - oturumda bir değişkenin kayıtlı olup olmadığını belirler
session_module_name - Geçerli oturum için modülü al ve/veya kur
session_name - geçerli oturumun adını alır ve/veya ayarlar
session_regenerate_id - Mevcut oturum kimliğini yeni oluşturulan ile değiştirir
session_register - geçerli oturum için bir veya daha fazla değişken kaydeder
session_save_path - geçerli oturumu kaydetme yolunu alır ve/veya ayarlar
session_set_cookie_params - oturum tanımlama bilgisi parametrelerini ayarlar
session_set_save_handler - kullanıcı düzeyinde oturum depolama işlevlerini ayarlar
session_start - oturum verilerini başlatır
session_unregister - Geçerli oturumdaki bir değişkenin kaydını siler
session_unset - Tüm oturum değişkenlerini serbest bırakır
session_write_close - Oturum verilerini ve oturumun sonunu yazar

Oturum örnekleri

Oturum sırasındaki sayfa görüntüleme sayacı. Açıklayıcı bir çalışma örneği. Ancak, tarayıcıyı kapattıktan sonra geri sayım yeniden başlayacaktır.

Bir oturumda bir sayfaya yapılan ziyaretlerin sayacı

// Çerezler olmadan oturum kullanmanın basit bir örneği.
oturum_adı ("deneme");
oturum_başlangıç();
$ _SESSION ["sayım"] = @ $ _ SESSION ["sayım"] + 1;
?>

Tezgah


Tarayıcıyla yapılan mevcut çalışma oturumunda bu sayfayı açtınız
zamanlar).
Bu sayacı sıfırlamak için tarayıcınızı kapatın.
Sayfayı yenilemek için buraya tıklayın!
Her geçişte sayaç 1 artacaktır.

Dikkatiniz için teşekkürler! Çalışmalarınızda iyi şanslar!

Merhaba sevgili topluluk.

Öncelikle çok faydalı bir kaynak olduğu için teşekkür etmek istiyorum. Bir kereden fazla burada birçok ilginç fikir ve pratik tavsiye buldum.

Bu makalenin amacı, PHP'de oturum kullanmanın tuzaklarını vurgulamaktır. Tabii ki, PHP belgeleri ve bir ton örnek var ve bu makalenin amacı bu değil. eksiksiz rehber... Oturumlarla çalışmanın bazı nüanslarını ortaya çıkarmak ve geliştiricileri gereksiz yere zaman kaybetmekten korumak için tasarlanmıştır.

Oturumlar için en yaygın kullanım durumu, elbette, kullanıcı yetkilendirmesidir. Yeni zorluklar ortaya çıktıkça tutarlı bir şekilde geliştirebilmemiz için en temel uygulamayla başlayalım.

(Yerden ve zamandan tasarruf etmek için, burada güzel bir sınıf hiyerarşisi, kapsamlı hata işleme ve diğer doğru şeyler ile tam teşekküllü bir test uygulaması oluşturmak yerine, örneklerde kendimizi yalnızca oturumlarla çalışmanın işlevleriyle sınırlayacağız).

startSession () işlevi (// Oturum zaten başlatılmışsa, yürütmeyi durdurun ve TRUE döndürün // (php.ini ayarlar dosyasındaki session.auto_start parametresi devre dışı bırakılmalıdır - varsayılan değer) if (session_id ()) return true; else return session_start (); // Not: 5.3.0 sürümünden önce, session_start () işlevi hata durumunda bile DOĞRU döndürdü. // 5.3.0'ın altında bir sürüm kullanıyorsanız, ek doğrulama session_id yapın ( ) // session_start() işlevini çağırdıktan sonra destroySession() (if (session_id())) (// Varsa aktif oturum, oturum çerezlerini sil, setcookie (session_name()), session_id(), time() - 60*60*24); // ve session_unset() oturumunu yok et; session_destroy(); ))

Not: Okuyucunun temel PHP oturumları bilgisine sahip olduğu varsayıldığından, session_start() ve session_destroy() işlevlerinin nasıl çalıştığını ele almayacağız. Oturum açma formunun düzeni ve kullanıcı doğrulama görevleri makalenin konusu ile ilgili değildir, bu yüzden onları da atlayacağız. Size hatırlatmama izin verin, sonraki her istekte kullanıcıyı tanımlamak için, başarılı oturum açma anında, kullanıcı kimliğini sonraki tüm sürümlerde kullanılabilecek bir oturum değişkenine (örneğin, kullanıcı kimliği adıyla) kaydetmemiz gerekir. oturumun ömrü boyunca istekler. Ayrıca startSession() fonksiyonumuzun sonucunun işlenmesini de uygulamak gerekiyor. İşlev YANLIŞ döndürürse, oturum açma formunu tarayıcıda görüntüleyin. İşlev DOĞRU döndürürse ve yetkili kullanıcının tanımlayıcısını (bizim durumumuzda kullanıcı kimliği) içeren oturum değişkeni varsa, yetkili kullanıcının sayfasını görüntüleyin (hata işleme hakkında daha fazla ayrıntı için, 2013-06-'den itibaren eke bakın). 07, oturum değişkenleri bölümünde).

Buraya kadar her şey açık. Sorular, kullanıcı hareketsizliği (oturum zaman aşımı) denetiminin uygulanması, birkaç kullanıcının aynı anda tek bir tarayıcıda çalışmasına ve ayrıca oturumların yetkisiz kullanıma karşı korunması gerektiğinde başlar. Bu konuya aşağıda tekrar değinilecektir.

Yerleşik PHP araçlarıyla kullanıcı hareketsizliğini kontrol etme

Kullanıcılar için her türlü konsolun geliştiricileri arasında sıklıkla ortaya çıkan ilk soru, kullanıcının herhangi bir işlem yapmaması durumunda oturumun otomatik olarak sonlandırılmasıdır. PHP'nin yerleşik yeteneklerini kullanmaktan daha kolay olamazdı. (Bu seçenek çok güvenilir ve esnek değildir, ancak eksiksiz olması için düşünelim).

fonksiyon startSession () (// Kullanıcı hareketsizlik zaman aşımı (saniye olarak) $ sessionLifetime = 300; if (session_id ()) return true; // Çerez ömrünü ayarlayın ini_set ("session.cookie_lifetime", $ sessionLifetime); // Eğer kullanıcı hareketsizliği zaman aşımı ayarlandı, sunucuda oturum ömrünü ayarlayın // Not: Bir üretim sunucusu için, php.ini dosyasında bu parametreleri önceden ayarlamanız önerilir if ($ sessionLifetime) ini_set ("session.gc_maxlifetime", $ sessionLifetime ); if (session_start ( )) (setcookie (session_name (), session_id (), time () + $ sessionLifetime); true döndürme;) yoksa false döndürme;)

Birkaç açıklama. Bildiğiniz gibi PHP, tarayıcı tarafından istek başlığında iletilen çerezin adıyla hangi oturumun başlayacağını belirler. Tarayıcı da bu tanımlama bilgisini session_start() işlevinin yerleştirdiği sunucudan alır. Çerezin tarayıcıda süresi dolmuşsa, istekte iletilmez, bu da PHP'nin hangi oturumun başlayacağını belirleyemeyeceği ve bunu yeni bir oturum oluşturma olarak kabul edeceği anlamına gelir. Parametre PHP ayarları Kullanıcı hareketsizliği zaman aşımına ayarlanan session.gc_maxlifetime, PHP oturum ömrünü ayarlar ve sunucu tarafından izlenir. Oturum yaşam boyu denetimi aşağıdaki gibi çalışır (burada PHP'deki en yaygın ve varsayılan sürüm olarak geçici dosyalardaki bir oturum depolama örneğini ele alıyoruz).

Yeni bir oturum oluşturulurken, PHP ayarları parametresi session.save_path içinde oturumları depolamak için dizin olarak ayarlanan dizinde sess_ adlı bir dosya oluşturulur. , nerede - oturum tanımlayıcısı. Ayrıca, her istekte, mevcut bir oturumun başlatıldığı anda PHP bu dosyanın değişiklik zamanını günceller. Bu nedenle, her bir sonraki istekte PHP, geçerli saat ile oturum dosyasının son değişiklik zamanı arasındaki farka göre, oturumun etkin olup olmadığını veya kullanım süresinin dolmuş olup olmadığını belirleyebilir. (Eski oturum dosyalarını silme mekanizması bir sonraki bölümde daha ayrıntılı olarak tartışılmaktadır).

Not: Burada, session.gc_maxlifetime parametresinin bir sunucu içindeki (daha doğrusu, bir ana PHP işlemi içindeki) tüm oturumları etkilediğine dikkat edilmelidir. Pratikte bu, sunucuda birkaç site çalışıyorsa ve her birinin kendi kullanıcı hareketsizliği zaman aşımına sahip olması durumunda, bu parametrenin sitelerden birine ayarlanması, diğer siteler için de yüklenmesine yol açacağı anlamına gelir. Aynı şey paylaşılan barındırma için de geçerlidir. Bu durumdan kaçınmak için, bir sunucu içindeki her site için ayrı oturum dizinleri kullanılır. Oturum dizinine giden yolun ayarlanması, php.ini ayarlar dosyasındaki session.save_path parametresi kullanılarak veya ini_set () işlevi çağrılarak yapılır. Bundan sonra, her sitenin oturumları ayrı dizinlerde saklanacak ve sitelerden birinde ayarlanan session.gc_maxlifetime parametresi yalnızca oturumu için geçerli olacaktır. Özellikle stokta kullanıcının hareketsizliğini kontrol etmek için daha esnek bir seçeneğe sahip olduğumuz için bu durumu ayrıntılı olarak ele almayacağız.

Oturum değişkenlerini kullanarak kullanıcı hareketsizliğini kontrol etme

Görünüşe göre önceki seçenek, tüm basitliği için (sadece birkaç ek kod satırı) ihtiyacımız olan her şeyi veriyor. Ama ya her istek, kullanıcı etkinliğinin bir sonucu olarak kabul edilemezse? Örneğin, sayfanın sunucudan güncellemeleri almak için periyodik olarak bir AJAX isteğinde bulunan bir zamanlayıcısı vardır. Bu tür bir istek, kullanıcı etkinliği olarak kabul edilemez; bu, bu durumda oturum ömrünün otomatik olarak uzatılmasının doğru olmadığı anlamına gelir. Ancak, PHP'nin, session_start () işlevine yapılan her çağrıyla, oturum dosyası değiştirme zamanını otomatik olarak güncellediğini biliyoruz; bu, herhangi bir isteğin oturum ömrünün uzamasına yol açacağı ve kullanıcının hareketsizlik zaman aşımının asla gerçekleşmeyeceği anlamına gelir. Ayrıca, session.gc_maxlifetime parametresinin incelikleriyle ilgili önceki bölümdeki son not, uygulanması çok kafa karıştırıcı ve karmaşık görünebilir.

Bu sorunu çözmek için, yerleşik PHP mekanizmalarını kullanmayı bırakacağız ve kullanıcı hareketsizliği zamanını kendi başımıza kontrol etmemize izin verecek birkaç yeni oturum değişkeni tanıtacağız.

startSession ($ isUserActivity = true) ($ sessionLifetime = 300; if (session_id ()) return true; // Çerez ömrünü tarayıcı kapanana kadar ayarlayın (her şeyi sunucu tarafında kontrol edeceğiz) ini_set ("session.cookie_lifetime" ", 0) ; if (! session_start ()) return false; $ t = zaman (); if ($ sessionLifetime) (// Kullanıcı hareketsizlik zaman aşımı ayarlanmışsa, // son kullanıcı etkinliğinden bu yana geçen süreyi kontrol edin / / (lastactivity oturum değişkeni güncellendiğinde son isteğin zamanı) if (isset ($ _ SESSION ["lastactivity"]) && $ t - $ _ SESSION ["lastactivity"]> = $ sessionLifetime) (// son kullanıcı etkinliğinin üzerinden geçen süre // daha fazla hareketsizlik zaman aşımı, oturumun süresi dolmuştur ve oturumu sonlandırmanız gerekir destroySession(); return false;) else (// Zaman aşımı henüz gerçekleşmediyse, // ve eğer istek, kullanıcı etkinliğinin bir sonucu olarak geldi, // lastactivity değişkenini mevcut vr'nin değeriyle güncelleyin emeny, // böylece oturum süresini başka bir oturumla uzatırÖmür boyu saniye if ($ isUserActivity) $ _SESSION ["lastactivity"] = $ t; )) true döndür; )

Özetleyelim. Her istekte, son kullanıcı etkinliğinin olduğu andan içinde bulunulan ana kadar zaman aşımına ulaşılıp ulaşılmadığını kontrol ederiz ve ulaşılırsa, FALSE döndürerek oturumu yok eder ve işlevin yürütülmesini durdururuz. Zaman aşımına ulaşılmamışsa ve TRUE değerine sahip $ isUserActivity parametresi fonksiyona geçirilmişse, son kullanıcı etkinliğinin zamanını güncelliyoruz. Tek yapmamız gereken, çağrı komut dosyasında isteğin kullanıcı etkinliğinin sonucu olup olmadığını belirlemek ve değilse, $ isUserActivity parametresinin değeri FALSE'e eşit olan startSession işlevini çağırmaktır.

2013-06-07 itibariyle güncelleme
sessionStart () işlevinin sonucunun işlenmesi

Yorumlarda, YANLIŞ döndürmenin hatanın nedenini tam olarak anlamadığını fark ettik ve bu kesinlikle doğru. Burada ayrıntılı hata işlemeyi yayınlamadım (makalenin hacmi zaten küçük değil), çünkü bu doğrudan makalenin konusuyla ilgili değil. Ama yorumlara göre açıklayacağım.

Gördüğünüz gibi, sessionStart işlevi iki durumda FALSE döndürebilir. Bazı dahili sunucu hataları (örneğin, php.ini'deki yanlış oturum ayarları) nedeniyle oturum başlatılamadı veya oturumun süresi doldu. İlk durumda, kullanıcıyı sunucuda sorun olduğuna dair bir hata içeren bir sayfaya ve bir desteğe başvurma şekline yönlendirmemiz gerekir. İkinci durumda, kullanıcıyı oturum açma formuna aktarmalı ve içinde oturumun sona erdiğini belirten ilgili bir mesaj göstermeliyiz. Bunun için hata kodlarını girip FALSE yerine karşılık gelen kodu döndürmemiz ve call method'da kontrol edip ona göre hareket etmemiz gerekiyor.

Şimdi, sunucudaki oturum hala mevcut olsa bile, kullanıcı hareketsizlik zaman aşımı süresi dolmuşsa, ilk erişildiğinde yok edilecektir. Ve bu, global PHP ayarlarında hangi oturum ömrünün ayarlandığına bakılmaksızın gerçekleşecektir.

Not: Tarayıcı kapatılırsa ve oturum adı tanımlama bilgisi otomatik olarak yok edilirse ne olur? Tarayıcının bir sonraki açılışında sunucuya yapılan istek, oturum tanımlama bilgilerini içermeyecek ve sunucu bir oturum açamayacak ve kullanıcının hareketsizliğinin zaman aşımını kontrol edemeyecektir. Bizim için bu, yeni bir oturum oluşturmakla eşdeğerdir ve işlevselliği veya güvenliği hiçbir şekilde etkilemez. Ancak adil bir soru ortaya çıkıyor - zaman aşımı sona erdikten sonra şimdiye kadar yok ettiysek, eski oturumu kim yok edecek? Yoksa sonsuza kadar oturum dizininde mi kalacak? PHP'nin eski oturumları temizlemek için çöp toplama adı verilen bir mekanizması vardır. Sunucuya bir sonraki istekte başlar ve tüm eski oturumları, oturum dosyalarının son değişiklik tarihine göre temizler. Ancak sunucuya yapılan her istekte çöp toplama mekanizması başlamaz. Başlatma sıklığı (daha doğrusu olasılık), session.gc_probability ve session.gc_divisor adlı iki ayar parametresi tarafından belirlenir. Birinci parametrenin ikinciye bölünmesinin sonucu, çöp toplama mekanizmasının başlama olasılığıdır. Bu nedenle, sunucuya yapılan her istekte oturum temizleme mekanizmasının başlaması için bu parametrelerin eşit değerlere, örneğin "1"e ayarlanması gerekir. Bu yaklaşım, oturum dizininin temiz olmasını sağlar, ancak açıkçası sunucu için çok fazla yüktür. Bu nedenle, üretim sistemlerinde session.gc_divisor varsayılan olarak 1000'e ayarlanmıştır; bu, çöp toplama motorunun 1/1000 olasılıkla başlayacağı anlamına gelir. Bu ayarları php.ini dosyanızda denerseniz, yukarıdaki durumda, tarayıcı kapandığında ve tüm çerezlerini temizlediğinde, oturum dizininde bir süreliğine hala eski oturumlar olduğunu fark edeceksiniz. Ama bu seni endişelendirmemeli, çünkü daha önce de belirtildiği gibi, bu hiçbir şekilde mekanizmamızın güvenliğini etkilemez.

2013-06-07 itibariyle güncelleme

Oturum dosyasının engellenmesi nedeniyle komut dosyalarının askıda kalmasını önleme

Yorumlarda, oturum dosyasının engellenmesi nedeniyle aynı anda çalışan komut dosyalarının donması sorununu gündeme getirdiler (en parlak seçenek olarak - uzun anket).

Başlangıç ​​olarak, bu sorunun doğrudan sunucu yüküne veya kullanıcı sayısına bağlı olmadığını not ediyorum. Tabii ki, ne kadar çok istek olursa, betikler o kadar yavaş çalışır. Ancak bu dolaylı bir bağımlılıktır. Sorun yalnızca bir oturumda, sunucu bir kullanıcı adına birkaç istek aldığında ortaya çıkar (örneğin, bunlardan biri uzun ankettir ve geri kalanı sıradan isteklerdir). Her istek aynı oturum dosyasına erişmeye çalışır ve önceki istek dosyanın kilidini açmadıysa, bir sonraki istek askıda kalır.

Oturum dosyalarını engellemeyi minimumda tutmak için, oturum değişkenleriyle tüm eylemler gerçekleştirildikten hemen sonra session_write_close () işlevini çağırarak oturumu kapatmanız şiddetle önerilir. Pratikte bu, her şeyi oturum değişkenlerinde saklamamanız ve betiğin yürütülmesi boyunca bunlara başvurmanız gerektiği anlamına gelir. Ve bazı çalışma verilerini oturum değişkenlerinde depolamak gerekirse, oturumun başında hemen okuyun, daha sonra kullanmak üzere yerel değişkenlere kaydedin ve oturumu kapatın (yani, oturumu session_write_close işlevini kullanarak kapatmak ve oturumu kapatmak değil). session_destroy kullanarak).

Örneğimizde bu, bir oturumu açtıktan hemen sonra, oturumun ömrünü ve yetkili bir kullanıcının varlığını kontrol ettikten sonra, uygulama için gerekli tüm ek oturum değişkenlerini (varsa) okuyup kaydetmemiz, ardından oturumu session_write_close () kullanarak kapatmamız gerektiği anlamına gelir. ) uzun bir anket veya normal bir istek olsun, bir komut dosyasının yürütülmesini çağırın ve devam ettirin.

Oturumları yetkisiz kullanıma karşı koruma

Bir durum hayal edelim. Kullanıcılarınızdan biri, tarayıcı tanımlama bilgisini (oturumumuzun depolandığı) çalan ve belirtilen e-postaya gönderen bir Truva Atı takar. Saldırgan bir tanımlama bilgisi alır ve bunu yetkili kullanıcımız adına bir istekte bulunmak için kullanır. Sunucu, bu isteği yetkili bir kullanıcıdan gelmiş gibi başarıyla kabul eder ve işler. IP adresinin ek doğrulaması uygulanmazsa, böyle bir saldırı, tüm sonuçlarıyla birlikte kullanıcının hesabının başarılı bir şekilde hacklenmesine yol açacaktır.

Bu neden mümkün? Açıkça, ad ve oturum tanımlayıcısı, oturumun tüm ömrü boyunca her zaman aynı olduğundan ve bu verileri alırsanız, başka bir kullanıcı adına özgürce istek gönderebilirsiniz (doğal olarak, bu oturumun ömrü boyunca). Belki de bu en yaygın saldırı türü değildir, ancak teoride her şey oldukça uygun görünüyor, özellikle böyle bir Truva Atı'nın kullanıcının tarayıcı çerezlerini soymak için yönetici haklarına bile ihtiyacı olmadığı düşünüldüğünde.

Bu tür saldırılara karşı nasıl savunma yapabilirsiniz? Yine, açıkçası, oturum tanımlayıcısının ömrünü sınırlayarak ve tanımlayıcıyı bir oturumda periyodik olarak değiştirerek. Ayrıca oturumun adını değiştirebilir, eskisini tamamen silip yeni bir oturum oluşturarak, tüm oturum değişkenlerini eskisinden ona kopyalayabiliriz. Ancak bu, yaklaşımın özünü etkilemez, bu nedenle basitlik için kendimizi yalnızca oturum tanımlayıcısıyla sınırlayacağız.

Oturum tanımlayıcısının ömrü ne kadar kısa olursa, bir saldırganın bir kullanıcının isteğini oluşturmak için çerezleri almak ve kullanmak için o kadar az zaman alacağı açıktır. İdeal olarak, her istek için başka birinin oturumunu kullanma olasılığını en aza indirecek yeni bir tanımlayıcı kullanılmalıdır. Ancak, oturum kimliğini yeniden oluşturma zamanının keyfi olarak ayarlandığı genel durumu ele alacağız.

(Kodun daha önce tartışılmış olan kısmını çıkaralım).

fonksiyon startSession ($ isUserActivity = true) (// Oturum Kimliği ömrü $ idLifetime = 60; ... if ($ idLifetime) (// Oturum kimliği yaşam süresi ayarlanmışsa, // oturumun oluşturulmasından bu yana geçen süreyi kontrol edin veya son yeniden oluşturma // (başlangıç ​​zamanı oturum değişkeni güncellendiğinde son isteğin zamanı) if (isset ($ _ SESSION ["starttime"])) (if ($ t - $ _ SESSION ["starttime"]> = $) idLifetime) (// Oturum kimliğinin süresi doldu // Yeni bir kimlik oluştur session_regenerate_id (true); $ _SESSION ["starttime"] = $ t;)) else (// Oturum yeni oluşturulduysa buraya geliriz // Ayarla geçerli zamanda oturum kimliği oluşturma zamanı $ _SESSION ["starttime"] = $ t;)) return true;)

Bu nedenle, yeni bir oturum oluştururken (kullanıcı başarıyla oturum açtığında gerçekleşir), bizim için oturum tanımlayıcısının son neslinin zamanını saklayan oturum değişkeni başlangıç ​​zamanını mevcut sunucu zamanına eşit bir değere ayarladık. Ayrıca her istekte, tanımlayıcının son neslinden bu yana yeterli sürenin (idLifetime) geçip geçmediğini kontrol ediyoruz ve geçtiyse yeni bir tane oluşturuyoruz. Böylece, tanımlayıcının belirtilen ömrü içinde, yetkili kullanıcının çerezini alan saldırgan onu kullanmayı başaramazsa, sahte istek sunucu tarafından yetkisiz olarak kabul edilecek ve saldırgan oturum açma sayfasına yönlendirilecektir.

Not: Yeni oturum tanımlayıcısı, session_regenerate_id() işlevi çağrıldığında, session_start() işlevine benzer şekilde yeni bir çerez gönderen tarayıcı çerezine girer, bu nedenle çerezleri kendimiz güncellememiz gerekmez.

Oturumlarımızı olabildiğince güvenli hale getirmek istiyorsak, tanımlayıcının ömrünü bir olarak ayarlamak, hatta session_regenerate_id() işlevini parantezlerin dışına koymak ve tanımlayıcının yeniden oluşturulmasına yol açacak tüm kontrolleri kaldırmak yeterlidir. her istekte. (Bu yaklaşımın performans üzerindeki etkisini test etmedim ve yalnızca session_regenerate_id (true) işlevinin temelde yalnızca 4 eylemi gerçekleştirdiğini söyleyebilirim: yeni bir tanımlayıcı oluşturma, oturum tanımlama bilgisinden bir başlık oluşturma, eskisini silme ve yeni bir oturum dosyası oluşturma).

Lirik arasöz: Truva atının saldırgana çerez göndermeyecek kadar akıllı olduğu ortaya çıkarsa, ancak çerezin alınmasından hemen sonra önceden hazırlanmış bir sahte istek gönderilmesini organize ederse, yukarıda açıklanan yöntem büyük olasılıkla koruma sağlayamaz. böyle bir saldırıya karşı, çünkü Truva Atı'nın çerezi aldığı zaman ile sahte olanın gönderilmesi arasında, istekte pratikte hiçbir fark olmayacak ve bu noktada oturum kimliğinin yeniden oluşturulmama olasılığı yüksek.

Birkaç kullanıcı adına tek bir tarayıcıda aynı anda çalışabilme

Düşünmek istediğim son görev, birkaç kullanıcı için bir tarayıcıda aynı anda çalışma olasılığı. Bu özellik, özellikle kullanıcıların eşzamanlı çalışmasını taklit etmeniz gerektiğinde, test aşamasında kullanışlıdır ve bunu favori tarayıcınızda yapmanız ve mevcut cephaneliğin tamamını kullanmamanız veya tarayıcının birden fazla örneğini "gizli modda açmamanız" önerilir. " modu.

Önceki örneklerimizde, oturum adını açıkça belirlemedik, bu nedenle varsayılan PHP adı (PHPSESSID) kullanıldı. Bu, şu ana kadar oluşturduğumuz tüm oturumların tarayıcıya PHPSESSID adı altında çerezler gönderdiği anlamına gelir. Açıkçası, çerezin adı her zaman aynıysa, aynı tarayıcı içinde aynı ada sahip iki oturum düzenlemenin bir yolu yoktur. Ancak her kullanıcı için farklı bir oturum adı kullansaydık sorun çözülürdü. Yani yapacağız.

fonksiyon startSession ($ isUserActivity = true, $ prefix = null) (... if (session_id ()) return true; // Parametrelerde kullanıcı öneki iletilmişse, // bunu içeren benzersiz bir oturum adı ayarlayın prefix, // aksi takdirde tüm kullanıcılar için ortak bir ad belirleyin (örneğin, BENİM PROJEM) session_name ("PROJEM". ($ önek? "_". $ önek: "")); ini_set ("session.cookie_lifetime", 0) ; if (! session_start ()) false döndürür; ...)

Şimdi geriye kalan tek şey, çağıran komut dosyasının her kullanıcı için startSession () işlevine benzersiz bir önek geçirmesini sağlamaktır. Bu, örneğin, her isteğin GET / POST parametrelerinde bir önek ileterek veya ek bir çerez aracılığıyla yapılabilir.

Çözüm

Sonuç olarak, yukarıda tartışılan tüm görevler de dahil olmak üzere PHP oturumlarıyla çalışmak için işlevlerimizin tam kodunu vereceğim.

startSession ($ isUserActivity = true, $ prefix = null) ($ sessionLifetime = 300; $ idLifetime = 60; if (session_id ()) true dönerse; session_name ("MYPROJECT". ($ Önek? "_". $ Önek: "")); ini_set ("session.cookie_lifetime", 0); if (! session_start ()) return false; $ t = zaman (); if ($ sessionLifetime) (if (isset ($ _ SESSION ["lastactivity") ] ) && $ t - $ _ SESSION ["lastactivity"]> = $ sessionLifetime) (destroySession (); return false;) else (if ($ isUserActivity) $ _SESSION ["lastactivity"] = $ t;)) if ( $ idLifetime ) (if (isset ($ _ SESSION ["starttime"])) (if ($ t - $ _ SESSION ["starttime"]> = $ idLifetime) (session_regenerate_id (true); $ _SESSION ["starttime"] = $ t; )) else ($ _SESSION ["starttime"] = $ t;)) return true;) function destroySession () (if (session_id ()) (session_unset (); setcookie (session_name (), session_id ()) , zaman () -60 * 60 * 24); session_destroy ();))

Umarım bu makale, oturum mekanizmasına hiç girmemiş olanlar için biraz zaman kazandıracak ve PHP ile yeni tanışmaya başlayanlar için bu mekanizmayı yeterince anlayacaktır.

Bir kullanıcı adı ve şifreye mi ihtiyacınız var?

İnternet üzerinden makale göndermek ve gönderilen makalelerin durumunu kontrol etmek için kayıt olmanız ve hesabınızla oturum açmanız gerekir.

Gönderi İçin Makale Hazırlama Kontrol Listesi

Makale gönderme sürecinin bir parçası olarak, yazarlar makalelerinin aşağıdaki noktaların tümünü karşıladığını doğrulamalıdır ve bu gereksinimleri karşılamayan makaleler yazarlara iade edilebilir.

    Makale gereksinimlere uygun olarak hazırlanmıştır.

Telif hakkı devri şartları

Yazarlar, çalışmanın telif hakkını elinde tutar ve diğerlerinin yeniden dağıtmasına izin veren bir Creative Commons Atıf Lisansı altında lisans verirken, ilk yayını eserle birlikte dergiye devreder. bu iş bu çalışmanın yazarlığının zorunlu olarak belirtilmesi ve bu dergideki orijinal yayına bir bağlantı ile.

Gizlilik bildirimi

İsimler ve adresler E-posta Bu derginin sitesine girilen bilgiler münhasıran bu derginin belirttiği amaçlar için kullanılacak olup, başka bir amaçla kullanılmayacak veya başka kişi ve kuruluşlara verilmeyecektir.

Kullanıcı, sisteme kaydolmadan önce kişisel verilerin işlenmesi ve saklanması politikasını kabul eder.

Yazar ödemeleri

1500 karakter boşluklu: 300,00 (RUB)

El yazmasının 1 sayfasının yayınlanması (1500 karakter) - 300 ruble. Grafik malzemeleri / tablolar ayrı olarak ödenir - 50 ruble / 1 adet. Yazarın Rusya içinde nakliye de dahil olmak üzere kopyası, yazarın talebi üzerine ödenir - 400 ruble. Yurtdışına transfer - 800 ruble. Yayın için materyalin kabul sertifikası göndermenin maliyeti 150 ruble.

Ekteki bilgilerin (yazarların tam adı, çalışma yeri; başlık; özet; anahtar kelimeler) tercümesi İngilizce Boşluklar dahil her karakter için 0,5 ruble.

Dikkat! elibrary.ru'ya göre 300 veya daha fazla atıf alan yazarlar (adaylar ve bilim doktorları) ücretsiz olarak yayınlanır (kendilerine yapılan atıfların payı %30'dan fazla olmamalıdır). Ücretsiz bir yayın hakkınız varsa, yorumlar alanına materyal gönderirken, alıntı sayısıyla birlikte kitaplıktaki profilinize bir bağlantı belirtin. Koleksiyonun nakliye masrafları ayrıca ödenir.