Auteur Topic: [php] sessies linken aan een database  (gelezen 4418 keer)

0 leden en 1 gast bekijken dit topic.

Thumb

  • DigitalPlace Guru
  • ****
  • Berichten: 3245
  • Karma: 65
    • Bekijk profiel
    • http://www.jeroendj.nl
[php] sessies linken aan een database
« Gepost op: augustus 25, 2011, 01:24:00 am »
  • [+1]1
  • [-1]0
  • Een goedenavond iedereen,

    ik ben doodop (veel gewerkt vandaag), dus ik houd het kort,
    ik heb een kleine snippet gemaakt die je kunt gebruiken om je sessies te koppelen aan een database,
    met PDO, omdat dat stoer is, en mysql_ zuigt =D

    gebruik het zo;
    Code: php [Selecteer]

    <?php
    include('session2database.php' );

    try
    {
        
    $config['host'] = "";
        
    $config['port'] = 3306//of 3307
        
    $config['database'] = "";
        
    $config['username'] = "";
        
    $config['password'] = "";

        
    $db = new PDO("mysql:host=" $config['host'] . ";port=" $config['port'] . ";dbname=" $config['database'], $config['username'], $config['password']);
        
    $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        unset(
    $config);

        
    //het $db object toekennen aan de klasse, en dan de sessionhandler aanpassen.
        
    $sesClass = new session2db($db);
        
    session_set_save_handler(
            array(&
    $sesClass"open"),
            array(&
    $sesClass"close"),
            array(&
    $sesClass"read"),
            array(&
    $sesClass"write"),
            array(&
    $sesClass"destroy"),
            array(&
    $sesClass"clean")
        );
            
        
    session_start();

        
    $_SESSION['bla'] = 'h';
        
    //en meer van je faalcode :D
    }
    catch(
    Exception $e) {
        
    //dirty trycatch, je zou t waarschijnlijk nog moeten verbeteren...
        //maar het werkt
        
    echo 'error: ' $e->getMessage() . '<br />'  PHP_EOL;
        echo 
    'lijnnr: ' $e->getLine();
    }
     


    en hier session2database.php;
    Code: php [Selecteer]
    <?php
    /**
     * the table: 
     *
     *  CREATE TABLE `sessions` (
     *        id` varchar(40) COLLATE latin1_general_ci NOT NULL,
     *        `timestamp` int(10) NOT NULL,
     *        `content` text COLLATE latin1_general_ci NOT NULL,
     *        PRIMARY KEY (`id`)
     *    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
     *
     */
    class session2db
    {

        private 
    $db;

        
    /**
         * Initialise class and copies 
         *  connection to the class
         *
         * @access    private
         * @param    object    $dbConnection (a PDO object)
         */
        
    function __construct($dbConnection)
        {
            if(
    is_object($dbConnection))
            {
                
    //hash session id through sha1
                //ini_set ('session.hash_function','1');
                    
                //never double sessions
                
    ini_set ('session.gc_probability','100');
                
    ini_set ('session.gc_divisor','100');
                
                
    //session only for 5 minutes without refresh
                
    ini_set ('session.gc_maxlifetime','300');
                
                
    //copy the connection to the class
                
    $this->db $dbConnection;
            }
            else {
                throw new 
    exception('no database connection specified');
                return 
    false;
            }
        }

        
    /**
         * open() and close() aren't used in this script
         */
        
    public function open() { return true; }
        public function 
    close() { return true; }

        
        
    /**
         * function called when reading a session
         *
         * @acces    public
         * @param    $sessionId
         * @return    session content or false on failure
         */
        
    public function read($sessionId)
        {
            
    $lookupSql "SELECT 
                            `content`
                        FROM
                            `sessions`
                        WHERE
                            `id` = " 
    $this->db->quote($sessionId);

            
    $result $this->db->query($lookupSql)->fetchAll();

            if (
    count($result) > 0)
            {
                return 
    $result['content'];
            }
            return 
    false;
        }

        
    /**
         * called when a session is set
         *  changes or inserts a session into the database
         *
         * @access    public
         * @param    $sessionId
         * @param    $sessionContent
         * @return    boolean
         */
        
    public function write($sessionId$sessionContent)
        {
            
    $insertSql "REPLACE INTO 
                                `sessions` 
                            VALUES
                            (
                                " 
    $this->db->quote($sessionId) . ",
                                " 
    $this->db->quote(time()) . ",
                                " 
    $this->db->quote($sessionContent) . "
                            )"
    ;

            return 
    $this->db->query($insertSql);
        }

        
    /**
         * function called when session_destroy(); is created
         *  deletes the session from the database.
         *
         * @access    public
         * @param    $sessionId    the sessionid
         * @return    boolean
         */
        
    public function destroy($sessionId)
        {
            
    $deleteSql "DELETE FROM 
                                `sessions` 
                            WHERE 
                                `id` = " 
    $this->db->quote($sessionId);

            return 
    $this->db->query($deleteSql);
        }

        
    /**
         * is called when the session garbage collector is executed
         *  deletes the old sessions
         *
         * @access    public
         * @param    $lifetime    max lifetime of a session
         * @return    boolean
         */
        
    function clean($lifetime)
        {
            
    $minTime time() - $lifetime;
            
    $cleanSql "DELETE FROM 
                            `sessions`
                        WHERE
                            `timestamp` < " 
    $this->db->quote($minTime);

            return 
    $this->db->query($cleanSql);
        }
    }
    ?>


    'documentatie'/comments zijn wel in het engels trouwens, leek me handiger xd

    succes ermee, en kijk maar hoe je het kan gebruiken :)
    zorgt igg weer voor wat extra veiligheid :)

    //jeroen
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #1 Gepost op: augustus 25, 2011, 02:47:32 pm »
  • [+1]0
  • [-1]0
  • « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    Re: [php] sessies linken aan een database
    « Reactie #2 Gepost op: augustus 26, 2011, 06:30:14 pm »
  • [+1]0
  • [-1]0
  • ga em nog we toevoegen keertje :P

    verder geen reacties :( ?
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #3 Gepost op: augustus 26, 2011, 08:17:10 pm »
  • [+1]0
  • [-1]0
  • Ik vind het er mooi uitzien :)
    +1 voor PDO
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    Re: [php] sessies linken aan een database
    « Reactie #4 Gepost op: augustus 26, 2011, 08:26:06 pm »
  • [+1]0
  • [-1]0
  • Citaat van: "Thisegzz"
    Ik vind het er mooi uitzien :)
    +1 voor PDO
    doe alleen maar pdo tegenwoordig, niet moeilijker ofzo, en ondersteund :D
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    Re: [php] sessies linken aan een database
    « Reactie #5 Gepost op: augustus 28, 2011, 12:35:23 am »
  • [+1]0
  • [-1]0
  • Wat doet het precies
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »


    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    Re: [php] sessies linken aan een database
    « Reactie #6 Gepost op: augustus 28, 2011, 02:35:11 am »
  • [+1]0
  • [-1]0
  • alle sessies die je maakt, dus met [icode:3g832857]$_SESSION['test'] = 'lol';[/icode:3g832857] wordt opgeslagen in een database, zodat het nog eens extra beveiligt is ;)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    xvilo

    • Global Moderator
    • Verslaafd DigitalPlace Lid
    • *****
    • Berichten: 2675
    • Karma: -44
      • Bekijk profiel
      • http://www.xvilo.com
    [php] sessies linken aan een database
    « Reactie #7 Gepost op: augustus 28, 2011, 10:26:31 am »
  • [+1]0
  • [-1]0
  • Citaat van: "Thumb"
    alle sessies die je maakt, dus met [icode:3c19o2ww]$_SESSION[&#39;test&#39;] = &#39;lol&#39;;[/icode:3c19o2ww] wordt opgeslagen in een database, zodat het nog eens extra beveiligt is ;)
    Sorry dat ik zo blijf doorvragen hoor maar wat is een session precies Dan??
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »


    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    jyy

    • DigitalPlace Lid
    • *
    • Berichten: 347
    • Karma: 12
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #9 Gepost op: augustus 28, 2011, 07:44:21 pm »
  • [+1]0
  • [-1]0
  • waarom heb je ze dan nog als session variabelen?
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "

    Thisegzz

    • Administrator
    • DigitalPlace Guru
    • *****
    • Berichten: 4279
    • Karma: 342
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #10 Gepost op: augustus 28, 2011, 07:50:37 pm »
  • [+1]0
  • [-1]0
  • Inderdaad niet handig. Je kan het beter aan het IP-adres van de bezoeker koppelen.
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    [18:09]   infected: Je bent een geile knuffelbeertje
    [18:12]   infected: Ik aanbid thisegzz en niemand anders.
    [18:13]   infected: Ik zit in de eenden comissie.

    jyy

    • DigitalPlace Lid
    • *
    • Berichten: 347
    • Karma: 12
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #11 Gepost op: augustus 28, 2011, 07:54:13 pm »
  • [+1]0
  • [-1]0
  • Dus eigenlijk kun je beter een table maken met time(), ip, user en een loggedout bool? Heb je meteen een log ;)


    Edit: bericht 303, dat 0wnt gewooon ;o

    edit2: plus de informatie die je in je sessies zet ofc  xd


    Ik zal hier wel 's een snippet neerzetten oid ;)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "

    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    Re: [php] sessies linken aan een database
    « Reactie #12 Gepost op: augustus 28, 2011, 08:49:46 pm »
  • [+1]0
  • [-1]0
  • omdat sessie's veel gebruikt worden, en dit dan heel gemakkelijk te implanteren is ;)
    en het schrijft simpeler weg, en inderdaad, je zou een log van kunnen maken/erbij

    maar enigste wat je nodig hebt is ip, wordt auto geset bij het maken van sessie, en time is er al, en hij wordt ookal geleegt automatisch =)
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »

    jyy

    • DigitalPlace Lid
    • *
    • Berichten: 347
    • Karma: 12
      • Bekijk profiel
    Re: [php] sessies linken aan een database
    « Reactie #13 Gepost op: augustus 28, 2011, 08:59:32 pm »
  • [+1]0
  • [-1]0
  • maar sessies zijn gevoelig voor session hijacking, dus of je checkt elke keer in je db, of je verwijderd je sessions en checkt elke keer alleen in je db, wat ook nog minder zwaar is ;)

    maar ik snap je punt met het integreren, geef ik je ook helemaal gelijk in.
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »
    myH> take 50 (cycle "SPAM ")
    "SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM SPAM "

    Thumb

    • DigitalPlace Guru
    • ****
    • Berichten: 3245
    • Karma: 65
      • Bekijk profiel
      • http://www.jeroendj.nl
    Re: [php] sessies linken aan een database
    « Reactie #14 Gepost op: augustus 29, 2011, 12:51:14 am »
  • [+1]0
  • [-1]0
  • en tja, het enigste wat ik over session hijacking te zeggen heb; codeer het met een eigen encryptie, en stop er sws geen belangrijke info in :P
    « Laatst bewerkt op: januari 01, 1970, 01:00:00 am door Guest »