Jump to content

5 způsobů, jak zkrotit práci s více jazyky v jednom projektu

From Babylon SIGNALIS Wiki

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á.

Nakonec se zaměřte na bezpečnost. Ověřování tokenů, nastavení CORS a limitování počtu požadavků by nemělo být dovětek, ale základ. Pro produkční nasazení vždy použijte HTTPS, nastavte bezpečnostní hlavičky a ošetřete, aby se k chybovým hláškám nedostaly interní informace. Takové API pak zvládne reálný provoz bez zbytečných průšvihů.

Psaní commit zpráv patří mezi činnosti, které většina vývojářů odbývá. Přitom právě tyto krátké texty tvoří chronologický záznam o vývoji projektu. Když do nich po půl roce nahlédnete, měly by vám okamžitě odpovědět na tři otázky: co se změnilo, proč se to změnilo a jaké to má důsledky. Bez těchto informací se i dokonalý kód stává nesrozumitelnou hromadou znaků.

Útok typu SQL injection patří mezi nejstarší, ale stále nejrozšířenější metody napadení webových aplikací. Princip je jednoduchý: útočník vloží do vstupního pole, URL parametru nebo hlavičky databázový dotaz, který aplikace neopatrně spojí s tím legitimním. Místo aby server zpracoval jen zamýšlený příkaz, spustí i ten podvržený – a tím může číst, měnit nebo mazat data. Nejhorší scénáře vedou k úplnému převzetí serveru. Přitom obrana není nijak složitá, pokud víte, na co se zaměřit.

Základní princip obrany je jednoduchý – nikdy neskládat SQL dotaz pomocí řetězcové konkatenace. Místo toho používejte parametrizované dotazy, ať už přes PDO, MySQLi, nebo ekvivalentní API ve vašem jazyce. Místo zápisu SELECT * FROM uzivatele WHERE jmeno = '$jmeno' použijte prepared statement, kde se hodnota předává zvlášť. Tím se SQL příkaz oddělí od dat a útočník nemá šanci vložit vlastní kód. Toto pravidlo platí pro úložné prostory v malém bytěšechny databázové operace – nejen pro SELECT, ale i pro INSERT, UPDATE a DELETE. Pokud framework nabízí query builder, použijte ho, ale vždy ověřte, že hodnoty procházejí přes binding, ne přes přímý zápis do SQL řetězce.

Další častou chybou je míchání více nesouvisejících změn do jednoho commitu. Například když opravíte překlep v dokumentaci a zároveň změníte logiku výpočtu ceny. Takový commit se špatně čte, špatně vrací zpět a komplikuje hledání chyb. Ideální commit mění jednu věc. Pokud potřebujete udělat dvě nesouvisející úpravy, rozdělte je do dvou commitů. I kdybyste měli poslat oba najednou, historie zůstane čistá.

Správným řešením je použití parametrizovaných dotazů, tedy prepared statements. V praxi to znamená, že SQL dotaz napíšete s placeholdery a hodnoty předáte zvlášť. Databázová vrstva je pak vždy interpretuje jako data, nikdy jako kód. Tento přístup funguje napříč jazyky a frameworky, a to jak databází, tak u objektově-relačních mapování. Druhou vrstvou ochrany je vždy validace vstupu na úrovni aplikace. Pro číselné hodnoty ověřte, že jsou opravdu čísla, pro textové hodnoty omezte délku a povolené znaky. Validace ale nikdy nenahradí parametrizaci – slouží jen jako doplněk.

End-to-end testy by měly být jen špičkou pyramidy — obvykle 5–10 % všech testů. Testují kritické uživatelské cesty, jako je registrace, přihlášení, vytvoření objednávky apod. Spouští se v reálném prohlížeči nebo přes API, takže jejich běh trvá minuty až desítky minut. Proto je důležité, aby se nespouštěly při každé změně kódu, ale až po úspěšném průchodu nižších vrstev. To lze rekonstrukce koupelny krok za krokemřídit pomocí fází v CI: po commitu běží jen jednotkové a rychlé integrační testy, end-to-end se spouští jednou denně nebo před vydáním. Pokud byste je spouštěli po každém commitu, vývoj se zpomalí a lidé je začnou ignorovat.

Když stavíte REST API v Node.js s frameworkem Express, rychle narazíte na to, že samotné definování tras nestačí. Klíčové je nastavit si strukturu projektu tak, aby se v něm dalo dlouhodobě pracovat. Místo psaní veškeré logiky do jednoho souboru oddělte routery od kontrolerů a služeb. Každá vrstva pak má jasnou odpovědnost: router mapuje URL, kontroler ověřuje vstupy a služba komunikuje s databází. Tím se vyhnete situaci, kdy po třech měsících vývoje přestanete rozumět vlastnímu kódu.

Nakonec si osvojte zvyk psát zprávy s ohledem na budoucího čtenáře. Představte si, že za rok budete sami procházet historii a snažit se zjistit, proč se určitá funkce chová tak, jak se chová. Commit zprávy, které to umožní, nejsou zbytečná byrokracie, ale investice do budoucí efektivity. Dobré zprávy navíc usnadňují práci i kolegům, kteří na projektu pracují s vámi nebo po vás.