Sdílet prostřednictvím


Zabezpečení (LINQ to DataSet)

Toto téma popisuje problémy se zabezpečením v LINQ to DataSet.

Předání dotazu do nedůvěryhodné komponenty

Dotaz LINQ to DataSet lze formulovat v jednom bodě programu a provést ho v jiném. V okamžiku, kdy je dotaz formulován, může dotaz odkazovat na libovolný prvek, který je v daném okamžiku viditelný, například soukromé členy třídy, do které volající metoda patří, nebo symboly představující místní proměnné/argumenty. V době provádění bude dotaz efektivně mít přístup k těm členům, na které dotaz odkazoval při formulaci, i když volající kód nemá přehled o nich. Kód, který spustí dotaz, nemá libovolnou přidanou viditelnost, protože nemůže zvolit, k čemu má přistupovat. Bude mít přístup výhradně k tomu, k čemu dotaz přistupuje, a pouze prostřednictvím samotného dotazu.

To znamená, že předáním odkazu na dotaz jinému kusu kódu, kterému komponenta přijímající dotaz důvěřuje, má přístup ke všem veřejným a soukromým členům, na které dotaz odkazuje. Obecně platí, že dotazy LINQ to DataSet by neměly být předány nedůvěryhodným komponentám, pokud nebyl dotaz pečlivě sestaven tak, aby nezpřístupnil informace, které by měly být soukromé.

Externí vstup

Aplikace často provádějí externí vstup (od uživatele nebo jiného externího agenta) a provádějí akce na základě daného vstupu. V případě LINQ to DataSet může aplikace vytvořit dotaz určitým způsobem na základě externího vstupu nebo použít externí vstup v dotazu. Dotazy LINQ to DataSet přijímají parametry všude, kde jsou přijímány literály. Vývojáři aplikací by měli používat parametrizované dotazy místo vkládání literálů z externího agenta přímo do dotazu.

Jakýkoli vstup přímo nebo nepřímo odvozený od uživatele nebo externího agenta může mít obsah, který využívá syntaxi cílového jazyka k provádění neoprávněných akcí. To se označuje jako útok prostřednictvím injektáže SQL, který je pojmenovaný podle vzoru útoku, ve kterém je cílový jazyk Transact-SQL. Uživatelský vstup vložený přímo do dotazu se používá k vyřazení databázové tabulky, k odepření služby nebo k jiné změně povahy prováděné operace. I když je v LINQ to DataSet možné složení dotazů, provádí se prostřednictvím rozhraní API objektového modelu. Dotazy LINQ to DataSet se nevykládají pomocí manipulace s řetězci nebo zřetězení, protože jsou v jazyce Transact-SQL a nejsou náchylné k útokům prostřednictvím injektáže SQL v tradičním smyslu.

Viz také