L'utente non può navigare nella pagina web attraverso l'interfaccia utente a causa delle autorizzazioni, ma è in grado di navigare verso la pagina incollando l'URL. Come proteggi contro questo?

69

Nella mia applicazione, gli utenti hanno determinati ruoli che hanno permessi. Queste autorizzazioni determinano quali elementi dell'interfaccia utente sono disponibili per loro nella schermata iniziale. Molti degli elementi si collegano ad altre pagine, che molti utenti non possono vedere perché le loro autorizzazioni non consentono loro di accedere a quella pagina Web.

Ad esempio, un pulsante chiamato button1 collega a una pagina a caso nell'applicazione, diciamo http://www.example.com/example.jsp . Tuttavia, l'utente John ha le autorizzazioni impostate che non gli permettono di vedere button1 . Pertanto, John non può andare a http://www.example.com/example.jsp .

Il problema che sto riscontrando è che se ho eseguito l'accesso come John e lo incollo, questo mi porterà alla pagina.

Ovviamente questo è un enorme rischio per la sicurezza se un utente malintenzionato ottiene l'URL di una pagina amministratore, ad esempio. Quindi, come posso proteggermi da questo? Devo verificare l'utente per ogni singola pagina, controllando le autorizzazioni e assicurandomi che possano essere lì?

Ci sono centinaia di pagine in questa applicazione e sembra molto ridondante e non efficiente includere il codice su ogni pagina per farlo. C'è un modo più semplice per farlo rispetto al metodo che ho appena menzionato?

    
posta Michael 10.10.2017 - 18:33
fonte

7 risposte

345

Do I need to verify the user for every single page?

Assolutamente. Non solo ogni pagina, ma ogni richiesta a una risorsa privilegiata, ad esempio la richiesta POST per aggiornare i dati, eliminare, visualizzare, ecc. Ecc. Non si tratta solo di visualizzare le pagine, si tratta di controllare chi può fare cosa sul proprio sistema. / p>

Sembra che l'intero sistema di autenticazione e permessi sia rotto nella sua attuale implementazione. I passaggi per rimediare a questo sono troppo ampi per questa unica risposta. Vale la pena una ricerca generale di questo forum e la rete più ampia per trovare soluzioni adatte al proprio framework (JSP, ASP.Net, PHP, ecc.). La maggior parte dei framework ha funzionalità pronte all'uso per risolvere questo problema.

Un buon inizio sarebbe questa guida di alto livello di OWASP: Sicurezza operativa: Interfacce amministrative .

    
risposta data 10.10.2017 - 18:43
fonte
37

La risposta rapida è sì, come hai raccolto. Ma non ha bisogno di essere l'enorme lavoro a cui stai pensando. (L'intera faccenda della sicurezza potrebbe essere grande, ma questa è solo una parte di essa). Hai problemi ben più gravi di questo.

Perché è importante

QUALUNQUE che crei sarà colpito dai tentativi di romperlo. Qualcuno sarà curioso Qualcuno farà qualcosa che non ti saresti mai aspettato e che sfida il tuo pensiero. Qualcuno sarà curioso, o malizioso, o ficcanaso.

Dovresti anche dare per scontato che il tuo software / app web sarà testato con strumenti automatici . I server con un portale online (di qualsiasi tipo) vengono scoperti dagli hacker entro decine di minuti dal primo accesso online e iniziano a essere esaminati per uno qualsiasi di migliaia di possibili errori di sicurezza o sviste. Ciò significa che controllano ciò che sta funzionando "dietro le quinte", oltre a eventuali errori rilevabili che possono essere sfruttati (nella convalida dei dati, nella convalida dei cross scripting, nell'iniezione SQL o binaria, nell'hacking di JavaScript, nel back-end stesso, cosa i punti deboli possono sorgere costringendo qualcosa a fallire, quali dati possono essere esposti ...).

I tuoi server web saranno controllati in questo modo, costantemente, per eventuali codici Web e intervalli di back-end, da centinaia se non da migliaia di strumenti automatizzati. Questo è così come gli umani e gli utenti, non al posto di.

Preferiresti che questo fosse in fondo alla strada e portato alla tua attenzione con forza da critici, media e utenti irritati, o portato alla responsabilità? O preferisci ripararlo?

Come risolverlo

Non è un lavoro enorme in un senso. Si crea una struttura di sicurezza e quindi ogni pagina viene importata o utilizzata. I concetti per farlo non sono difficili e sono ben documentati. Quindi il numero di pagine non è un grosso problema.

La parte difficile del lavoro è che la sicurezza è difficile . Il tuo vero problema è che, dal fatto che questi problemi ci sono e stai facendo queste domande, non ne sai abbastanza per avere una speranza di farlo senza aiuto. Sul serio. Tu. Fare. Non.

Non so che team di dimensioni hai o risorse. Ne hai bisogno - e probabilmente non hai la speranza di farlo senza un aiuto esterno.

La mia vera preoccupazione qui

Detto questo, la mia vera preoccupazione non è l'app web. È la mentalità che suggerisce questa domanda.

Immagina di prendere in considerazione l'acquisto o l'utilizzo della tua app.

Non aiuta, o rassicura il lettore, che a quanto pare consideri la sicurezza come un ripensamento, un'interruzione del tuo lavoro o un inconveniente da sistemare in seguito (o non la capisci abbastanza che finora l'hai trattata in questo modo), e forse i problemi sono cose che sono veramente fondamentali, come codificare correttamente l'URL di un pulsante.

La sicurezza è il tuo lavoro, perché, per quanto tecnicamente meraviglioso sia il prodotto / servizio e chiunque sia il suo utente, il tuo prodotto reale è fiducia e sicurezza che ti rivolgerai al mio bisogni e non mi causano un grave disastro.

Dovrei fidarmi della tua app con i miei dati? Al momento, e mi dispiace dirlo, penso che potrei anche pubblicarlo su Google+. Sì, è "quella cattiva" una situazione e un'impressione, e questo non lo sta esagerando per effetto.

Mi dispiace.

Ora, se la tua app è valida, coinvolgi qualcun altro.

    
risposta data 11.10.2017 - 19:42
fonte
28

Devi controllare il permesso utente livello per ogni richiesta (GET, POST, PUT, DELETE). Navigando in una pagina, come nel tuo caso, c'è una richiesta GET. Un utente non dovrebbe essere in grado di pubblicare una richiesta senza autorizzazione.

Ora, se è necessario aggiungere il codice su ciascuna pagina dell'applicazione dipende dal framework dell'applicazione. Ad esempio, alcuni framework (Laravel, Express.JS) consentono di raggruppare le rotte e applicare un filtro a ciascuna richiesta per quella rotta, ed è qui che si inseriscono i controlli. Per le applicazioni in PHP semplice, è necessario disporre del codice su ogni pagina, è possibile utilizzare l'istruzione "include" per ridurre al minimo la ripetizione dell'intero blocco del codice.

    
risposta data 10.10.2017 - 23:46
fonte
7

È già stato detto prima, ma, sì, dovresti verificare le tue credenziali utente su ogni pagina. Ad esempio, se il tuo sito utilizza PHP, il modo più semplice per farlo è quello di salvare l'utente loggato e il loro livello di privilegio nelle variabili di sessione, quindi eseguire una verifica di queste variabili di sessione all'inizio del codice. Questi vengono cancellati al logout (se hai creato la logica di logout per cancellare queste variabili) o il timeout della sessione (il tempo per il timeout può essere definito, ma penso che l'impostazione predefinita sia 5 minuti di inattività), quindi un utente non autorizzato non dovrebbe poter accedere una pagina. Altre tecnologie avranno una gestione simile.

In realtà non intendo sembrare accondiscendente quando dico questo, quindi spero che tu non lo veda sotto quella luce, ma questa è una specie di informazione sul pane e burro. Se in qualche modo non l'hai imparato o non hai trovato questo nei tuoi studi autonomi, ti consiglio caldamente di prenderne atto e di leggere un po 'più approfonditamente su questo particolare argomento, perché è molto importante. Lo farai ripetutamente per qualsiasi applicazione simile del genere.

Prendi nota del fatto che ci sono vari modi per farlo in un modo semplice ed efficiente, e un mio suggerimento personale sarebbe di esercitarti a codificarlo nella tua logica in modo da comprendere appieno come funziona, prima di te provare a utilizzare un framework. Provalo con diversi metodi di accesso e, una volta che sei soddisfatto, puoi esaminare in che modo i vari framework eseguono la gestione delle sessioni utente.

EDIT : lo metto su un commento in basso, ma questa è in realtà una buona risorsa anche per OP: link

    
risposta data 11.10.2017 - 01:11
fonte
3

L'utente non deve essere in grado di navigare verso la pagina indipendentemente dal fatto che digiti l'indirizzo o clic sul link.

Una soluzione generica al tuo problema consiste nell'utilizzare un approccio basato sul controllo degli accessi basato sui ruoli (RBAC). Crea diversi gruppi e assegna utenti di uguali privilegi al gruppo corrispondente. Allo stesso modo, raggruppa pagine web e altre risorse all'interno di cartelle diverse; ognuno di proprietà di un gruppo specifico. Ho usato chgrp (cambia gruppo) per ottenere questo risultato su un sistema che esegue Linux incorporato con un server web leggero. Lo stesso può essere ottenuto nel server web Apache inserendo un file .htaccess e negando l'accesso come menzionato su Stack Overflow .

Per gli elementi dell'interfaccia utente, dovrai creare pagine diverse (o nascondere elementi per controllo di gruppo). Dovrai identificare l'utente (registrandoli e determinandone il gruppo corrispondente) e quindi visualizzare pagine web in base ai privilegi dell'utente.

    
risposta data 10.10.2017 - 19:11
fonte
1

Solo un rapido suggerimento sull'implementazione, dal momento che hai qualche dubbio su centinaia di pagine. Ad esempio, in ASP.NET MVC, puoi creare un filtro globale o una pagina "base" da cui tutti gli altri potrebbero ereditare.

Quindi il codice, che si trova centralmente, potrebbe controllare il contesto / sessione dell'utente e confrontarlo con un elenco di diritti / permessi / o appartenenza al gruppo per la pagina corrente (forse una struttura dati su ogni pagina o una ricerca del database basata su nome della pagina, ecc.).

    
risposta data 10.10.2017 - 23:25
fonte
1

Altre risposte sono state molto generiche, quindi aggiungerò questo perché sono state menzionate pagine JSP , quindi penso di posso presumere che tu stia lavorando in Java.

Come tale, molto probabilmente puoi usare Filtri fare eseguire il codice ogni volta che viene fatta una richiesta all'applicazione. Se si utilizza un framework di sicurezza come Spring è possibile configurare URL a cui è possibile accedere e da chi.

    
risposta data 14.10.2017 - 04:44
fonte

Leggi altre domande sui tag