Jak se bránit SQL injection ve webových aplikacích

De Wiki Informatica Gobierno Regional
Ir a la navegación Ir a la búsqueda

SQL injection patří mezi nejzávažnější a zároveň nejčastější zranitelnosti webových aplikací. Útočník do vstupních polí, URL parametrů či hlaviček vloží SQL příkazy, které se pak neoprávněně provedou nad databází. Důsledkem může být únik citlivých dat, jejich smazání nebo dokonce převzetí kontroly nad serverem. Obrana není složitá, ale vyžaduje důslednost a pochopení principu, na kterém útok funguje.

Praktickým tipem je také použití whitelistů pro vstupy, které mají omezený rozsah hodnot, jako jsou čísla stavů, identifikátory nebo výčtové typy. Pro textové vstupy, kde potřebujete zachovat formátování, použijte vrstvu pro escapování výstupu, nikoliv pro vstup. Pamatujte, že SQL injection se nevyhýbá ani JSON API, GraphQL dotazům nebo noSQL databázím, i když tam jsou principy trochu odlišné. Vždy proto testujte své aplikace nástroji pro dynamickou analýzu zranitelností a pravidelně provádějte penetrační testy.

Jednoduchý test může vypadat takto: def test_soucet(): assert 1 + 1 == 2. Když test spustíte, pytest zobrazí přehledně, kolik testů prošlo a kolik selhalo. Pokud test selže, vypíše podrobnosti o tom, kde a proč k selhání došlo. Tím získáte rychlou zpětnou vazbu. Pro lepší organizaci můžete testy rozdělit do více souborů a složek – pytest automaticky prohledává všechny soubory odpovídající vzoru test_*.py nebo *_test.py.

Na závěr: Express je mocný nástroj, ale nechte se vést jeho filozofií. Pište middleware, které řeší jeden úkol, a komponujte je dohromady. Testujte své endpointy pomocí nástrojů pro testování API, abyste odhalili problémy dřív, než je objeví uživatel. S těmito návyky si vybudujete rozhraní, které bude robustní, snadno rozšiřitelné a hlavně funkční v praxi.

Zavedením těchto opatření – parametrizované dotazy, minimální práva, skryté chyby, whitelisty a pravidelné testování – snížíte riziko SQL injection na minimum. Neexistuje univerzální stříbrný náboj, ale kombinace technik vás ochrání před drtivou většinou útoků. Důležité je začít hned u nových projektů a postupně opravit i ty staré, kde se chyby často vyskytují.

Dalším praktickým krokem je zapojit do odhadu analytika i vývojáře zároveň. Analytik by měl prezentovat, co už ví, a vývojář by měl upozornit na technické nejasnosti, které je třeba vyřešit před začátkem kódování. Pokud takové nejasnosti existují, přidejte si k analytické části čas na technický prototyp nebo krátký výzkum. Tento čas je investicí, která se vrátí tím, že se předejde přepisování kódu.

Nejprve si vytvořte testovací projekt. Ve Visual Studiu nebo v .NET CLI použijte šablonu projektu pro NUnit. Do projektu pak přidejte odkaz na testovaný projekt – to je důležité, aby testy viděly třídy a metody, které chcete ověřit. Základní struktura testu vypadá takto: třída s atributem [TestFixture] a metody s atributem [Test]. Každá metoda testuje jednu konkrétní věc. Například pokud máte třídu Calculator, test metody Add ověří, že součet dvou čísel je správný.

Častou chybou je, že se analytický odhad započítává do implementace, a tým pak má pocit, že má na kódování méně času, než ve skutečnosti potřebuje. Proto doporučuji oddělit v odhadu dvě položky: „analýza" a „implementace", a každou z nich komunikovat zvlášť. Například u středně složitého user story může být analytická část 20 % celkového času, ale u komplexního systému s integracemi to může být 60 %. Neexistuje univerzální poměr, proto vždy vycházejte z konkrétních souvislostí.

Při automatizaci se vyvarujte dvou častých chyb. První je snaha automatizovat úplně vše hned na začátku. Automatizujte jen to, co děláte opakovaně a co je chybové. Například sestavení aplikace nebo migrace databáze. Druhou chybou je zanedbání zpětné vazby. Automatizace bez logování a hlášení chyb je jako jízda se zavázanýma očima. Nastavte si jednoduché notifikace na e-mail nebo do chatu, ať víte, že něco spadlo. Až budete mít jistotu, že proces funguje, můžete přidávat další kroky.

Jak psát testy, které dávají smysl Důležité je, aby testy byly nezávislé a opakovatelné. To znamená, že každý test by měl mít vlastní data a neměl by spoléhat na pořadí, ve kterém se spouští. V NUnit k tomu slouží atributy jako [SetUp] a [TearDown], které se vykonají před a po každém testu. Příklad: v [SetUp] vytvoříte novou instanci testované třídy. Vyhnete se tak stavům, které by mohly ovlivnit výsledek. Typická chyba je používat statické proměnné, které se mění v průběhu testů – tím se testy stávají nespolehlivými.

Odhad času v agilním týmu je častou příčinou sporů, pokud se tým nesoustředí na rozložení práce mezi analytickou fázi a samotnou implementaci. Většina chyb vzniká tím, že se analýza podcení nebo naopak přecení a kódování pak nemá dostatečný prostor. Klíčové je rozdělit odhad na dvě samostatné části a každou z nich řídit podle konkrétního rizika, ne podle obecného procenta.