PHP ve MySQL'de Güvenli Bir Oturum Yönetim Sistemi Oluşturmanın 3 Yolu

İçindekiler:

PHP ve MySQL'de Güvenli Bir Oturum Yönetim Sistemi Oluşturmanın 3 Yolu
PHP ve MySQL'de Güvenli Bir Oturum Yönetim Sistemi Oluşturmanın 3 Yolu

Video: PHP ve MySQL'de Güvenli Bir Oturum Yönetim Sistemi Oluşturmanın 3 Yolu

Video: PHP ve MySQL'de Güvenli Bir Oturum Yönetim Sistemi Oluşturmanın 3 Yolu
Video: 98.5 Saatte Sektörün Aranan Yazılımcısı Olabileceğinizi İddia Eden Kursu Satın Aldık! 2024, Nisan
Anonim

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

2238751 1
2238751 1

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.

2238751 2
2238751 2

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.

2238751 3
2238751 3

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

2238751 4
2238751 4

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 {

2238751 5
2238751 5

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'); }

2238751 6
2238751 6

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); }

2238751 7
2238751 7

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; }

2238751 8
2238751 8

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; }

2238751 9
2238751 9

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; }

2238751 10
2238751 10

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; }

2238751 11
2238751 11

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; }

2238751 12
2238751 12

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; }

2238751 13
2238751 13

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; } }

2238751 14
2238751 14

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; }

2238751 15
2238751 15

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

2238751 16
2238751 16

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'];

Önerilen: