güvenli bir PHP istemci 'oturum' ile ilgileniyor

3 Cevap php

Ben (şimdiye kadar) istemci tarafında kurabiye ve veritabanı kayıtları ile kullanıcı oturumlarını ele oldum.

Kullanıcı oturum açtığında, ben bir GUID oluşturmak ve müşterinin bilgisayarınıza çerez yerleştirin. Kullanıcı sayfayı eriştiğinde bir oturum çerezi varsa Sonra ben 'oturumları' MySQL tablosunda bir giriş oluşturmak ve orada vb guid, ip adresi, kullanıcı adı, ayrıcalıklara eklemek Sonra, ben kontrol edin. eğer öyleyse, ben çerez guid için veritabanı kontrol ve ip adresi maçlar emin olun. Bu daha sonra kullanıcı db tablodaki bilgileri ve geri kalanı ile kaydedilir edin. Bir şey yanlış ise (kötü ip adresi, süresi dolmuş oturum, vb) ben veritabanı girişi kaldırmak ve guid çerezi kaldırmak.

Ben önce $ _SESSION küresel asla kullanmadım.

Benim yolum iyi bir uygulama mı yoksa ben bu hallediyorum nasıl yeniden düşünmek gerekiyor?

3 Cevap

Eğer örtülü temellerini var gibi geliyor. Ancak, yapıyoruz hepsi elle, o zaman etkili sadece kendi $_SESSION, uygulanması ve zaten sizin için tüm bu yapabileceği gerçeği yararlanarak değildir.

Bir oturumu işlemek için bir veritabanı kullanmak istiyorsanız, kendi ile işleme varsayılan oturum kılabilirsiniz. session_set_save_handler() bir göz atın. Benim apps bunu.

class SessionHandler
{

    public function open($save_path, $session_name)
    {
        $this->sessionName = $session_name;
    return(true);
    }
    public function close() {
        //stuff
    }

    public function read($id) {
        $expiretime = date("Y-m-d H:i:s",time() - $this->maxLifeTime);
        $sql = "SELECT * FROM sessions where sessionid='".$this->db->escapeData($id)."' AND lastupdated>='".$expiretime."' LIMIT 1";
    $result = $this->db->query($sql);
        //etc.
    }

    //etc.

    public function setAsSessionHandler()
    {
    session_set_save_handler(
    	array($this,'open'),
    	array($this,'close'),
    	array($this,'read'),
    	array($this,'write'),
    	array($this,'destroy'),
    	array($this,'gc')
    );
    }
}

$sessionHandler = new SessionHandler();
$sessionHandler->setAsSessionHandler();

Sen sadece bu kullanarak kendinizi uygulanan ettik açıklanan tüm özelliğe sahip, ama yine de sizin için bunu yapmak için $ _SESSION güç olabilir.

Bunu başlamadan önce oturumu hala geçerli olup olmadığını görmek için bir IP kontrolünü eklemek istedim Örneğin, sen "açık" işlevinin bir parçası olarak bu ekleyebilirsiniz. (Eğer olmaz ki), sen 'yazma' işlevi bunu başarabilir on farklı veritabanlarına oturum verilerini yazmak istedim.

Bu işlevler tüm $ _SESSION nasıl kullandığınıza dayalı kullanılan ve basit bir sınıfa koyarak, bunu çok etkili çalışıyor nasıl yönetebilirsiniz.

Sen session id okuma / yazma / fonksiyonları yok etmek için geçirilen bir parametre olduğunu ve hala GUID nesil rutin kullanarak bu aynı şekilde yönetmek edeceğiz görürsünüz. Ancak, bu oturumun yöneticisi sınıfa guid nesil ve kontrolleri sopa ve sadece açık () işlevi bunları yapmak zorunda. Merkezi, no muss, hayır gürültü patırtı.

Eğer bir şekilde diğer veritabanı bilgileri geçerli kullanıcıyı bağlantı gerekir eğer şimdi bunu yapıyoruz yolu iyidir.

Oturumları kullanarak basitlik için bunu yapmak için tercih edilen yoldur. Ben www.php.net / oturumlarında bu konuda biraz okumak ve bu zihninizi makyaj öneririz. Bu kullanımı çok kolay, ama bir veritabanı tablosunu kullanarak daha az esnektir. Eğer hala ihtiyacınız olan tüm değerlerini ayarlayabilir, ancak sonra onları almak ve veritabanı işlemleri için bunları kullanmak gerektiğinde sorgu içine eklemek gerekiyor.

Ben doğru yolda olduğunu düşünüyorum. Gerçekten uygulamanın güvenlik gereksinimlerine bağlı olacak. Sen $ _COOKIE çok benzer $ _SESSION düşünebilirsiniz: sayfa yenilenir arasında durumu sağlamak için bir mekanizma olarak. Bu bağlamda olarak, kullanıcının kimliği. Sizin veritabanı başka bir kimlik doğrulama mekanizmaları sağlamalıdır. Benzersiz kullanıcıyı tanımlamak olabilir şeyler. Tipik bir varsayım IP adresidir, fakat birileri IP değişirse ne olur? Kullanıcı ajan başka bir olasılık ama bu çok benzersiz öyle.

http://php.net/manual/en/session.security.php: Ben bir göz alarak öneririz