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

    Verifica permessi con stringa binaria [Gestione utenti]

    Ciao a tutti,
    si è spesso parlato della gestione utenti e della verifica dei permessi per visualizzare una data pagina (vedi gestire gli utenti con PHP e risorse simili).
    Sostanzialmente, i permessi dell'utente risiedono in un numero decimale salvato sul database.
    Al login, questo numero viene rilevato e salvato in qualche posto nel vettore di sessione.
    Trasformato poi in binario, ogni sua cifra darà il valore booleano al permesso corrispondente.

    Vorrei confrontare il mio meccanismo di base con voi per migliorarlo.

    $dec_num è il numero decimale con le informazioni sui permessi;
    $perm è il posto della stringa binaria a cui è associato un determinato permesso; logicamente il posto viene contato dalle cifre meno significative, cioè a partire da destra;

    La funzione auth_check($dec_num, $perm) avrà come argomenti il numero decimale da convertire in binario e il numero del permesso.
    Restituirà true o false a seconda che il permesso $perm ricercato nel numero $dec_num sia uno 0 o un 1.

    Codice PHP:
    function auth_check($dec_num$perm) {
        
    $bin_string = (string)decbin($dec_num);
        return 
    substr($bin_string, -$perm1);

    Il numero $dec_num viene trasformato da binario a decimale e poi parsato come una stringa.
    Quindi con la funzione substr() viene estratta la cifra binaria corrispondente al posto $perm. Il valore di $perm viene reso negativo per leggere la stringa da destra.

    Questo è il funzionamento di base e andrà perfezionato per evitare che la funzione restituisca il valore true nei casi in cui:
    [list=1][*]il numero $dec_num sia mancante;[*]$perm assuma valori negativi o nulli:[*]$dec_num assuma valori che in valore assoluto siano maggiori di strlen($bin_string)[/list=1]

    Codice PHP:
    function auth_check($dec_num 0$perm) {
        
    $bin_string = (string)decbin($dec_num);
        if (
    $perm Or $perm <= strlen($bin_string)) return false;
        return 
    substr($bin_string, -$perm1);

    Ho controllato che $perm non fosse superiore alla lunghezza della stringa $bin_string in quanto la funzione substr() di PHP restituirebbe sempre true per valori di $perm superiori alla lunghezza della stringa.

    In forma compressa per risparmiare qualche byte:

    Codice PHP:
    function auth_check($dec_num 0$perm) {
        return 
    $perm && $perm <= strlen(decbin($dec_num)) && substr((string)decbin($dec_num), -$perm1);

    Applicazione pratica:

    Codice PHP:
    if (@auth_check($_SESSION['permessi_utente'])) {
        
    // codice da eseguire per utenti autorizzati;
    } else {
        
    // codice da mostrare ai non autorizzati;

    Ho inserito l'operatore "@" davanti alla funzione perché la variabile di sessione $_SESSION['permessi_utente'] potrebbe non essere stata definita dalo script, magari in caso di login non effettuato (ed error_reporting sia su E_ALL).

    Si potrebbe obiettare che:
    [list=1][*]$dec_num = 0 nella dichiarazione della funzione è eccessivo, in quanto è un valore estratto da DB, e la nostra applicazione sicuramente effettuerà i dovuti controlli sull'utente in fase di registrazione e assegnazione dei permessi;[*]anche $perm è stabilito dallo script della pagina che richiama la funzione auth_check(), pertanto è inutile controllare che sia un numero positivo.[/list=1]

    ma dal momento che la sicurezza non è mai troppa VVoVe: ed è prudente prevedere anche errori dello script soprattutto nella fase di start up di una feature, un controllo in più non fa mai male.
    È chiaro che sarebbe impensabile far viaggiare i valori di queste variabili fuori dal server per esempio salvandoli nei cookies o peggio ancora passandoli via GET negli URL...

    Aspetto critiche (anche gravi ) ed osservazioni
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Potete testare la funzione da questa pagina
    http://www.netpark.it/test/auth_check.php

    modificando i valori a piacimento via GET nell'URL.

    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    Ho risolto il problema, la soluzione sta nelle operazioni bit a bit, che permettono sia la lettura dei permessi (operatore "&" o prodotto logico), sia la loro modifica (operatore "|" o somma logica).

    Avevo cercato già qualcosa di simile in passato, ma non avevo trovato questa risorsa:

    http://php.html.it/articoli/leggi/92...il-database/2/

    Se qualche moderatore mi avesse segnalato questo link, avrei inquinato di meno il forum! :rollo:
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

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 © 2024 vBulletin Solutions, Inc. All rights reserved.