Zabezpieczenia (LINQ to DataSet)
W tym temacie omówiono problemy z zabezpieczeniami w zestawie danych LINQ to DataSet.
Przekazywanie zapytania do niezaufanego składnika
Zapytanie LINQ to DataSet można sformułować w jednym punkcie programu i wykonać je w innym. W momencie, gdy zapytanie jest sformułowane, zapytanie może odwoływać się do dowolnego elementu widocznego w tym momencie, takiego jak prywatne elementy członkowskie klasy, do której należy metoda wywołująca, lub symbole reprezentujące zmienne lokalne/argumenty. W czasie wykonywania zapytanie będzie mogło uzyskać dostęp do tych elementów członkowskich, do których odwołuje się zapytanie podczas formułowania, nawet jeśli kod wywołujący nie ma do nich wglądu. Kod, który wykonuje zapytanie, nie ma dowolnej dodatkowej widoczności, ponieważ nie może wybrać, do czego chcesz uzyskać dostęp. Będzie on mógł uzyskać dostęp wyłącznie do tego, do czego uzyskuje dostęp zapytanie, i tylko za pośrednictwem samego zapytania.
Oznacza to, że przekazanie odwołania do zapytania do innego fragmentu kodu składnika odbierającego zapytanie jest zaufane z dostępem do wszystkich publicznych i prywatnych elementów członkowskich, do których odwołuje się zapytanie. Ogólnie rzecz biorąc, zapytania LINQ to DataSet nie powinny być przekazywane do niezaufanych składników, chyba że zapytanie zostało starannie skonstruowane tak, aby nie ujawniało informacji, które powinny być przechowywane jako prywatne.
Dane wejściowe zewnętrzne
Aplikacje często pobierają dane wejściowe zewnętrzne (od użytkownika lub innego agenta zewnętrznego) i wykonują akcje na podstawie tych danych wejściowych. W przypadku linQ to DataSet aplikacja może utworzyć zapytanie w określony sposób na podstawie danych wejściowych zewnętrznych lub użyć danych wejściowych zewnętrznych w zapytaniu. Zapytania LINQ to DataSet akceptują parametry wszędzie tam, gdzie są akceptowane literały. Deweloperzy aplikacji powinni używać zapytań sparametryzowanych, a nie wstrzykiwania literałów z agenta zewnętrznego bezpośrednio do zapytania.
Wszelkie dane wejściowe bezpośrednio lub pośrednio pochodzące od użytkownika lub agenta zewnętrznego mogą mieć zawartość, która korzysta ze składni języka docelowego w celu wykonywania nieautoryzowanych akcji. Jest to nazywane atakiem polegającym na wstrzyknięciu kodu SQL o nazwie po wzorcu ataku, w którym język docelowy to Transact-SQL. Dane wejściowe użytkownika wprowadzone bezpośrednio do zapytania są używane do porzucania tabeli bazy danych, spowodowania odmowy usługi lub zmiany charakteru wykonywanej operacji. Chociaż kompozycja zapytań jest możliwa w zestawie danych LINQ to DataSet, jest wykonywana za pośrednictwem interfejsu API modelu obiektów. Zapytania LINQ to DataSet nie składają się przy użyciu manipulowania ciągami ani łączenia, ponieważ są one w języku Transact-SQL i nie są podatne na ataki iniekcji SQL w tradycyjnym sensie.