[PHP] Feedback voor loginsysteem

Pagina: 1
Acties:
  • 446 views

  • Josaus
  • Registratie: September 2010
  • Laatst online: 09-01 20:53
Beste tweakers,
Een tijdje geleden ben ik begonnen met het maken van een loginsysteem. Dit werkte goed. Nu heb ik het systeem herbouwd in een class met functies (OOP) en weet niet of dit wel de manier is. Ook weet ik niet of ik het echt goed gedaan heb. Dus zou ik graag feedback krijgen, als dat zou kunnen :3 De reden dat ik dit zo heb gedaan, is dat ik er nog veel dingen aan toe wil voegen, en dit het handig en overzichtelijk houdt. (hoop ik) Het systeem is nog niet helemaal af, maar wel operationeel. Ik weet ook niet of mijn SQL-variabel-namen wel handig zijn xd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
class LoginSaus {
    function __construct() {
        mysql_connect('localhost', '*username*', '*watchwoord*') or die('Unable to connect to database: ' . mysql_error());
        mysql_select_db('josaus');
        session_start();
    }
    function __destruct() {
        mysql_close();
    }
    function login($user, $password) {
        $sLogin = sprintf('
            SELECT id, login, permission
            FROM users
            WHERE login = "%s"
            AND password_md5 = "%s"',
            mysql_real_escape_string(strtolower($user)),
            mysql_real_escape_string(md5($password)));
        $qLogin = mysql_query($sLogin);
        if(mysql_num_rows($qLogin) == 1) {
            $userDetails = mysql_fetch_assoc($qLogin);
            $_SESSION['uid'] = $userDetails['id'];
            $_SESSION['user'] = $userDetails['login'];
            $_SESSION['permission'] = $userDetails['permission'];
            return true;
        }
        else
            return false;
    }
    function register($user, $password, $email) {
        $regReturn;
        if($this->checkEmail($email)) {
            $sCheck = sprintf('
                SELECT login, email
                FROM users
                WHERE login = "%s"
                OR name = "%s"
                OR email = "%s"',
                mysql_real_escape_string(strtolower($user)),
                mysql_real_escape_string($user),
                mysql_real_escape_string($email));
            $qCheck = mysql_query($sCheck);
            if(mysql_num_rows($qCheck) >= 1) {
                $regReturn .= '!user||email';
            }
            else {
                $sRegister = sprintf('
                    INSERT INTO users (name, login, password_md5, email, date)
                    VALUES ("%s", "%s", "%s", "%s", %d)',
                    mysql_real_escape_string($user),
                    mysql_real_escape_string(strtolower($user)),
                    mysql_real_escape_string(md5($password)),
                    mysql_real_escape_string($email),
                    time());
                $qRegister = mysql_query($sRegister);
                if(mysql_num_rows($qRegister) == 0) {
                    echo 'MySQL error: ' . mysql_error();
                    $regReturn .= '!mysql';
                }
                else {
                    $regReturn = true;
                }
            }
        }
        else {
            $regReturn .= '!email';
        }
        return $regReturn;
    }
    function logout() {
        if(isset($_SESSION['uid'], $_SESSION['user'], $_SESSION['permission'])) {
            session_unset();
            $loggedOut = true;
        }
        else {
            $loggedOut = false;
        }
        return $loggedOut;
    }
    
    function checkEmail($email) {
        $regex = '/^([*+!.&#$¦\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,4})$/i';
        $isValid = preg_match($regex, $email);
        if($isValid) {
            list( , $domain) = explode("@", $email);
            if (checkdnsrr($domain, "MX")) {
                return true;
            }
            else {
                return false;
            }
        }
        else
            return false;
    }
}
?>


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `users` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `login` varchar(32) NOT NULL,
  `password_md5` varchar(32) NOT NULL,
  `email` varchar(64) NOT NULL,
  `status` varchar(32) NOT NULL DEFAULT 'activation',
  `date` int(10) NOT NULL,
  `permission` int(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`,`login`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


Hopelijk kunnen jullie mij wat tips geven :3

Groeten, Kees

[ Voor 6% gewijzigd door Josaus op 17-10-2012 19:27 ]


  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10-2025
Tip1, kijk eens naar PDO. Prepared statements ipv je huidige old-skool mysql_escape gedoe..

Driving a cadillac in a fool's parade.


  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 28-01 22:15

krvabo

MATERIALISE!

PDO heb je ook weer niet direct nodig. Overstappen naar in ieder geval mysqli (note the 'i') is al een stuk handiger gelet op de toekomst.

De TS moet er wel op letten dat zijn class elke keer een connectie maakt naar de database als hij hem aanmaakt. Deze connect kan beter buiten de klasse gebeuren. Verder is dat is natuurlijk prima, maar houd er rekening mee dat je met functions gaat werken, je de databaseconnectie steeds moet meegeven. Of je gaat met een state-machine of singleton werken. Over dit laatste is veel te zeggen en is een hele andere discussie op zich die al vaak is gevoerd ;)

Dus: haal die databaseconnectie en session_start() buiten deze klasse indien je de databaseconnectie op meer plaatsen op je site gebruikt.

Je session_unset zou je opzich kunnen vervangen door een $_SESSION = array(); Daarnaast is het escapen van een md5-hash opzich niet nodig en moet je mysql-errors niet tonen, maar over het algemeen is je klasse best werkbaar.

Wel een tip: voeg nuttig commentaar toe.

[ Voor 10% gewijzigd door krvabo op 17-10-2012 21:49 ]

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
md5 gebruiken voor een wachtwoordhash lijkt me onveilig/ouderwets, gebruik iets als bcrypt. Die emailvalidatie-regexp klopt niet -> gebruik een niet zelf-gemaakte of filter_var. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
We doen hier niet aan sitescriptchecks ;)

Verder:
Secure Password Storage - Lots of Don'ts, a Few Dos
Storing Passwords Securely
Password Storage Cheat Sheet
etc. etc. etc.

[ Voor 57% gewijzigd door RobIII op 17-10-2012 23:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Dit topic is gesloten.