2012-01-05 12 views
38

Utilizzando la libreria Dynamic LINQ (link), è vulnerabile all'iniezione? e (in caso affermativo) come può essere protetto contro?È possibile l'iniezione tramite Dynamic LINQ?

Alcuni sfondo da Security Considerations (Entity Framework):

LINQ alle entità attacchi di iniezione:

Sebbene composizione query è possibile in LINQ alle entità, è eseguita attraverso l'oggetto del modello API. A differenza delle query di Entity SQL, le query LINQ alle Entità non sono composte utilizzando la manipolazione delle stringhe o la concatenazione e non sono suscettibili agli attacchi di iniezione SQL tradizionali.

Poiché Dynamic SQL è composto da stringhe vuol dire che potrebbe essere suscettibile ai vettori di iniezione? O LINQ to SQL si occuperà automaticamente della parametrizzazione dei valori in base al tipo di dati sottostante all'interno della libreria Dynamic LINQ?

O è del tutto sicuro poiché la query dinamica verrà eseguita in memoria anziché contro SQL (annullando in tal modo eventuali vantaggi dagli indici SQL)?

Ho lavorato attraverso la comprensione del codice DynamicLibrary.cs ma sono sicuro che potrei facilmente trascurare qualcosa.

Poiché questa domanda riguarda la libreria Dynamic LINQ, questa domanda può essere considerata valida sia per linq-to-sql sia per linq-to-entities (nonostante il riferimento sopra a Entity Framework).

risposta

29

Bene, non sono d'accordo che l'iniezione non è possibile in Linq dinamica.

quanto descritto nel answer da Ɖiamond ǤeezeƦ è corretto ma appies a standard di LINQ come costruito all'interno del linguaggio dato - C# o VB.Net o chiamando metodi di estensione come .Where con funzioni lambda.

Quindi, è vero, non è possibile iniettare nulla poiché il traduttore .NET Linq to Sql è, ovviamente, scritto in modo decente. Quindi, "l'iniezione SQL" non è possibile, è vero.

Tuttavia, ciò che è possibile con Dynamic Linq è l'attacco "Linq injection". Nella spiegazione di sicurezza di LINQ citati da OP, si afferma:

LINQ a query Entità non sono composti utilizzando manipolazione di stringhe o concatenazione, e non sono suscettibili di tradizionali attacchi di iniezione SQL.

E fondamentalmente questo è un succo. Se le query sono composte da una manipolazione di stringhe, è soggetto a attacchi di iniezione. E Dynamic Linq è in realtà composto da stringhe, quindi è potenzialmente soggetto ad attacchi per iniezione.

Ovviamente, l'utente malintenzionato deve essere consapevole del fatto che si sta utilizzando DynamicLinq e potrebbe attaccare solo la preparazione dei dati, in modo che si traduca in una query di Linq dinamica dannosa valida.

voglio sottolineare questo fatto - la finale SQL è composto in modo sicuro , ma se originale dinamica LINQ è sicuro dipende da voi.

Il mosto per rendere la vostra query LINQ dinamica sicuro è quello di utilizzare segnaposti per tutti gli input dell'utente . Non concatenare mai la tua stringa!

Immaginate la seguente query:

dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\""); 

Se l'ingresso non è sterilizzata e non sfuggito, l'utente malintenzionato potrebbe potenzialmente ingresso:

200" or allowed == 0 and code == "200 

che si tradurrà in:

allowed == 1 and code == "200" or allowed == 0 and code == "200" 

Per evitare ciò, è necessario utilizzare segnaposto:

dataset.Where("allowed == 1 and code == @0", user_entered_data); 

DynamicLinq farà il segnaposto (in questo caso: i dati immessi dall'utente) un argomento lambda (invece di concatenare in query) e dipendono da LINQ to Entities (o qualunque backend è) per convertire in modo sicuro a SQL.

+0

Buon punto. La struttura non può proteggerti da te stesso. –

+0

Quindi l'iniezione con conseguente perdita di dati è ancora possibile, ma si è ancora isolati da un incidente "bobby tables" (eliminazione/modifica dati/eliminazione dati); cioè puoi causare una clausola select e where per modificare i record in un database? – Seph

+2

@Seph - no, non è possibile modificare i record poiché le query linq non verranno mai tradotte per aggiornare, inserire o rilasciare SQL. L'unico attacco possibile potrebbe essere ottenere un accesso a dati non autorizzati modificando i filtri "where". – Krizz

3

Da quello che so esaminando lo spazio dei nomi System.Data.Linq è che una struttura ad albero di SQL viene creata dalla query LINQ e come parte di questo processo viene chiamata la classe SqlParameterizer per sostituire tutti i valori in linea con i parametri. I valori vengono quindi assegnati ai parametri. Quindi gli attacchi di SQL injection non dovrebbero essere possibili.

+0

In genere è vero per linq, ma non necessariamente per linq dinamico (su cui OP chiede informazioni) dove le query sono stringhe, vedere la mia risposta. – Krizz

Problemi correlati