2010-01-18 14 views
7

Sto lavorando a un sito Web (sviluppato in ASP.NET con C#) che è stato trasmesso a me. Come sto lavorando attraverso il sito, ho notato la maggior parte del sito ha questo tipo di codice in esso:Nascondere i controlli come una forma di sicurezza Web, suggerimenti per migliorare?

EmailLabel.Visible = false; 
WhateverButton.Visible = false; 
AnotherControl.Visible = false; 
... 

Tutto questo è in genere fatto nel code-behind del sito (nel metodo Page Load). Essenzialmente, questo è stato messo in atto per impedire ad un utente non connesso di accedere ai componenti (la regola per il sito è che un utente non registrato non dovrebbe poter vedere alcuna parte del sito fino al momento in cui si effettua il login). Il modo sopra funziona ... ma sembra piuttosto costoso dover controllare sempre se l'utente ha effettuato l'accesso e quindi girare allo stato corretto per tutti quei componenti.

C'è un modo diverso che questo problema possa essere affrontato. Solo a pensarci su/ricerca, ho pensato che forse ci sarebbe stato un modo per reindirizzare alla home page se un utente non ha effettuato l'accesso. Inoltre, potrei estendere una pagina base che farebbe questo per qualsiasi pagina che estende la pagina di base. Tuttavia, le mie conoscenze in questo settore sono limitate, quindi il mio suggerimento potrebbe non funzionare.

Cosa può suggerire? Qualcosa di meglio? Cosa c'è abbastanza buono?

risposta

2

Lo facciamo molto al mio lavoro.

Il modo in cui questo viene realizzato creando una classe BasePage che eredita da System.Web.UI.Page. Quindi esegui l'override di OnInit, chiama la base.OnInit e aggiungi il codice per verificare l'accesso dell'utente. Se l'utente non ha effettuato l'accesso, reindirizza a una pagina di accesso (che non erediterebbe da BasePage.)

Quindi, su ogni pagina che deve essere protetta, è sufficiente modificare la pagina per ereditare da BasePage.

E contrariamente a quanto detto in precedenza, se si scrive Response.End(); dopo il reindirizzamento, è molto più veloce che continua a elaborare il resto della pagina!

Spero che questo aiuti.

+0

Sebbene questo approccio sia decisamente consigliato per la maggior parte delle situazioni, è impossibile che sia più veloce. In che modo l'impostazione di alcune variabili booleane può essere ovunque vicino al sovraccarico dell'emissione di un roundtrip 301 al browser? Stai parlando di nanosecondi di tempo del processore rispetto a centinaia di millisecondi di latenza di rete e del server che gestisce più richieste del browser. E Response.End() genera una ThreadAbortException, che genera il proprio overhead. – womp

+0

Giusto per chiarire però - proteggere le pagine che richiedono * solo * l'accesso autenticato dovrebbe essere fatto in questo modo. Non sono sicuro se l'OP lo richiede o meno. – womp

+1

Il motivo per cui questo è più veloce, è che nessuno dei Metri di Page-Cycle dopo OnInit viene chiamato in questo modo. Risparmio di tempo nella CPU. E a tutti gli effetti, un utente in caso di mancato accesso deve attendere un ulteriore roundtrip e il tempo associato ad esso. – TJMonk15

1

E sarebbero molti, molti ordini di grandezza più costoso di emettere un reindirizzamento che per impostare i flag visibile su una serie di controlli.

Se la pagina consente sia l'accesso anonimo sia l'accesso effettuato, il reindirizzamento richiederebbe anche l'autorizzazione per l'accesso anonimo in un altro modo, probabilmente creando una seconda versione della pagina.

La domanda di spesa è in realtà solo una parte, anche se, probabilmente non importa affatto. Per rispondere alla tua domanda principale, senza saperne di più sull'architettura della tua app, considererei entrambe queste cose indesiderabili. I vantaggi di impostare semplicemente i controlli su Visible = false è che non viene eseguito il rendering al flusso di output per i controlli invisibili, ma possono comunque interagire con le richieste del server.

Senza saperne di più sui requisiti della tua pagina, è difficile suggerire alternative. Come menzionato da qualcun altro, un LoginView potrebbe soddisfare le tue esigenze se i controlli invisibili non partecipano affatto agli utenti anonimi.

+0

Buona risposta (+1), ma sono curioso del perché un reindirizzamento sia "molti ordini di grandezza più costosi". Soprattutto perché ci sono poche possibilità che un utente che non ha effettuato il login sia in grado di "uscire" dalla home page (a meno che non memorizzino l'indirizzo in una pagina a caso). Quindi, questo non dovrebbe essere qualcosa che dovrebbe accadere spesso. – JasCav

+0

Considera che l'impostazione di alcuni flag visibili richiede alcuni cicli del processore, mentre la generazione di un reindirizzamento richiede un round-trip al browser, con tutta la latenza di rete, le risorse del server per gestire una nuova richiesta e completare il ciclo di vita della pagina da gestire. – womp

Problemi correlati