Bu kılavuz, oturumlarınızı bir mySQL veritabanında nasıl güvenli bir şekilde saklayabileceğinizi gösterecektir. Ayrıca, veritabanına giren tüm oturum verilerini şifreleyeceğiz; bu, herhangi biri veritabanına girmeyi başarırsa, tüm oturum verilerinin 256 bit AES şifrelemesi ile şifreleneceği anlamına gelir.
adımlar
Yöntem 1/3: mySQL Veritabanını Yapılandır
Adım 1. Bir MySQL veritabanı oluşturun
Bu rehberde "secure_sessions" adında bir veritabanı oluşturacağız.
Nasıl phpMyAdmin-in-Veritabanı-oluşturulacağını görün.
Veya aşağıdaki SQL kodunu kullanabilirsiniz, sizin için bir tane oluşturacaktır.
Veritabanı Kodu Oluştur:
CREATE DATABASE `secure_sessions`;
Not: Bazı barındırma hizmetleri, phpMyAdmin aracılığıyla bir veritabanı oluşturmanıza izin vermez, cPanel'de nasıl yapılacağını öğrenin.
Adım 2. Yalnızca SELECT, INSERT ve DELETE ayrıcalıklarına sahip bir kullanıcı oluşturun
Bu, komut dosyamızda bir güvenlik ihlali olursa, bilgisayar korsanının veritabanımızdan tabloları bırakamayacağı anlamına gelir. Gerçekten paranoyaksanız, her işlev için farklı bir kullanıcı oluşturun.
-
kullanıcı:
"sn_kullanıcı"
-
Parola:
"eKcGZr59zAa2BEWU"
Kullanıcı Kodu Oluştur:
'eKcGZr59zAa2BEWU' TARAFINDAN TANIMLANAN 'sec_user'@'localhost' KULLANICI OLUŞTURMA; `secure_sessions` ÜZERİNDE SEÇİM, EKLE, GÜNCELLEME, SİLME VERİN.* 'sec_user'@'localhost' için;
Not: Kendi sunucunuzda çalıştırırken yukarıdaki kodda bulunan şifreyi değiştirmenizde fayda var. (PHP kodunuzu da değiştirdiğinizden emin olun.) Hatırlayabileceğiniz bir parola olması gerekmediğini unutmayın, bu nedenle make mümkün olduğunca karmaşıktır. İşte rastgele bir şifre üreticisi.
Adım 3. "Oturumlar" adlı bir MySQL tablosu oluşturun
Aşağıdaki kod 4 alanlı bir tablo oluşturur (id, set_time, data, session_key).
"Oturumlar" tablosunu oluşturun:
CREATE TABLE `oturumlar` (`id` karakter(128) NULL DEĞİL, `set_time` karakter(10) NULL DEĞİL, `veri' metni NULL DEĞİL, `session_key' karakter(128) NULL DEĞİL, BİRİNCİL ANAHTAR (`id')) MOTOR=InnoDB DEFAULT CHARSET=latin1;
"id" ve "session_key" alanları her zaman 128 karakter uzunluğunda olacağından, uzunluğunu bildiğimiz alanlar için CHAR veri türünü kullanırız. Burada CHAR kullanmak, işlem gücünden tasarruf sağlar.
Yöntem 2/3: session.class.php dosyası oluşturun
Adım 1. Sınıf Oluşturun
Yeni bir sınıfa başlamak için aşağıdaki kodu girmeniz gerekecek:
Yeni Sınıf:
sınıf oturumu {
Adım 2. _construct işlevi oluşturun
Bu işlev, 'session' sınıfını kullanarak bir nesnenin yeni bir örneğini her oluşturduğumuzda çağrılır. PHP _construct işlevini buradan okuyabilirsiniz.
Bu işlev, özel oturum işleyicimizi, sınıf başlatılır başlatılmaz (yani, yapıldı/inşa edildi/inşa edildi) kullanıma hazır olacak şekilde ayarlar.
_yapı işlevi:
function _construct() { // özel oturum fonksiyonlarımızı ayarlayın. session_set_save_handler(array($bu, 'açık'), dizi($bu, 'kapat'), dizi($bu, 'oku'), dizi($bu, 'yaz'), dizi($bu, 'yok'), dizi($bu, 'gc')); // Bu satır, nesneleri kaydetme işleyicileri olarak kullanırken beklenmeyen etkileri önler. register_shutdown_function('session_write_close'); }
Adım 3. start_session işlevi oluşturun
Bu fonksiyon her yeni oturum başlatmak istediğinizde çağrılır, session_start(); yerine onu kullanın. Her satırın ne yaptığını görmek için koddaki yorumlara bakın.
start_session işlevi:
function start_session($session_name, $secure) { // Oturum çerezinin javascript ile erişilebilir olmadığından emin olun. $httpyalnızca = doğru; // Oturum için kullanılacak hash algoritması. (mevcut karmaların bir listesini almak için hash_algos() kullanın.) $session_hash = 'sha512'; // Hash olup olmadığını kontrol edin if (in_array($session_hash, hash_algos())) { // Has fonksiyonunu ayarlayın. ini_set('session.hash_function', $session_hash); } // Karma karakter başına kaç bit. // Olası değerler '4' (0-9, a-f), '5' (0-9, a-v) ve '6' (0-9, a-z, A-Z, "-", ", "). ini_set('session.hash_bits_per_character', 5); // Oturumu URL değişkenlerini değil, yalnızca çerezleri kullanmaya zorlayın. ini_set('session.use_only_cookies', 1); // Oturum tanımlama bilgisi parametrelerini al $cookieParams = session_get_cookie_params(); // parametrelerini session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // Oturum adını değiştirin session_name($session_name); // Şimdi oturumu başlatıyoruz session_start(); // Bu satır, oturumu yeniden oluşturur ve eskisini siler. // Ayrıca veritabanında yeni bir şifreleme anahtarı oluşturur. session_regenerate_id(doğru); }
Adım 4. Açık fonksiyon oluşturun
Bu fonksiyon PHP oturumları tarafından yeni bir oturum başlattığımızda çağrılacak, onu yeni bir veritabanı bağlantısı başlatmak için kullanıyoruz.
açık fonksiyon:
function open() { $host = 'localhost'; $kullanıcı = 'sec_user'; $geçiş = 'eKcGZr59zAa2BEWU'; $isim = 'secure_sessions'; $mysqli = new mysqli($host, $user, $pass, $name); $bu->db = $mysqli; true döndür; }
Adım 5. Kapatma işlevi oluşturun
Bu fonksiyon, oturumlar kapatılmak istendiğinde çağrılır.
kapat işlevi:
function kapat() { $bu->db->kapat(); true döndür; }
Adım 6. Okuma işlevi oluşturun
Bu işlev PHP tarafından bir oturuma erişmeye çalıştığımızda, örneğin echo $_SESSION['something']; kullandığımızda çağrılır. Tek bir sayfada bu fonksiyona çok sayıda çağrı olabileceğinden, sadece güvenlik için değil performans için de hazırlanan ifadelerden yararlanıyoruz. İfadeyi yalnızca bir kez hazırlıyoruz, sonra birçok kez çalıştırabiliriz.
Ayrıca veritabanında şifrelenen oturum verilerinin şifresini de çözüyoruz. Oturumlarımızda 256 bit AES şifreleme kullanıyoruz.
okuma fonksiyonu:
function read($id) { if(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare("WHERE id = ? LIMIT 1"); } $this->read_stmt->bind_param('s', $id); $this->read_stmt->execute(); $this->read_stmt->store_result(); $this->read_stmt->bind_result($veri); $this->read_stmt->getir(); $anahtar = $bu->getkey($id); $veri = $bu->şifresini çöz($veri, $anahtar); $veri döndür; }
Adım 7. Yazma işlevi oluşturun
Bu fonksiyon, bir oturuma bir değer atadığımızda kullanılır, örneğin $_SESSION['something'] = 'something other';. İşlev, veritabanına eklenen tüm verileri şifreler.
yazma işlevi:
function write($id, $data) { // Benzersiz anahtar alın $key = $this->getkey($id); // Veriyi şifrele $data = $this->encrypt($data, $key); $zaman = zaman(); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare("oturumlarda DEĞİŞTİR (id, set_time, data, session_key) DEĞERLER (?, ?, ?, ?)"); } $this->w_stmt->bind_param('siss', $id, $time, $veri, $key); $this->w_stmt->execute(); true döndür; }
Adım 8. Yok etme işlevi oluşturun
Bu fonksiyon veritabanından oturumu siler, php tarafından session_destroy(); gibi fonksiyonları çağırdığımızda kullanılır.
işlevi yok et:
function destroy($id) { if(!isset($this->delete_stmt)) { $this->delete_stmt = $this->db->prepare("DELETE FROM session WHERE id = ?"); } $this->delete_stmt->bind_param('s', $id); $this->delete_stmt->execute(); true döndür; }
Adım 9. gc (çöp toplayıcı) işlevi oluşturun
Bu fonksiyon eski oturumları silmek için çağrılan çöp toplayıcı fonksiyondur. Bu işlevin çağrılma sıklığı, iki yapılandırma yönergesi, session.gc_probability ve session.gc_divisor tarafından belirlenir.
gc() işlevi:
function gc($max) { if(!isset($this->gc_stmt)) { $this->gc_stmt = $this->db->prepare("WHERE set_time < ?"); } $eski = zaman() - $maks; $this->gc_stmt->bind_param('s', $eski); $this->gc_stmt->execute(); true döndür; }
Adım 10. getKey işlevi oluşturun
Bu işlev, oturumlar tablosundan şifreleme için benzersiz anahtarı almak için kullanılır. Oturum yoksa, şifreleme için yeni bir rastgele anahtar döndürür.
getkey() İşlev:
private function getkey($id) { if(!isset($this->key_stmt)) { $this->key_stmt = $this->db->prepare("oturumlardan oturum_anahtarını SEÇ NEREDE id = ? LIMIT 1"); } $this->key_stmt->bind_param('s', $id); $this->key_stmt->execute(); $this->key_stmt->store_result(); if($this->key_stmt->num_rows == 1) { $this->key_stmt->bind_result($key); $this->key_stmt->getir(); $ anahtarını döndür; } else { $random_key = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); $random_key döndür; } }
Adım 11. Şifreleme ve şifre çözme işlevleri oluşturun
Bu işlevler, oturumların verilerini şifreler, her oturum için farklı olan veritabanından bir şifreleme anahtarı kullanırlar. Bu anahtarı şifrelemede doğrudan kullanmıyoruz, ancak anahtar karmasını daha da rastgele hale getirmek için kullanıyoruz.
şifrelemek() ve şifresini çözmek() işlevleri:
özel fonksiyon şifrelemek($veri, $anahtar) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $tuz.$anahtar.$tuz), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $şifreli = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $anahtar, $veri, MCRYPT_MODE_ECB, $iv)); $şifreli döndür; } özel işlev şifre çözme($veri, $anahtar) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $tuz.$anahtar.$tuz), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $şifresi = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $anahtar, base64_decode($veri), MCRYPT_MODE_ECB, $iv); $şifresi çözülmüş = rtrim($şifresi çözülmüş, "\0"); $ şifresi çözülmüş döndür; }
Adım 12. Sınıfı Bitirin
Burada küme parantezlerini sonlandırıyoruz:
Sınıfın Sonu:
}
Yöntem 3/3: Oturumlarla Sayfa Oluşturma
Adım 1. Özel oturum yöneticisiyle oturumları kullanma
Yeni bir oturuma nasıl başlayacağınız aşağıda açıklanmıştır; bunu oturumlara erişmek istediğiniz her sayfaya eklemeniz gerekir, session_start() yerine bunu kullanın;
Bir oturum başlatmak:
require('session.class.php'); $oturum = yeni oturum(); // https $session->start_session('_s', false); kullanılıyorsa true olarak ayarlayın $_SESSION['bir şey'] = 'Bir değer.'; echo $_SESSION['bir şey'];