Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    accesso esclusivo a pagina php

    Ciao!
    per evitare che delle operazioni su database entrino in conflitto vorrei limitare ancora di più l'accesso alla mia pagina php, oltre a username e password vorrei verificare che non ci siano altri utenti connessi con le stesse credenziali.
    L'unica soluzione che ho pensato è implementare una specie di semaforo usando un campo boolean della tabella sql, solo che questo potrebbe crearmi problemi in caso di chiusura del browser o di arresto improvviso senza usare la procedura di logout..
    Esistono altre soluzioni migliori di questa? (ad esempio utilizzo delle sessioni? )
    Grazie mille!

  2. #2
    Utente di HTML.it L'avatar di Disema
    Registrato dal
    Sep 2014
    Messaggi
    63
    Da quello che so le sessioni non possono essere prese da un client all'altro(ma non ne sono sicuro) però il metodo di memorizzare nel database può essere una soluzione, ma non con il vaolre booleano.
    Puoi memorizzare data e ora quando viene effettuato l'accesso(e aggiornarla quando si carica una pagina) e quando si fa il login, viene prese quasta ora, se è più vecchia di 15 minuti(ad esempio, o puoi mettere 1 minuto, dimente da cosa fanno queste pagine) di quella attuale vuol dire che l'utente non è più attivo, e quindi si può accedere, altrimenti nega l'accesso.

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,508
    Io farei un sistema che si comporta così:
    - mi loggo, viene salvato l'IP e viene messo ad 1 un flag sullo stesso record appena inserito.
    - mi loggo da un altro PC senza fare il logout dal precedente, invalido la sessione del primo IP mettendo a 0 il relativo flag e contestualmente inserisco il nuovo IP e flag a 1 per questo secondo IP
    - ogni volta che provo ad effettuare un'operazione in tale pagina, verifico IP e flag, se il flag per tale IP è 0, allora mostro il messaggio "E' stato effettuato l'accesso da un altro PC, tu non puoi fare più niente, se vuoi fai il logout e ti rilogghi"

    In questo modo ci sarà sempre e solo un utente loggato che può effettuare operazioni sulla pagina.

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    però Alharezed, sempre che non abbia capito male, se l'utente si logga da un PC diverso da quello su cui ha fatto il primo login (stesse credenziali ma soggetti diversi, ad esempio) il tuo secondo punto consentirebbe al secondo di "prevaricare" il primo, sbattendolo fuori dalla pagina

    io cambierei il secondo con una negazione all'accesso, magari suddividendo per pagine (segnandole nel database), prevedendo un limite di minuti per il lock: ad ogni operazione per quella pagina da parte di quell'utente da quell'IP aggiorno il DB con l'orario nuovo

    se ci fossero problemi sul client o l'utente si dimentica di uscire dalla pagina, una user da amministratore di livello superiore potrebbe avere una funzione di "unlock" delle pagine sbloccate che in pratica resetta il DB

  5. #5
    Ciao grazie per i consigli!
    si devo sicuramente aggiungere un campo date ultimo_accesso oltre al boolean (o anche int) che funziona da lock.
    Si inoltre il primo che si connette resta dentro e se mai sono gli altri ad avere l'accesso negato..
    Ovviamente il mio problema principale era proprio quello detto da clasku, ovvero se l'utente non fa il logout.
    E li mi dovrebbe aiutare la nuova variabile date ultimo_accesso.
    Infatti una possibile soluzione potrebbe essere:
    Quando l'utente si logga
    se (lock=true) -> continua
    se invece (lock = false e ultimo_accesso> 10 min) -> continua
    altrimenti -> nega accesso (perchè probabilmente c'è ancora un utente loggato)

    però i 2 svantaggi sono:
    1- se uno si logga ed esce senza fare il logout e prova a rientrare subito deve aspettare 10 min (può starci comunque)
    2- se uno si logga e dopo 10 min arriva un altro si logga anche l'altro,
    poichè faccio il controllo solo all'inizio.. se dovessi farlo piu spesso appesantirei le pagine con query di aggiornamento data ultimo_accesso. (questo è piu già piu grave..)

    proverò a fare cosi..

  6. #6
    Ma non fai prima a dire che una sessione è in uso se ha compiuto azioni negli ultimi 30 secondi?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Si quella sarebbe la soluzione migliore! Pensavo di usare le sessioni però non ho capito se si possono usare per fare questo.
    Ho letto molti articoli sulle sessioni ma non ho capito come fare una cosa del genere, ovvero capire se l'utente ha fatto operazioni recentemente...
    Per adesso se l'utente si logga correttamente apro una sessione e al logout la distruggo!
    Intendi session_set_cookie_params()?

  8. #8
    no intendo che la sessione di navigazione la salvi nel db e ti riporti in sessione un token che identifichi il record di navigazione nel db. Ad ogni refresh della sessione (ovvero ad ogni cambio pagina es) controlli nel db lo stato del token in sessione: se è valido, aggiorni un campo tipo "last_action" a "now" e continui a far navigare l'utente, se non è valido (è impostato a "false" un campo "valid" oppure now()-last_action > XX secondi) distruggi la sessione e rimandi l'utente a loggarsi. Quindi per evitare che ci sia una doppia login con la stessa username:

    - se l'utente che si logga inserisce credenziali valide, controlli che nel databse delle sessioni non ci sia già un token valido.
    - se esiste un token valido hai due opzioni:

    1) invalidare il token precedente (l'altro utente che lo usa, se esiste, verrà quindi sloggato di forza)
    2) impedire all'utente attuale di loggarsi dando l'avviso che la username è già in uso

    - se il token non esiste, crei il record e inizi la sessione di navigazione

    EDIT:

    - se il token già esiste ma now() - last_action > XX secondi, lo invalidi e permetti all'utente di loggarsi
    - se l'utente fà logout, metti invalido il token
    - suggerisco uno scrippettino ajax in ogni pagina che mandi ogni tot secondi una richiesta per controllare lo stato della login (e quindi aggiornare ad ogni richiesta il last_action del record) in maniera da non costringere l'utente a muoversi per le pagine per fare in modo di mantenere viva la sessione (a meno che non si desideri tale comportamento)
    Ultima modifica di Santino83_02; 08-11-2014 a 20:06
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    ariedit:

    controllare sempre l'ip di navigazione associato al token (non si accettano cambi di ip nello stesso token) e di user agent (?)
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.