2012-04-27 21 views
5

Mi scuso in anticipo per la natura generica della mia domanda, ma non sono riuscito a trovare alcun consiglio utile da parte di persone che cercavano di fare la stessa cosa di me sul web. Lasciatemi descrivere il mio scenario:ASP.NET MVC 3 Razor View Restrictions

Sto fornendo agli utenti finali/progettisti di un sito Web la possibilità di personalizzare le loro viste memorizzando le viste (usando Razor) nel database. Ho tutto questo lavoro, ma la mia domanda è la seguente; Dal punto di vista della sicurezza, come posso garantire e applicare il codice indesiderato che non viene eseguito nella vista definita dall'utente? Ci sono due approcci di base che penso funzioneranno concettualmente, ma non sono sicuro quale sia il più possibile o fattibile.

Opzione 1: creare un metodo di convalida nello strumento di amministrazione che consente all'utente di immettere il codice di visualizzazione. Ciò richiederebbe un approccio di whitelist o blacklist a ciò che è consentito o meno.

Opzione 2: impedisce l'esecuzione del codice indesiderato durante il rendering della vista.

Come esempio rapido di qualcosa che deve essere bloccato, non desideriamo consentire l'accesso per leggere o scrivere file, accedere a qualsiasi funzione di accesso ai dati o persino accedere alle impostazioni di configurazione, ecc. Nel web.config . Probabilmente ci sarà un elenco di cose di dimensioni decenti che probabilmente non dovrebbero essere consentiti, ma dovrò sedermi e provare a pensare al maggior numero possibile di problemi legati alla sicurezza.

La mia domanda è, quale metodo sarebbe la migliore scommessa? Inoltre, è possibile fornire una guida su come procedere? Pensavo di poter apportare modifiche basate sul livello di fiducia che sarebbero state l'Opzione 2, ma non sono riuscito a trovare un modo per farlo funzionare in un ambiente gestito da vista (il codice di amministrazione è autorizzato a eseguire qualsiasi cosa voglia). Penso che l'opzione 1 finirà per essere la migliore scommessa e dovrò verificare l'input di alcune funzioni di framework che non dovrebbero essere consentite. Qualcuno ha qualche esperienza facendo qualcosa di simile a quello che sto cercando di fare? QUALSIASI feedback è molto apprezzato!

+0

L'opzione 2 sarebbe terribile dal punto di vista dell'utente che potrebbe provare a utilizzare codice che altrimenti non sapeva fosse "cattivo". Sono d'accordo con SLaks un approccio alla lista bianca sarebbe meglio, e non conosco la natura esatta del tuo progetto come chi sono i tuoi consumatori, ma questo sarà un compito difficile a seconda di quanta flessibilità hai bisogno di dare loro. – AwDogsGo2Heaven

+0

Stavo per suggerire di controllare Liquid markup, poi ho trovato [DotLiquid] (http://dotliquidmarkup.org/try-online). Sembra che copra ciò che stai cercando di realizzare (ma con Liquid invece di Razor). –

risposta

1

Ciò sarebbe estremamente difficile.

È possibile eseguire il modello tramite il preprocessore Razor, quindi utilizzare Roslyn (ancora nella versione beta precedente) per analizzare il file generato e consultare tutte le chiamate di metodo (oi costruttori) e restituire un errore se chiama qualcosa che non si utilizza mi piace
Raccomando vivamente di utilizzare una lista bianca per questo, dal momento che il framework .Net è abbastanza grande da trascurare qualcosa in una lista nera.


Tuttavia, vorrei invece consiglia di non utilizzare il rasoio a tutti e invece di utilizzare un motore di template che non consente vero codice C#.

+0

Inizialmente ho iniziato con un motore di template personalizzato, ma sembra esserci molti vantaggi nell'applicare il motore di visualizzazione Razor. cioè capacità integrata per attività di programmazione di viste comuni come condizionali, cicli e il fatto che fornisce l'accesso al modello. Inoltre sembra che il meccanismo di memorizzazione nella cache integrato salverà molte risorse invece di dover implementare qualcosa di più personalizzato per un sistema di template personalizzato. L'unico vero inconveniente che riesco a trovare (anche se ovviamente è un grave inconveniente) è la sicurezza.Se riesci a pensare a più svantaggi, questo potrebbe farmi riconsiderare. –

Problemi correlati