Sicurezza per WCF RIA Services
In questo argomento vengono fornite le indicazioni per garantire un utilizzo sicuro di un servizio del dominio. Quando si espone un servizio del dominio applicando l'attributo EnableClientAccessAttribute, il servizio del dominio sarà disponibile a tutti gli utenti della rete in cui viene esposto. Non si può supporre che l'applicazione client utilizzata sia l'unica applicazione che accederà al servizio del dominio. Questa considerazione è particolarmente importante in una rete pubblica. È tuttavia importante anche in una rete con restrizioni, ad esempio una rete aziendale, quando vengono esposti dati riservati.
La finestra di dialogo Aggiungi una nuova classe DomainService consente di produrre un codice utile per iniziare a utilizzare un servizio del dominio. Il codice prodotto non è necessariamente pronto per la distribuzione. Il codice deve essere rivisto e modificato per soddisfare i requisiti di sicurezza dell'applicazione utilizzata. In particolare, è necessario considerare le operazioni che verranno rese disponibili a tutti gli utenti della rete. L'elenco di controllo seguente rappresenta un punto di partenza per garantire un utilizzo sicuro di un servizio del dominio.
Elenco di controllo di sicurezza
Per garantire un utilizzo sicuro di un servizio del dominio, considerare le indicazioni seguenti.
Ridurre i dati e le operazioni esposti da un servizio del dominio. Si tratta della prima linea di difesa contro la diffusione di informazioni e l'attacco di tipo Denial of Service.
Esporre solo le entità richieste dal client. Questo approccio può richiedere che si separino la convalida e logica server dalla convalida e logica client, se consente di ridurre il numero di entità esposte. Se ad esempio un'applicazione della nota spese non richiede l'entità Dipendente sul client, è consigliabile non esporla tramite un servizio del dominio.
Definire le entità in modo da evitare l'esposizione di dati riservati. È possibile utilizzare l'attributo ExcludeAttribute o i Modelli di presentazione per ridurre i dati disponibili per un client. Se ad esempio la nata di nascita e il numero di previdenza sociale non sono necessari in un'applicazione, escluderli dalla struttura visibile al client.
Utilizzare i metodi di query con i parametri necessari nell'applicazione, anziché basarsi sulle funzionalità di filtro dei dati di LINQ. Se ad esempio vengono visualizzate le note spese di un dipendente specificato, è consigliabile richiedere un ID dipendente come parametro nel metodo di query anziché fornire un metodo che ottiene tutte le note spese. Questo approccio riduce la raccolta potenziale di dati per tutti i dipendenti.
Creare metodi di query che forniscono solo i dati necessari per gli scenari specifici nell'applicazione. Con questo approccio è possibile fornire più metodi di query che restituiscono parti dei dati anziché un solo metodo di query che restituisce tutti i dati. Se ad esempio i prodotti vengono visualizzati per categoria o fornitore, è possibile fornire due metodi che accettano le informazioni relative alla categoria o al fornitore, anziché un solo metodo che restituisce tutti i prodotti.
Filtrare i dati in modo da fornire solo quelli richiesti normalmente per l'applicazione. Ad esempio, è possibile utilizzare un metodo di query che restituisce solo gli ordini evasi l'anno precedente.
Limitare il numero di risultati che può essere restituito da una query in modo da ridurre l'overload accidentale o intenzionale del server. Utilizzare la proprietà ResultLimit nell'oggetto QueryAttribute per limitare i numeri di risultati che possono essere restituiti. Se ad esempio è possibile che venga restituito un numero elevato di prodotti, applicare la funzionalità di paging nel client limitando i risultati a 20. Considerare inoltre l'utilizzo dell'attributo OutputCacheAttribute per la memorizzazione dell'output nella cache in modo da ridurre il carico nel livello intermedio e nel database.
Ridurre il numero di operazioni per ogni entità esposta. Se ad esempio un'applicazione per ordini deve solo aggiungere o modificare alcuni ordini, è consigliabile esporre le operazioni di query, inserimento e aggiornamento sull'entità ordini, ma non le operazioni di eliminazione. Inoltre, è consigliabile esporre solo le operazioni di query per l'entità prodotti e non le operazioni di modifica dei dati.
Se possibile, utilizzare i metodi di aggiornamento denominati che limitano il numero di membri da aggiornare.
Limitare l'accesso ai dati e alle operazioni agli utenti autenticati e agli utenti con ruoli specifici.
Se possibile evitare l'accesso anonimo utilizzando l'attributo RequiresAuthenticationAttribute. Quando è necessario consentire l'accesso anonimo, limitarlo al minor numero di set di servizi del dominio e al minor numero di subset di operazioni all'interno di tali servizi del dominio.
Se possibile aggiungere l'attributo RequiresRoleAttribute specifico dell'operazione. Considerare ogni operazione separatamente in un servizio del dominio. Ad esempio, è possibile che tutti gli utenti debbano eseguire una query sull'entità prodotti, ma solo gli utenti nel ruolo di amministratore debbano eseguire un aggiornamento.
Utilizzare la proprietà AuthorizationContext per fornire un modello di autorizzazione personalizzato.
Diffidare dei dati inviati da un client. Un client dannoso, sebbene possa essere autenticato e autorizzato, può fornire valori alterati per valori correnti e originali in un set di modifiche. La logica dell'applicazione non deve presupporre che questi valori siano attendibili. Considerare invece i valori originali alterati come minacce potenziali.
Utilizzare il protocollo https per l'Autenticazione basata su form. L'invio di password in testo non crittografato rappresenta una vulnerabilità significativa, che però può essere ridotta mediante l'utilizzo di https.
Esporre il numero minimo di endpoint. Per impostazione predefinita, RIA Services crea un endpoint binario per un servizio del dominio. Aggiungere ulteriori endpoint solo se si dispone di client che li richiedono specificamente. Disabilitare tutti gli endpoint che non vengono utilizzati.