Sicurezza (LINQ to DataSet)

Questo argomento illustra i problemi di sicurezza in LINQ to DataSet.

Passaggio di una query a un componente non attendibile

Una query LINQ to DataSet può essere formulata in un punto di un programma ed eseguita in un'altra. Nel punto in cui viene formulata, la query può fare riferimento a qualsiasi elemento visibile, ovvero membri private della classe cui appartiene il metodo chiamante oppure simboli che rappresentano variabili/argomenti locali. In fase di esecuzione la query sarà effettivamente in grado di accedere ai membri cui è stato fatto riferimento durante la formulazione anche se tali membri non sono visibili al codice di chiamata. Il codice che esegue la query non dispone di visibilità arbitraria aggiunta, in quanto non è in grado di scegliere gli elementi cui accedere. Può infatti accedere esclusivamente agli elementi accessibili alla query e solo tramite la query stessa.

Se pertanto un riferimento a una query viene passato a un'altra porzione di codice, il componente che riceve la query viene ritenuto attendibile e può accedere a tutti i membri public e private cui fa riferimento la query. In generale, le query LINQ to DataSet non devono essere passate a componenti non attendibili, a meno che la query non sia stata costruita attentamente in modo da non esporre informazioni che devono essere mantenute private.

Input esterno

Le applicazioni accettano spesso input esterno, ad esempio da un utente o da un altro agente esterno, ed eseguono azioni sulla base di tale input. Nel caso di LINQ to DataSet, l'applicazione potrebbe costruire una query in un determinato modo, in base all'input esterno oppure usare l'input esterno nella query. Le query LINQ to DataSet accettano parametri ovunque vengano accettati i valori letterali. Gli sviluppatori di applicazioni devono usare query con parametri, anziché inserire valori letterali direttamente nella query tramite un agente esterno.

Eventuale input derivato in modo diretto o indiretto dall'utente o da un agente esterno può includere contenuto che sfrutta la sintassi del linguaggio di destinazione per eseguire azioni non autorizzate. Tale fenomeno è noto come attacco SQL injection, il cui nome deriva da uno schema di attacco in cui il linguaggio di destinazione è Transact-SQL. L'input utente inserito direttamente nella query viene usato per rimuovere una tabella di database, determinare un attacco di tipo Denial of Service o alterare in altro modo la natura dell'operazione da eseguire. Sebbene la composizione di query sia possibile in LINQ to DataSet, essa viene eseguita attraverso l'API del modello a oggetti. Le query LINQ to DataSet non vengono composte mediante la manipolazione o la concatenazione di stringhe, perché si trovano in Transact-SQL e non sono soggette ad attacchi SQL injection nel senso tradizionale.

Vedi anche