Verificare se un utente è connesso tramite db mysql

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Ciao, rieccomi a scocciare con le mie domande, ho creato un db mysql per registrare degli utenti a cui viene permesso l'accesso a determinate pagine, ma mi sono accorto che se ad esempio, apro una sessione dal pc di casa e subito dopo apro una nuova sessione dal celluare, quindi con altro ip ma con stesse credenziali di accesso, riesco tranquillamente ad avere due sessioni aperte in contemporanea. Dalla lettura di vari post in rete oltre che su questo forum, da quello che ho capito dovrei creare una colonna sul db nella tabella loginattemps e questo non è un problema, ma qui mi blocco. La mia domanda è: Una volta creata la tabella, come faccio a farla funzionare?
Questa e la struttura della tabella:

Codice:
CREATE TABLE `members` (
  `id` char(23) NOT NULL,
  `username` varchar(65) NOT NULL DEFAULT '',
  `password` varchar(65) NOT NULL DEFAULT '',
  `email` varchar(65) NOT NULL,
  `verified` tinyint(1) NOT NULL DEFAULT '0',
  `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username_UNIQUE` (`username`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `email_UNIQUE` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `loginAttempts` (
  `IP` varchar(20) NOT NULL,
  `Attempts` int(11) NOT NULL,
  `LastLogin` datetime NOT NULL,
  `Username` varchar(65) DEFAULT NULL,
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Questa e la struttura del file per il login:
PHP:
<?php
session_start();
if (!isset($_SESSION['username'])) {
    header("location:login/main_login.php");
}
ed infine il file di controllo login

PHP:
<?php
//'true' triggers login success
ob_start();
include 'config.php';
require 'includes/functions.php';

// Define $myusername and $mypassword
$username = $_POST['myusername'];
$password = $_POST['mypassword'];

// To protect MySQL injection
$username = stripslashes($username);
$password = stripslashes($password);

$response = '';
$loginCtl = new LoginForm;
$conf = new GlobalConf;
$lastAttempt = checkAttempts($username);
$max_attempts = $conf->max_attempts;


//First Attempt
if ($lastAttempt['lastlogin'] == '') {

    $lastlogin = 'never';
    $loginCtl->insertAttempt($username);
    $response = $loginCtl->checkLogin($username, $password);

} elseif ($lastAttempt['attempts'] >= $max_attempts) {

    //Exceeded max attempts
    $loginCtl->updateAttempts($username);
    $response = $loginCtl->checkLogin($username, $password);

} else {

    $response = $loginCtl->checkLogin($username, $password);

};

if ($lastAttempt['attempts'] < $max_attempts && $response != 'true') {

    $loginCtl->updateAttempts($username);
    $resp = new RespObj($username, $response);
    $jsonResp = json_encode($resp);
    echo $jsonResp;

} else {

    $resp = new RespObj($username, $response);
    $jsonResp = json_encode($resp);
    echo $jsonResp;

}

unset($resp, $jsonResp);
ob_end_flush();
 
Ultima modifica di un moderatore:

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
Ciao, potresti anche creare al login una sessione chiamata con lo stesso nome dell'username, e poi fare un controllo con un if se quella sessione esiste blocchi, se non esiste procedi.
 

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Grazie della risposta, sinceramente sono molto confuso a forza di leggere. Il mio obiettivo finale e quello di impedire in qualche modo, che ci si possa loggare contemporaneamente con la stessa user e password da due diversi dispositivi. In pratica, dato il tipo di sito che ho realizzato, non vorrei trovarmi con 10 utenti in possesso di dati di accesso e 20 persone online, come sembra stia accadendo.
 

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
Ma a te serve poter rilevare le persone online nel tuo sito? Altrmenti potresti creare una nuova tabella nel db (lastlogin) e memorizzare l'username che si è connesso, cosi al login oltre a verificare la correttezza di user e pass nella tabella "utenti" verifichi anche che l'username inserito nel form login non sia presente nella tabella "lastlogin". Provvederai a svuotare tale tabella quando l'utente fa il logout. Spero di essermi spiegato bene
 

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Esatto, pensavo proprio di creare una tabella oppure aggiungere una colonna alla tabella "members" in cui che se l'utente è online, quando un altro tenta la connessione con lo stesso username, venga reindirizzato alla pagina di login o una pagina con un messaggio tipo: Utente già connesso.
 

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
Conviene creare una tabella apposita e procedi in questo modo:
1) Prelevi username e password dal form login;
2) verifichi che user e pass siano corretti;
3) se sono corretti fai un controllo nella tabella es. "logged" o "loggati" o "members" come preferisci;
controlli con un if se l'user ricevuto dal form è presente nella tabella, se è presente reindirizzi a login.php se non è presente prosegui con l'area riservata.
4) quando l'utente fa logout, elimini questo utente dalla tabella "members" in modo che si possa nuovamente loggare
 
  • Like
Reactions: bubino8

giannit

Nuovo Utente
30 Mar 2017
31
2
8
55
Allora, aggiorno il post, ho trovato uno script di login che dovrebbe fare al caso mio, quando eseguo il login mi passa ad una pagina dove mi da come utente stato connesso tramite il timestamp. Se non cambio pagina, trascorso il tempo prestabilito mi riporta in stato disconnesso. Potrei sfruttare la funzione modificando leggermente, pensavo di mettere il tempo di connessione ad esempio 3 ore e se in questo frattempo non cambia lo stato, i tentativi di connessione con stesso user e password, dirottarli ad una pagina che avvisa che i dati sono gia in uso. Che dici, potrebbe funzionare?
 

bubino8

Utente Attivo
28 Apr 2017
343
19
18
28
BZ
Mi unisco alla discussione, che è utile anche a me.
Quindi nell'ipotetica tabella "logged" al login vado a fare i vari controlli e ad aggiungere con INSERT INTO la sessione con "nomeutente", mentre al logout vado a cancellare DELETE quella stessa riga? Corretto?

Potrebbero oltre alla colonna "nomesessione" tornare utili altri campi come "IP" o altro o sarebbero campi inutili?

Altro dubbio se dovessi avere la possibilità di accedere da due postazioni e mi dimenticassi di effettuare il logout, dovrei impostare che la sessione duri un massimo di (nr ore), o come si potrebbe fare?

Grazie
 
Ultima modifica:

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
Memorizzare l'ip serve a poco perchè se ti logghi da casa col wifi e col cellulare in 3g avresti 2 ip differenti, mentre il controllo deve avvenire sull'username che è univoco. Potresti in quel caso memorizzare un timestamp del login e dopo tot di tempo effettuare il logout forzato con la rimozione del nomesessione.
 

bubino8

Utente Attivo
28 Apr 2017
343
19
18
28
BZ
Grazie adesso faccio qualche altra prova, però mi è saltato fuori un altro dubbio al' logout io ho
HTML:
<a href="home.php?logout"><i class="fa fa-sign-out"></i><span> Esci</span></a>
come faccio eseguire la query DELETE al click su tag <a>?
 

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
la query la puoi aggiungere prima della funzione del logout, immagino che al logout eliminerai le sessioni, quindi appena prima di rimuovere le sessioni fai la query svuoti la tabella e procedi al logout.
 
  • Like
Reactions: bubino8

bubino8

Utente Attivo
28 Apr 2017
343
19
18
28
BZ
Hai pienamente ragione mio errore.
Fatto e sembra faccia il suo dovere.

Grazie ancora.
 

xone

Utente Attivo
4 Apr 2014
180
14
18
Salento
In quel caso allora oltre che registrare la sessione converrebbe usare un cookie e settare la sua scadenza:
setcookie("nomecookie","valorecookie",time()+temposcadenza);
O implementare un tempo di inattività e dopo un tot forzare il logout in automatico.