6 zásad, které vás ochrání před SQL injection

Při psaní nových testů dodržujte jednoduché pravidlo: jednotkový test pro logiku, integrační test pro spolupráci. Pokud píšete test pro třídu, která komunikuje s externí službou, nepoužívejte mock pro celé rozhraní, ale jen pro tu část, která je pro daný test podstatná. Tím předejdete tomu, že test projde, ale v reálném běhu se spojení rozpadne. Naopak u integračních testů nepoužívejte produkční data – vytvořte si malou testovací databázi s pevně danými hodnotami, abyste měli výsledky reprodukovatelné.<br> <br> <br> <br> <span style="font-weight: bold;">Při psaní kódu si zvykni na</span> používání verzovacího systému od samého začátku. I když děláš projekt sám, ušetří ti to čas při hledání chyb. Když něco rozbiješ, můžeš se vrátit k předchozí verzi. Mnoho začátečníků tuto disciplínu přeskakuje, ale později to litují. Dále se nauč používat nástroje pro ladění, které ti ukazují hodnoty proměnných v reálném čase. To je neocenitelné, když se ti aplikace chová jinak, než očekáváš.<br> <br> <br> <br> Při opravě zranitelnosti nepodceňujte ani chybové hlášky. Ve vývojovém prostředí si je můžete nechat zobrazovat detailně, ale v produkci je vypněte nebo nahraďte obecnými texty. Detailní chyba databáze útočníkovi prozradí strukturu tabulek, názvy sloupců i použitý databázový systém. Místo toho si veškeré chyby logujte do interního systému, kde k nim nemá přístup nikdo zvenčí. Zároveň mějte na paměti, že bezpečnost není jednorázová akce – s každou novou funkcí, která pracuje s databází, musíte znovu prověřit, jak je napsaná.<br> <br> <br> <br> <span style="font-weight: 900;">Dalším častým pochybením</span> je zřetězení řetězců při sestavování dotazů. Pokud skládáte SQL z proměnných bez použití prepared statements, dříve či později uděláte chybu. Stejně riskantní je dynamické sestavování dotazů podle uživatelských voleb, kde se může útočník dostat k nevyžádané části WHERE či ORDER BY. V takových případech vždy mapujte vstup na předem definované povolené hodnoty, nikoli na přímo zadaný text.<br> <br> <br> <br> Jak poznat, že je vaše aplikace zranitelná Základní test zvládnete sami. Najděte v aplikaci formulář nebo URL parametr, který posílá data na server. Zkuste do něj zadat jednoduchý SQL výraz, třeba apostrof. Pokud aplikace spadne nebo vrátí chybovou hlášku s detailem dotazu, je téměř jistě zranitelná. Dalším krokem je zkouška logické podmínky: zadejte dvě různé hodnoty, které se liší jen v pravdivostní podmínce, a sledujte rozdíl v odpovědi. Pokud se chování liší podle toho, zda vložíte podmínku, kterou databáze vyhodnotí jako pravdivou, nebo nepravdivou, máte problém. Automatické skenery najdou jen část chyb – ty složitější, jako je slepá SQL injection, si žádají ruční testování.<br> <br> <br> <br> Pokud používáte Redux Toolkit, využijte funkci createSlice, která generuje reducery a akce. Testování je pak jednodušší, protože máte hotové akční kreatory a reducer můžete importovat přímo. U async akcí s createAsyncThunk se testuje zvlášť generovaný reducer pro každý stav (pending, fulfilled, rejected) a zvlášť samotný thunk s mockovaným API. Tímto způsobem pokryjete celou logiku a nemusíte stavět žádné integrační prostředí.<br> <br> <br> <br> Jak najít rovnováhu, když už je pozdě Nejdřív si udělejte mapu současného stavu. Projděte si testy v repozitáři a rozdělte je podle toho, co skutečně ověřují. Jednotkové testy, které potřebují databázi, síť nebo souborový systém, jsou ve skutečnosti integrační a je třeba je tak i chápat. Toto překlasifikování vám ukáže, kde je poměr vychýlený. Často zjistíte, že máte stovky jednotkových testů, které jen opakují logiku implementace, a přitom chybí pár klíčových integračních testů pokrývajících hlavní toky aplikace.<br> <br> <br> <br> Ošetřete také chybové hlášení. Detailní výpisy databázových chyb, které obsahují části SQL dotazu, útočníkovi výrazně usnadní práci. V produkčním prostředí vypněte zobrazování chyb a místo toho logujte do souboru. Ujistěte se, že databázový účet používaný aplikací má minimální potřebná oprávnění – rozhodně ne práva správce databáze. Pokud dojde k napadení, útočník získá jen omezený dosah.<br> <br> <br> <br> <span style="font-weight: bolder;">První aplikace by měla být</span> co nejjednodušší. Vytvoř si aplikaci, která zobrazí text na obrazovce po stisknutí tlačítka. Tím se naučíš, jak funguje rozložení, jak propojit obrazovku s logikou a jak reagovat na uživatelské akce. Neboj se experimentovat, ale měj na paměti, že nejčastější chyba začátečníků je přidávat příliš mnoho funkcí hned na začátku. To vede k tomu, že se v kódu ztratíš a nevíš, co děláš. Drž se jednoduchosti a postupně přidávej další prvky, jako jsou vstupní pole nebo obrázky.<br> <br> <br> <br> Poslední zásada se týká pravidelné aktualizace a testování. Udržujte framework, databázové ovladače a knihovny v nejnovějších verzích, protože opravují známé zranitelnosti. Pravidelně provádějte penetrační testy a skenujte aplikaci automatizovanými nástroji. Ještě lepší je zavést bezpečnostní testy přímo do vývojového procesu. Při code review se zaměřte na místa, kde se pracuje s databází, a kontrolujte, zda jsou všechny dotazy parametrizované.