Christianpedia

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

[unchecked revision][unchecked revision]
(Created page with "Praktické kroky: od záměru k licenci Začněte tím, že si sepíšete, jaké použití chcete povolit a jaké zakázat. Například pokud vyvíjíte serverovou aplikaci, zvažte AGPL, která pokrývá i síťové nasazení. U knihoven, které mají sloužit jako stavební bloky v jiných projektech, je vhodnější LGPL – ta umožňuje dynamické linkování bez povinnosti šířit celý projekt. Pro malé nástroje a skripty postačí permisivní licence, která e...")
 
No edit summary
 
Line 1: Line 1:
Praktické kroky: od záměru k licenci Začněte tím, že si sepíšete, jaké použití chcete povolit a jaké zakázat. Například pokud vyvíjíte serverovou aplikaci, zvažte AGPL, která pokrývá i síťové nasazení. U knihoven, které mají sloužit jako stavební bloky v jiných projektech, je vhodnější LGPL – ta umožňuje dynamické linkování bez povinnosti šířit celý projekt. Pro malé nástroje a skripty postačí permisivní licence, která eliminuje právní tahanice. Vždy si přečtěte plné znění licence, ne jen shrnutí. Pozor na to, že některé licence nejsou kompatibilní – sloučení kódu pod GPL a Apache může být problematické.<br><br>Dalším krokem je správné označení projektu. Do kořenového adresáře uložte soubor s textem licence (např. LICENSE, COPYING) a do každého zdrojového souboru přidejte hlavičku s copyrightem a odkazem na licenci. To není jen formalita: bez toho nemáte důkaz, že jste autorem, a uživatelé nemusí vědět, za jakých podmínek kód používají. Pokud používáte cizí kód, ověřte, že jeho licence je kompatibilní s vaší. Typická chyba je převzít kód z internetu bez kontroly a pak zjistit, že ho nemůžete šířit pod svou licencí.<br><br>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.<br><br>Nakonec si rozmyslete, jak chcete projekt rozvíjet. Pokud očekáváte příspěvky od komunity, zvolte licenci, kterou znají a které důvěřují (např. MIT nebo GPL). Pokud chcete mít možnost později změnit licenci, vyžaduje to souhlas všech přispěvatelů – proto je dobré si od začátku vyžádat podepsání contributor agreement. Nebo se tomu vyhnete tím, že si vyberete licenci, u níž víte, že ji nebudete chtít měnit. Dobře zvážené rozhodnutí na začátku vám ušetří spoustu nepříjemností ve chvíli, kdy projekt začne být používán ve větším měřítku.<br><br>Refaktorování kódu patří mezi činnosti, které mnozí vývojáři odkládají, protože se obávají zdlouhavých ručních úprav. Moderní vývojová prostředí však nabízejí sadu nástrojů, které dokážou běžné operace urychlit natolik, že se z refaktorování stane rutinní záležitost. Nemusíte instalovat žádné doplňky stačí využít to, co už ve svém IDE máte.<br><br>Prvním krokem je vždy použití parametrizovaných dotazů, ať už pracujete s jakýmkoliv jazykem či frameworkem. Místo skládání řetězce, kde uživatelský vstup přímo vkládáte do SQL příkazu, předáte dotaz jako šablonu s placeholdery a hodnoty dodáte zvlášť. Databázový ovladač se pak postará o jejich bezpečné zakódování. Tento přístup funguje v PHP s PDO, v Pythonu s psycopg2, v Javě s PreparedStatement a podobně. Pokud používáte ORM, mějte na paměti, že i tam lze napsat nebezpečný „raw" dotaz – vždy preferujte vestavěné metody.<br><br>Při výběru berte v potaz velikost týmu a čas na vývoj. GraphQL se nevyplácí u malých projektů s úzkou doménou, kde by bylo schéma zbytečně složité. REST je tu rychlejší a přehlednější. Naopak pokud víte, že budete API rozšiřovat a klienti si budou žádat stále nové kombinace dat, GraphQL vám ušetří nekonečné přidávání endpointů. Typický kompromis: použijte REST pro veřejné API a GraphQL pro interní služby. Tím získáte to nejlepší z obou světů.<br><br>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í.<br><br>Než začnete šířit svůj kód, zastavte se u výběru licence. Není to formalita, ale právní rámec, který určí, co s vaším dílem smí ostatní dělat. Špatná volba může odradit potenciální přispěvatele, nebo naopak umožnit komerční zneužití, které jste nezamýšleli. Základní otázka zní: Chcete, aby vaše knihovna zůstala vždy otevřená, nebo vám nevadí, že ji někdo začlení do uzavřeného produktu?<br><br>Na závěr si shrňte, že správné verzování není o počtu verzí, ale o jasných pravidlech a automatech. Nastavte si jednoduchý workflow, který každý člen týmu pochopí: změna v knihovně vede k zvýšení verze, aktualizaci manifestu a záznamu do changelogu. Vše kontrolujte v CI. Tím se vyhnete nejistotě, která verze je aktuální, a projekt zůstane stabilní i při mnoha knihovnách. Vyhněte se improvisaci a spoléhání na paměť – jediným zdrojem pravdy je verzovací soubor, který musí být vždy aktuální.
Kromě testů využijte i nástroj pro automatizaci – kolekce runner. Spustíte celou kolekci najednou a sledujete výsledky. To se hodí při regresním testování po změně API. Runner umožňuje nastavit počet opakování a zpoždění mezi požadavky. Nezapomeňte na proměnné – pokud testujete sekvenci požadavků, kde jeden závisí na odpovědi předchozího, použijte skripty v sekci Tests pro uložení hodnoty do proměnné. Příklad: pm.environment.set("token", pm.response.json().token).<br><br>Při testování na reálných zařízeních se zaměřte na spotřebu baterie a přehřívání. To jsou aspekty, které automatizované testy na emulátoru neodhalí. Mějte po ruce několik fyzických zařízení, a to jak s operačním systémem od jednoho výrobce, tak i od jiného, protože každý systém má svá specifika. Pro uživatelské testování oslovte lidi, kteří aplikaci neznají, a sledujte, jak ji používají. Často zjistíte, že to, co je pro vás intuitivní, uživatelé dělají úplně jinak.<br><br>Časté chyby a jak je odstranit Jednou z typických chyb je dynamické sestavování dotazů pomocí řetězců, zejména když potřebujete řadit podle sloupce zvoleného uživatelem. Pokud uživatel může ovlivnit název sloupce nebo směr řazení, parametrizace nepomůže. V takovém případě vždy použijte seznam povolených hodnot, který ověří, že zadaný řetězec odpovídá skutečnému názvu sloupce. Druhou častou chybou je zapomínání na vstupy vstupující do LIKE, IN nebo ORDER BY klauzulí. I zde platí, že místo přímého vkládání vstupu použijte placeholder a pro dynamické části aplikujte whitelist.<br><br>Začněte tím, že si pečlivě naplánujete testovací scénáře. Nezapomeňte na okrajové případy, jako je přerušení připojení, příchod notifikace nebo volání během používání aplikace. Typickou chybou je testovat pouze na nejnovějším zařízení s nejnovější verzí systému. V praxi se ale většina uživatelů pohybuje na starších modelech, a proto je důležité mít k dispozici zařízení s různými verzemi operačního systému, nebo využít cloudové služby pro testování na vzdálených zařízeních.<br><br>NoSQL není jeden nástroj, ale rodina databází, které se liší datovým modelem. Existují dokumentové (JSON), sloupcové, klíč-hodnota a grafové. Každý typ řeší jiné problémy. Dokumentové databáze se hodí pro obsahově heterogenní záznamy, které byste v SQL řetězili přes deset JOINů. Sloupcové jsou vhodné pro analytiku nad obrovskými tabulkami, kde čtete jen vybrané sloupce. Klíč-hodnota je extrémně rychlá pro jednoduché operace, a grafové databáze zase skvěle modelují vztahy typicky sociální sítě, doporučovací systémy nebo řízení práv.<br><br>Častým omylem je domněnka, že NoSQL je automaticky rychlejší. Rychlost závisí na případu použití a na tom, jak dobře je datový model navržený. Vezměte si příklad streamování událostí – logy, telemetrie. Sloupcová databáze je pro zápis mnohem rychlejší než klasická SQL, ale pokud potřebujete dotazovat se podle vztahů mezi entitami, budete psát složité agregační operace, které v SQL zvládnete jedním JOINem. Také si dejte pozor na to, jak NoSQL řeší rozšiřování. Většina z nich podporuje horizontální škálování – přidávání dalších uzlů – ale to s sebou nese problémy s distribucí dat, např. rozdělení na shardy. Bez promyšlené distribuční strategie vám může docházet k tomu, že dotaz musí prohledat všechny uzly, což je pomalé a nákladné.<br><br>Mezi nejčastější chyby patří zapomenutí na hlavičky, nesprávný formát těla požadavku nebo neuvědomění si rozdílu mezi GET a POST. U POST vždy nastavte hlavičku Content-Type na application/json a tělo zadejte v surovém formátu. Dále pozor na citlivé údaje – nikdy neukládejte hesla do proměnných, které sdílíte s týmem. Pro citlivá data použijte proměnné s hodnotami, které se nenačítají ze souboru. Postman je mocný nástroj, ale vyžaduje disciplínu. Pokud se naučíte strukturovat kolekce, používat proměnné a psát smysluplné testy, ušetříte si spoustu času a předejdete chybám v produkci.<br><br>Proměnné a prostředí klíč k efektivnímu testování Pevně zadané adresy a hodnoty brzy znepřehlední práci. Proto používejte proměnné. V Postmanu je definujete buď globálně, nebo v rámci prostředí. Prostředí představuje sadu proměnných pro konkrétní prostředí – testovací, produkční. Adresu pak zapíšete jako baseUrl a hodnotu přiřadíte v nastavení. Stejně postupujte u přihlašovacích tokenů, které se mění při každém běhu testu.<br><br>Scrum není o tom, že budete dělat víc věcí za kratší dobu. Je o tom, že budete dělat ty správné věci a budete mít zpětnou vazbu dřív. Pro české týmy je klíčové, aby si ujasnily role, definici hotového a hlavně aby se nebály říct managementu, že něco nestihnou. Začněte malým pilotním projektem, ne celou organizací. Až uvidíte první výsledky, rozšiřte působnost. Jinak skončíte s byrokratickým monstrem, které nemá s agilitou nic společného.

Latest revision as of 21:23, 21 August 2026

Kromě testů využijte i nástroj pro automatizaci – kolekce runner. Spustíte celou kolekci najednou a sledujete výsledky. To se hodí při regresním testování po změně API. Runner umožňuje nastavit počet opakování a zpoždění mezi požadavky. Nezapomeňte na proměnné – pokud testujete sekvenci požadavků, kde jeden závisí na odpovědi předchozího, použijte skripty v sekci Tests pro uložení hodnoty do proměnné. Příklad: pm.environment.set("token", pm.response.json().token).

Při testování na reálných zařízeních se zaměřte na spotřebu baterie a přehřívání. To jsou aspekty, které automatizované testy na emulátoru neodhalí. Mějte po ruce několik fyzických zařízení, a to jak s operačním systémem od jednoho výrobce, tak i od jiného, protože každý systém má svá specifika. Pro uživatelské testování oslovte lidi, kteří aplikaci neznají, a sledujte, jak ji používají. Často zjistíte, že to, co je pro vás intuitivní, uživatelé dělají úplně jinak.

Časté chyby a jak je odstranit Jednou z typických chyb je dynamické sestavování dotazů pomocí řetězců, zejména když potřebujete řadit podle sloupce zvoleného uživatelem. Pokud uživatel může ovlivnit název sloupce nebo směr řazení, parametrizace nepomůže. V takovém případě vždy použijte seznam povolených hodnot, který ověří, že zadaný řetězec odpovídá skutečnému názvu sloupce. Druhou častou chybou je zapomínání na vstupy vstupující do LIKE, IN nebo ORDER BY klauzulí. I zde platí, že místo přímého vkládání vstupu použijte placeholder a pro dynamické části aplikujte whitelist.

Začněte tím, že si pečlivě naplánujete testovací scénáře. Nezapomeňte na okrajové případy, jako je přerušení připojení, příchod notifikace nebo volání během používání aplikace. Typickou chybou je testovat pouze na nejnovějším zařízení s nejnovější verzí systému. V praxi se ale většina uživatelů pohybuje na starších modelech, a proto je důležité mít k dispozici zařízení s různými verzemi operačního systému, nebo využít cloudové služby pro testování na vzdálených zařízeních.

NoSQL není jeden nástroj, ale rodina databází, které se liší datovým modelem. Existují dokumentové (JSON), sloupcové, klíč-hodnota a grafové. Každý typ řeší jiné problémy. Dokumentové databáze se hodí pro obsahově heterogenní záznamy, které byste v SQL řetězili přes deset JOINů. Sloupcové jsou vhodné pro analytiku nad obrovskými tabulkami, kde čtete jen vybrané sloupce. Klíč-hodnota je extrémně rychlá pro jednoduché operace, a grafové databáze zase skvěle modelují vztahy – typicky sociální sítě, doporučovací systémy nebo řízení práv.

Častým omylem je domněnka, že NoSQL je automaticky rychlejší. Rychlost závisí na případu použití a na tom, jak dobře je datový model navržený. Vezměte si příklad streamování událostí – logy, telemetrie. Sloupcová databáze je pro zápis mnohem rychlejší než klasická SQL, ale pokud potřebujete dotazovat se podle vztahů mezi entitami, budete psát složité agregační operace, které v SQL zvládnete jedním JOINem. Také si dejte pozor na to, jak NoSQL řeší rozšiřování. Většina z nich podporuje horizontální škálování – přidávání dalších uzlů – ale to s sebou nese problémy s distribucí dat, např. rozdělení na shardy. Bez promyšlené distribuční strategie vám může docházet k tomu, že dotaz musí prohledat všechny uzly, což je pomalé a nákladné.

Mezi nejčastější chyby patří zapomenutí na hlavičky, nesprávný formát těla požadavku nebo neuvědomění si rozdílu mezi GET a POST. U POST vždy nastavte hlavičku Content-Type na application/json a tělo zadejte v surovém formátu. Dále pozor na citlivé údaje – nikdy neukládejte hesla do proměnných, které sdílíte s týmem. Pro citlivá data použijte proměnné s hodnotami, které se nenačítají ze souboru. Postman je mocný nástroj, ale vyžaduje disciplínu. Pokud se naučíte strukturovat kolekce, používat proměnné a psát smysluplné testy, ušetříte si spoustu času a předejdete chybám v produkci.

Proměnné a prostředí – klíč k efektivnímu testování Pevně zadané adresy a hodnoty brzy znepřehlední práci. Proto používejte proměnné. V Postmanu je definujete buď globálně, nebo v rámci prostředí. Prostředí představuje sadu proměnných pro konkrétní prostředí – testovací, produkční. Adresu pak zapíšete jako baseUrl a hodnotu přiřadíte v nastavení. Stejně postupujte u přihlašovacích tokenů, které se mění při každém běhu testu.

Scrum není o tom, že budete dělat víc věcí za kratší dobu. Je o tom, že budete dělat ty správné věci a budete mít zpětnou vazbu dřív. Pro české týmy je klíčové, aby si ujasnily role, definici hotového a hlavně aby se nebály říct managementu, že něco nestihnou. Začněte malým pilotním projektem, ne celou organizací. Až uvidíte první výsledky, rozšiřte působnost. Jinak skončíte s byrokratickým monstrem, které nemá s agilitou nic společného.

Discuss this page