Meerdere sessies tegelijk?
Met een vinkje kun je aangeven of je 30 dagen automatisch ingelogd wilt blijven.
Alleen werkt dat met de gebruikersnaam en het wachtwoord in twee cookies opgeslagen.
Ik heb in de DB een tabel aangemaakt met 2 cookies.
De eerste gebaseerd op een gecodeerde tijd die is ingesteld bij het aanmaken van de registratie.
De tweede gebaseerd op het IP, maar dient uitsluitend om bij andere locatie het automatisch inloggen te blokkeren.
Er wordt een sessie aangemaakt met de gegevens uit tabel 1
De codering voor de cookie opslag zitten in tabel 2.
De link tussen tabel 1 en tabel 2 wordt gemaakt via het id.
Moet/kan dat met meerdere sessies tegelijk?
Ik heb eerlijk gezegd geen idee hoe ik dit omgebouwd krijgt!
Iemand die me verder kan helpen?
Waarom sla je het wachtwoord op in een cookie? Klinkt behoorlijk gevaarlijk!
Ik weet dat het onveilig is.
Vandaar dat ik een tabel heb aangemaakt in de DB die alleen via het id een link heeft met de accountgegevens.
Een veld dat ik noem 'cookip' met een gecodeerd IP adres.
De ander veld noem ik 'cookw'. En is gecodeerde afgeleide van de aanmaaktijd van het het account.
In het bestaande script wordt gewerkt met de gebruikersnaam en het wachtwoord uit tabel 1.
Dat geeft dus bij een session ook geen probleem.
Maar als ik het om wil bouwen moet ik ipv de gegevens uit tabel 1, gebruik maken van tabel 2.
En hoe dat moet heb ik geen idee van.
'vrijw en 'basis' zijn de twee tabellen.
Uit 'vrijw'haal ik webs, faceb, youtu.
Uit 'basis' de overige gegevens.
Code (php)
1
$query = $this->query("SELECT webs, faceb, youtu, first_name, middle_name, last_name, email_address, birth, username, password FROM vrijw, basis WHERE vrijw.id = $idee AND basis.id = $idee");
Voor de koppeling tussen beide tabellen gebruik ik het ID.
Nu heb ik nog 1 probleem, waar ik niet zo snel uit kom.
Voor het testen heb ik als referentie $idee aangemaakt en een waarde aan toegekend.
Die waarde moet ik zien te halen uit onderstaande.
Maar krijg dat niet goed voor elkaar.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
function set_session($username, $password) {
$query = $this->query("SELECT id FROM ".DBTBLE." WHERE username='$username' AND password='$password'");
.
.
.
$idee=34;
$query = $this->query("SELECT id FROM ".DBTBLE." WHERE username='$username' AND password='$password'");
.
.
.
$idee=34;
Iemand die me weer even op gang kan brengen?
een user wachtwoord in het bijzonder mag je NERGENS opslaan BEHALVE in de user tabel maar dan wel goed gecodeerd. Hiervoor gebruik je het liefst (op het moment van schrijven) BCrypt.
De server gaat eind maart over op PHP 5.6.
Ik leer eerst vanuit een bestaand oud inlogscript de verbeteringen aan te brengen.
Daarna komen de veranderingen zoals met name op dit forum worden aangedragen.
Het gaat dan om SQLi en waarschijnlijk ook de sessies opslaan in de database.
Dus als nu nog de value van de ID op een of andere manier is te vangen, dan lees ik het graag.
Gewijzigd op 18/03/2016 09:02:09 door Hans De Ridder
Makes no sense. Verdiep je eerst eens goed in wat een sessie doet en hoe dit werkt. Iig zijn sessies bedoeld voor tijdelijke opslag.. hetgeen in de sessie opgeslagen is mag en zal verloren gaan. Je moet het zien als opslag voor een periode tussen twee of meer requests. Klassiek voorbeeld is het userid zodat je applicatie weet wie ingelogd is
Het klinkt alsof TS een hoop oude code aan het de-spaghetti-seren is.
Zoals @Frank al aangaf hoef je in je sessie (voor het user management, althans) enkel een user id te onthouden.
Om een login te onthouden zou je daarvoor een cookie kunnen introduceren, bijvoorbeeld "rememberme" of "remember_login" of wat dan ook. In dit cookie zou je bijvoorbeeld enkel een random hash op kunnen slaan, die verder niets van doen heeft met gebruikersgegevens en zeker niet met je wachtwoord. Vervolgens houd je in een aparte tabel deze hashes bij, en aan welke user en bijvoorbeeld IP-adres deze gekoppeld is, en hoe lang deze login (op die specifieke machine) onthouden moet worden. Als iemand je site bezoekt controleer je eerst op het bestaan van dit cookie en bijbehorende gegevens, waarna je een gebruiker onder water automatisch inlogt als dit nodig zou zijn.
In je applicatie is het handig om een soort van user object te hebben, die je als kapstok voor gebruikersgegevens van de ingelogde persoon gebruikt. Deze kleed je aan met behulp van het user id in je sessie, en de gegevens van dit user object ververs je elke page-request.
Gewijzigd op 18/03/2016 10:38:22 door Thomas van den Heuvel
Even kijken of ik die kan verplaatsen.
Ik zie de andere vraag niet meer, haha.
Misschien samengevoegd?
Gewijzigd op 18/03/2016 12:31:54 door Hans De Ridder
https://github.com/ircmaxell/password_compat
Toevoeging op 18/03/2016 12:56:53:
Verder verkrijg je het userid uiteraard wanneer je het inlogformulier verwerkt. Je hebt dan een gebruikersnaam die je probeert te vinden in je user tabel. Indien je die gevonden hebt ga je het password dat uit het inlogformulier encrypten en vergelijk je deze met het encrypte password uit de database. Klopt die ook dan pak je uit de resultset het userid en schrijf je die in de sessie.
Toevoeging op 18/03/2016 13:01:17:
SELECT * FROM users WHERE username='frank'
Tip: overweeg je gebruikers in te laten loggen (ook) met hun emailadres ipv hun gebruikersnaam
Voor password versleuteling in oudere php versies kun je password compat gebruiken. Deze vindt je hier: Toevoeging op 18/03/2016 12:56:53:
Verder verkrijg je het userid uiteraard wanneer je het inlogformulier verwerkt. Je hebt dan een gebruikersnaam die je probeert te vinden in je user tabel. Indien je die gevonden hebt ga je het password dat uit het inlogformulier encrypten en vergelijk je deze met het encrypte password uit de database. Klopt die ook dan pak je uit de resultset het userid en schrijf je die in de sessie.
Toevoeging op 18/03/2016 13:01:17:
SELECT * FROM users WHERE username='frank'
Tip: overweeg je gebruikers in te laten loggen (ook) met hun emailadres ipv hun gebruikersnaam
Als je het ipadres erbij betrekt, zal iemand die zijn laptop meeneemt naar school dus aldaar weer uitgelogd zijn.
Of iemand die zijn smartphone via wifi inlogt en vervolgens buiten op het netwerk van Vodafoon komt uitloggen.
Of als hij van de ene naar de andere gsm mast gaat mogelijk ook weer een ander ipadres krijgen.
Als het niet heeeel kritisch is (zoals een bank of zo) , zou ik het ipadres achterwege laten.
Je kunt dan twee dingen doen: een andere voorziening inbouwen, iets met nonces en user agent + een random string die elke page access wisselt, of het echt vasttimmeren met een IP adres.
Simpelweg de IP check achterwege laten en maar hopen dat alles goed gaat als je op een publiek (en mogelijk unencrypted) netwerk surft is vragen om ongelukken. Je zult op een of andere manier moeten garanderen dat je met een bepaalde gebruiker van doen hebt. Enkel een hash uit een cookie... I dunno man. Hangt ook af of je applicatie zelf veilig is he. Als iemand je cookies kan stelen ben je zonder IP check de klos.
Dan kun je weer https inzetten... Tis maar net hoeveel geld je tegen je oplossing aan wilt smijten he.
Zo neem ik met name later ook mee welke alternatieven er zijn, zowel in programma's als structuur.
En ik heb nu een probleem waar ik tegenaan loop... En wil graag weten of uit de gegeven query de value van de ID te halen is.
Ik vraag om een tafelpoot, maar jullie geven me adviezen over het inrichten van mijn huis en de meubels die er het beste bij staan, haha
Overigens ook heel belangrijk hoor....neem het ook allemaal mee.
Bedankt in ieder geval voor jullie reacties tot nu toe.
Code (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$db = new mysqli('localhost', 'user', 'pass', 'demo');
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
$sql = "SELECT * FROM users WHERE username='".$db->real_escape_string(trim($_POST['username']))."' LIMIT 1";
if($result = $db->query($sql)){
if($row = $result->fetch_assoc()) { // ik verwacht max 1 record terug dus gebruik ik geen while maar een if
echo $row['id'] . ' - ' . $row['username'] . '<br />';
// hier ga je vervolgens het wachtwoord vergelijken
if($row['password'] == mijnPasswordEncryptFunctie($_POST['password']) {
$session['logged_in'] = $row['id'];
header('Location: index.php');
exit;
}
} else {
$message = 'Ongeldige username en/of wachtwoord'; // geen gebruiker met die naam gevonden
}
} else {
die('Ongeldige query'); // er ging iets fout
}
?>
$db = new mysqli('localhost', 'user', 'pass', 'demo');
if($db->connect_errno > 0){
die('Unable to connect to database [' . $db->connect_error . ']');
}
$sql = "SELECT * FROM users WHERE username='".$db->real_escape_string(trim($_POST['username']))."' LIMIT 1";
if($result = $db->query($sql)){
if($row = $result->fetch_assoc()) { // ik verwacht max 1 record terug dus gebruik ik geen while maar een if
echo $row['id'] . ' - ' . $row['username'] . '<br />';
// hier ga je vervolgens het wachtwoord vergelijken
if($row['password'] == mijnPasswordEncryptFunctie($_POST['password']) {
$session['logged_in'] = $row['id'];
header('Location: index.php');
exit;
}
} else {
$message = 'Ongeldige username en/of wachtwoord'; // geen gebruiker met die naam gevonden
}
} else {
die('Ongeldige query'); // er ging iets fout
}
?>
Gewijzigd op 18/03/2016 15:28:58 door Frank Nietbelangrijk
Het idee van uitsluitend die ID in de sessie te plaatsen spreekt me wel aan.
De gegevens in de sessie dienen uitsluitend om bij het welkom de gegevens te tonen.
Daarnaast worden de gegevens gebruikt bij een edit pagina, om weer te geven als reeds eerder ingevuld.
Die kunnen dan gewijzigd worden.
Hoe kan ik het beste de gegevens weer naar formulier verplaatsen i.p.v. per sessie?
Kan ik die queries zonder veiligheidsproblemen ook in het formulier toevoegen?
bedankt voor de tips....
Wat betreft de cookies hadik al twee waarden gereserveerd in aparte tabel.
De eerste was er een gebaseerd op gecodeerde tijd van aanmaak account.
De tweede was een gecodeerd ipadres. Die dient uitsluitend om te kijken of er vanuit andere omgeving wordt ingelogd.
Maar kwam er niet helemaal uit om die in te voeren op het oude script. Komt nog wel.
Was gebaseerd op de gebruikersnaam (ongecodeerd) en het wachtwoord (gecodeerd).
Dus heel onveilig... Maar dat bouw ik later in....
Gewijzigd op 20/03/2016 22:28:18 door Hans De Ridder
Code (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
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
<?php
session_start();
$user_id = $_SESSION['logged_in']; // je moet wel zeker weten dat $_SESSION['logged_in'] ook bestaat, controleren met isset() !
$sql = "SELECT * FROM users WHERE id=" . $user_id;
if($result = $db->query($sql)) {
$user = $result->fetch_assoc();
if(!$user) {
die('User met id ' . $user_id . ' niet gevonden');
}
} else {
die('Ongeldige query'); // er ging iets fout
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mijn Profiel</title>
</head>
<body>
<form action method="POST">
<input type="text" name="username" value="<?php echo $user['username']; ?>">
...
</form>
</body>
</html>
session_start();
$user_id = $_SESSION['logged_in']; // je moet wel zeker weten dat $_SESSION['logged_in'] ook bestaat, controleren met isset() !
$sql = "SELECT * FROM users WHERE id=" . $user_id;
if($result = $db->query($sql)) {
$user = $result->fetch_assoc();
if(!$user) {
die('User met id ' . $user_id . ' niet gevonden');
}
} else {
die('Ongeldige query'); // er ging iets fout
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mijn Profiel</title>
</head>
<body>
<form action method="POST">
<input type="text" name="username" value="<?php echo $user['username']; ?>">
...
</form>
</body>
</html>
:(
EDIT: $session['logged_in']? Wut?
EDIT: tevens: een echo, en dan een header()? Ayyy.
EDIT: waarom wordt in het tweede fragment het user id niet meer ge-escaped?
Gewijzigd op 20/03/2016 22:38:30 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function connect_db() {
$conn_str = mysql_connect(DBHOST, DBUSER, DBPASS);
mysql_select_db(DBNAME, $conn_str) or die ('Could not select Database.');
}
function query($sql) {
$this->connect_db();
$sql = mysql_query($sql);
$num_rows = mysql_num_rows($sql);
$result = mysql_fetch_assoc($sql);
return array("num_rows"=>$num_rows,"result"=>$result,"sql"=>$sql);
}
$conn_str = mysql_connect(DBHOST, DBUSER, DBPASS);
mysql_select_db(DBNAME, $conn_str) or die ('Could not select Database.');
}
function query($sql) {
$this->connect_db();
$sql = mysql_query($sql);
$num_rows = mysql_num_rows($sql);
$result = mysql_fetch_assoc($sql);
return array("num_rows"=>$num_rows,"result"=>$result,"sql"=>$sql);
}
VOORBEELD:
Code (php)
1
2
2
$query = $this->query ("SELECT * FROM ".DBTBLE." WHERE username = '$username'");
$id = $query['result']['id'];
$id = $query['result']['id'];
Gewijzigd op 20/03/2016 23:24:45 door Hans De Ridder
Je weet dat de mysql_ functies niet meer gebruikt kunnen worden vanaf PHP versie 7?
Heb dus nog wel even de tijd...
Maar is ook hobby voor me...ben ook 2 x 32...