• Úplný konec je jednoduchý na 4 písmena. Zábavná fakta o sexu, která vám ještě nikdo neřekl. Nikdy se nepokoušejte opravit zadání

    17.07.2023

    Ahoj. Jmenuji se Sasha Barannik. V Mail.Ru Group řídím oddělení vývoje webu, které tvoří 15 zaměstnanců. Naučili jsme se vytvářet stránky pro desítky milionů uživatelů a snadno si poradíme s několika miliony denních publik. Sám se věnuji vývoji webu asi 20 let a posledních 15 let práce se programuje převážně v PHP. I když se schopnosti jazyka a přístup k vývoji za tuto dobu hodně změnily, pochopení hlavních zranitelností a schopnost se proti nim chránit zůstává klíčovou dovedností každého vývojáře.

    Na internetu je mnoho článků a návodů o bezpečnosti. Tato kniha se mi zdála poměrně podrobná, přesto stručná a srozumitelná. Doufám, že vám to pomůže naučit se něco nového a vaše stránky budou bezpečnější a spolehlivější.

    P.S. Kniha je dlouhá, takže překlad bude rozložen do několika článků. Takže začneme...

    Další kniha o zabezpečení PHP? Existuje mnoho způsobů, jak spustit knihu zabezpečení PHP. Bohužel jsem žádnou z nich nečetl, takže se s tím budu muset vypořádat v průběhu psaní. Snad začnu tím nejzákladnějším a doufám, že vše klapne.

    Pokud vezmeme v úvahu abstraktní webovou aplikaci spuštěnou online společností X, můžeme předpokládat, že obsahuje řadu komponent, které v případě hacknutí mohou způsobit značné škody. Co například?

  • Poškození uživatelů: Získání přístupu k e-mailu, heslům, osobním údajům, údajům o bankovních kartách, obchodním tajemstvím, seznamům kontaktů, historii transakcí a hluboce střeženým tajemstvím (jako když někdo pojmenuje svého psa Glitter). Únik těchto dat poškozuje uživatele (jednotlivce i firmy). Škodit mohou také webové aplikace, které tato data zneužívají, a stránky využívající důvěru uživatelů.
  • Poškození samotné společnosti X: Poškození uživatelů má za následek poškození dobré pověsti, kompenzaci, ztrátu důležitých obchodních informací, dodatečné náklady, jako je infrastruktura, vylepšení zabezpečení, náprava, právní náklady, velké výhody pro odcházející vrcholové manažery atd.
  • Zaměřím se na tyto dvě kategorie, protože zahrnují většinu nepříjemností, kterým má zabezpečení webových aplikací zabránit. Všechny společnosti, které se setkaly se závažným narušením bezpečnosti, rychle píší do tiskových zpráv a na webové stránky, jak z toho mají úžas. Radím vám tedy, abyste předem celým srdcem pocítili důležitost tohoto problému, než se s ním setkáte v praxi.

    Bohužel, bezpečnostní problémy se často řeší dodatečně. Předpokládá se, že nejdůležitější je vytvořit fungující aplikaci, která vyhovuje potřebám uživatelů, s přijatelným rozpočtem a časovým rámcem. Je to pochopitelný soubor priorit, ale zabezpečení nelze ignorovat navždy. Je mnohem lepší mít to neustále na paměti prováděním konkrétních rozhodnutí během vývoje, kdy jsou náklady na změnu nízké.

    Sekundární zabezpečení je z velké části výsledkem kultury programování. Některé programátory polije studený pot při pomyšlení na zranitelnost, zatímco jiní mohou existenci zranitelnosti zpochybňovat, dokud nedokážou, že se o zranitelnost vůbec nejedná. Mezi těmito dvěma extrémy je mnoho programátorů, kteří prostě pokrčí rameny, protože se ještě nemýlili. Je pro ně těžké pochopit tento podivný svět.

    Protože bezpečnostní systém webové aplikace musí chránit uživatele, kteří důvěřují službám aplikace, je nutné znát odpovědi na otázky:

  • Kdo nás chce napadnout?
  • Jak nás mohou napadnout?
  • Jak je můžeme zastavit?
  • Kdo nás chce napadnout? Odpověď na první otázku je velmi jednoduchá: všechno a všechno. Ano, celý vesmír vám chce dát lekci. Dítě s přetaktovaným počítačem s Kali Linuxem? Pravděpodobně už na tebe zaútočil. Podezřelý muž, který rád dává klacky do kol? Pravděpodobně už někoho najal, aby na vás zaútočil. Důvěryhodné REST API, přes které přijímáte data každou hodinu? Pravděpodobně byl hacknut před měsícem, aby vám poskytl infikovaná data. Dokonce i já tě můžu napadnout! Tak této knize slepě nevěřte. Považuj mě za lživého. A najít programátora, který mě přivede k čisté vodě a odhalí mé špatné rady. Na druhou stranu, možná se chystá hacknout i vás...

    Smyslem této paranoie je usnadnit mentální kategorizaci všeho, co interaguje s vaší webovou aplikací (uživatel, hacker, databáze, nedůvěryhodný vstup, manažer, REST API) a poté přiřadit každé kategorii index důvěryhodnosti. Je zřejmé, že „Hackerovi“ nelze věřit, ale co „Databáze“? „Nedůvěryhodný vstup“ dostal svůj název z nějakého důvodu, ale opravdu byste filtrovali blogový příspěvek z důvěryhodného zdroje Atom od kolegy?

    Ti, kteří to s hackováním webových aplikací myslí vážně, se naučí využívat tohoto způsobu myšlení tím, že častěji napadají ne zranitelné zdroje dat, ale důvěryhodné zdroje dat, u kterých je méně pravděpodobné, že budou mít dobrý systém ochrany. Nejde o náhodné rozhodnutí: v reálném životě vzbuzují subjekty s vyšším indexem důvěry méně podezření. Právě těmto datovým zdrojům věnuji pozornost především při analýze aplikace.

    Vraťme se k databázím. Za předpokladu, že hacker má přístup k databázi (a my paranoidi vždy předpokládáme), pak tomu nelze nikdy věřit. Většina aplikací databázím bezesporu důvěřuje. Zvenčí vypadá webová aplikace jako jedna entita, ale uvnitř je to systém samostatných komponent, které si vyměňují data. Pokud považujeme všechny tyto komponenty za důvěryhodné, pak pokud je jedna z nich hacknuta, všechny ostatní budou rychle kompromitovány. Takové katastrofické bezpečnostní problémy nelze vyřešit větou "Pokud je základna hacknuta, pak jsme stále prohráli." Můžete to tak říct, ale není vůbec pravda, že to budete muset udělat, pokud zpočátku nedůvěřujete základně a jednáte podle toho!

    Jak nás mohou napadnout? Odpověď na druhou otázku je poměrně obsáhlý seznam. Můžete být napadeni odkudkoli, že každá komponenta nebo vrstva webové aplikace získává svá data. Webové aplikace v podstatě jednoduše zpracovávají data a přesouvají je z místa na místo. Požadavky uživatelů, databáze, rozhraní API, zdroje blogů, formuláře, soubory cookie, úložiště, proměnné prostředí PHP, konfigurační soubory, konfigurační soubory, dokonce i soubory PHP, které spouštíte – to vše může být potenciálně infikováno daty narušení bezpečnosti a poškozením. Ve skutečnosti, pokud škodlivá data nejsou explicitně přítomna v kódu PHP použitém pro požadavek, pak je pravděpodobné, že přijde jako „užitečná zátěž“. To předpokládá, že a) jste napsali zdrojový kód PHP, b) byl řádně zkontrolován a c) nebyli jste zaplaceni zločineckými organizacemi.

    Pokud používáte zdroje dat, aniž byste si ověřili, že jsou data zcela bezpečná a vhodná k použití, jste potenciálně vystaveni útoku. Musíte také zkontrolovat, zda přijatá data odpovídají datům, které odesíláte. Pokud data nebudou zcela bezpečná pro výběr, budete mít také vážné problémy. To vše lze vyjádřit jako pravidlo pro PHP „Validate input; uniknout výstupu."

    To jsou zjevné zdroje dat, které musíme nějak kontrolovat. Zdroje mohou také zahrnovat úložiště na straně klienta. Většina aplikací například rozpoznává uživatele tak, že jim přiřadí jedinečné ID relace, které lze uložit do souborů cookie. Pokud útočník získá hodnotu z cookie, může se vydávat za jiného uživatele. I když můžeme zmírnit některá rizika spojená se zachycením nebo manipulací s uživatelskými daty, nemůžeme zaručit fyzické zabezpečení počítače uživatele. Nemůžeme ani zaručit, že uživatelé najdou "123456" jako nejhloupější heslo po "heslo". Kořením je skutečnost, že soubory cookie dnes nejsou jediným typem úložiště na straně uživatele.

    Další často přehlížené riziko se týká integrity vašeho zdrojového kódu. V PHP je stále populárnější vyvíjet aplikace založené na velkém počtu volně propojených knihoven, modulů a balíčků pro frameworky. Mnohé z nich jsou staženy z veřejných úložišť, jako je Github, nainstalovaných pomocí instalačních programů balíčků, jako je Composer a jeho webový společník Packagist.org. Zabezpečení zdrojového kódu tedy zcela závisí na zabezpečení všech těchto služeb a komponent třetích stran. Pokud je Github kompromitován, pak bude s největší pravděpodobností použit k distribuci kódu se škodlivým aditivem. Pokud Packagist.org - pak bude útočník moci přesměrovat požadavky na balíčky na své vlastní, škodlivé balíčky.

    V současné době jsou Composer a Packagist.org postiženy známými zranitelnostmi v detekci závislostí a distribuci balíčků, takže vždy vše ve svém produkčním prostředí zkontrolujte a zdroj všech balíčků zkontrolujte na Packagist.org.

    Jak je můžeme zastavit? Prolomit zabezpečení webové aplikace může být směšně snadné a časově náročné. Je spravedlivé předpokládat, že každá webová aplikace má někde zranitelnost. Důvod je jednoduchý: všechny aplikace vytvářejí lidé a lidé dělají chyby. Takže dokonalé zabezpečení je snem. Všechny aplikace mohou obsahovat zranitelnosti a úkolem programátorů je minimalizovat rizika.

    Budete muset pečlivě přemýšlet, abyste snížili pravděpodobnost poškození při útoku na webovou aplikaci. V průběhu příběhu budu mluvit o možných způsobech útoku. Některé z nich jsou zřejmé, jiné ne. Ale v každém případě je pro vyřešení problému nutné vzít v úvahu některé základní bezpečnostní zásady.

    Základní bezpečnostní principy Při navrhování bezpečnostních opatření lze jejich účinnost vyhodnotit pomocí následujících úvah. Některé jsem již zmínil výše.
  • Nevěřte nikomu a ničemu.
  • Vždy předpokládejte nejhorší možný scénář.
  • Použijte víceúrovňovou ochranu (Defence-in-Depth).
  • Dodržujte zásadu „čím jednodušší, tím lepší“ (Keep It Simple Stupid, KISS).
  • Dodržujte zásadu „nejméně privilegia“.
  • Útočníci zavání nejednoznačností.
  • Přečtěte si dokumentaci (RTFM), ale nikdy jí nevěřte.
  • Pokud to nebylo vyzkoušeno, tak to nefunguje.
  • Vždy je to vaše chyba!
  • Pojďme si stručně projít všechny body.1. Nevěřte nikomu a ničemu Jak již bylo zmíněno výše, správný postoj je předpokládat, že každý a vše, s čím vaše webová aplikace interaguje, ji chce hacknout. To zahrnuje další součásti aplikace nebo vrstvy, které jsou potřebné ke zpracování požadavků. Všechny a všechny. Žádné výjimky.2. Vždy předpokládejte nejhorší případ Mnoho bezpečnostních systémů má jedno společné: bez ohledu na to, jak dobře jsou vyrobeny, všechny mohou být narušeny. Pokud to vezmete v úvahu, rychle pochopíte výhodu druhého bodu. Zaměření na nejhorší možný scénář pomůže posoudit rozsah a závažnost útoku. A pokud se to stane, můžete být schopni snížit nepříjemné následky pomocí dodatečných ochran a změn v architektuře. Možná již tradiční řešení, které používáte, bylo nahrazeno něčím lepším?3. Aplikujte hloubkovou obranu Obrana do hloubky je vypůjčena z vojenské vědy, protože lidé si již dávno uvědomili, že četné stěny, pytle s pískem, vybavení, neprůstřelné vesty a baňky, které zakrývají životně důležité orgány před nepřátelskými kulkami a čepelemi, jsou tím správným přístupem. bezpečnost. Nikdy nevíte, co z výše uvedeného nebude chránit, a musíte se ujistit, že několik úrovní ochrany vám umožní spolehnout se na více než jedno polní opevnění nebo bitevní formaci. Samozřejmě nejde jen o jednotlivé neúspěchy. Představte si útočníka, který šplhá po obří středověké zdi pomocí žebříku a zjišťuje, že za ní je další zeď, odkud je zasypávají šípy. Hackeři se budou cítit stejně.4. Keep It Simple Stupid (KISS) Nejlepší obrana je vždy jednoduchá. Snadno se vyvíjejí, implementují, chápou, používají a testují. Jednoduchost snižuje chyby, podporuje správný výkon aplikací a usnadňuje implementaci i v těch nejsložitějších a nejnepříznivějších prostředích.5. Dodržovat zásadu „nejméně privilegií“ Každý účastník výměny informací (uživatel, proces, program) by měl mít pouze ta přístupová práva, která potřebuje k výkonu svých funkcí.6. Útočníci čuchají temnotou "Bezpečnost skrze temnotu" je založena na předpokladu, že pokud použijete ochranu A a nikomu neřeknete, co to je, jak funguje nebo dokonce existuje, pak vám to magicky pomáhá, protože útočníci jsou zmatení. Ve skutečnosti to dává jen malou výhodu. Často může zkušený útočník zjistit, co jste udělali, takže musíte použít i explicitní obranu. Ti, kteří jsou nepřiměřeně přesvědčeni, že vágní obrana eliminuje potřebu skutečné, by měli být speciálně potrestáni, aby se zbavili iluzí.7. Přečtěte si dokumentaci (RTFM), ale nikdy jí nevěřte PHP manuál je bible. Samozřejmě ji nenapsalo Létající špagetové monstrum, takže technicky může obsahovat řadu polopravd, opomenutí, dezinterpretací nebo dosud nepovšimnutých nebo neopravených chyb. Totéž platí pro Stack Overflow.

    Specializované zdroje informací o bezpečnosti (zaměřené na PHP a další) poskytují podrobnější znalosti obecně. Nejblíže k bezpečnostní bibli PHP je OWASP s články, návody a tipy. Pokud něco na OWASP odrazujete, nikdy to nedělejte!

    8. Pokud to nebylo otestováno, nefunguje to Při implementaci ochran musíte napsat všechny potřebné testy, abyste ověřili, že fungují. Včetně předstírání, že jste hacker, pro kterého pláče vězení. Může se to zdát přitažené za vlasy, ale znalost technik hackování webových aplikací je dobrá praxe; dozvíte se o možných zranitelnostech a vaše paranoia se zvýší. O nově nabyté vděčnosti za hacknutí webové aplikace přitom není nutné říkat vedení. Ujistěte se, že používáte automatizované nástroje k identifikaci zranitelnosti. Jsou užitečné, ale samozřejmě nenahrazují kvalitní recenze kódu a dokonce i ruční testování aplikace. Čím více prostředků vynaložíte na testování, tím spolehlivější bude vaše aplikace.9. Vždy je to vaše chyba! Programátoři jsou zvyklí věřit, že bezpečnostní slabiny budou nalezeny jako rozptýlené útoky a jejich důsledky jsou nevýznamné.

    Například úniky dat (dobře zdokumentovaný a rozšířený typ hacku) jsou často považovány za malé bezpečnostní problémy, protože přímo neovlivňují uživatele. Únik informací o verzích softwaru, vývojových jazycích, umístění zdrojového kódu, aplikační a obchodní logice, struktuře databáze a dalších aspektech prostředí webových aplikací a interních operací je však často nezbytný pro úspěšný útok.

    Útoky na bezpečnostní systémy jsou přitom často kombinacemi útoků. Jednotlivě jsou bezvýznamné, ale zároveň občas otevírají cestu dalším útokům. Například SQL injection někdy vyžaduje specifické uživatelské jméno, které lze získat pomocí Timing Attack proti administrativnímu rozhraní, namísto mnohem dražší a znatelné hrubé síly. Injekce SQL vám zase umožňuje implementovat útok XSS na konkrétní účet správce, aniž byste upozorňovali na velké množství podezřelých položek protokolu.

    Nebezpečí pohledu na zranitelná místa izolovaně spočívá v podcenění jejich ohrožení, a tedy v příliš nedbalém zacházení s nimi. Programátoři jsou často příliš líní opravit chybu zabezpečení, protože ji považují za příliš malou. Praktikuje se také přesouvání odpovědnosti za bezpečný vývoj na koncové programátory nebo uživatele, a to často bez zdokumentování konkrétních problémů: ani existence těchto zranitelností není rozpoznána.

    Zdánlivá bezvýznamnost není důležitá. Je nezodpovědné nutit programátory nebo uživatele, aby opravovali vaše zranitelnosti, zvláště pokud jste o nich ani neinformovali.

    Ověření vstupu Ověření vstupu je vnější obranný obvod vaší webové aplikace. Chrání hlavní obchodní logiku, zpracování dat a generování výstupů. V doslovném smyslu je vše mimo tento perimetr, s výjimkou kódu provedeného aktuální žádostí, považováno za nepřátelské území. Všechny možné vchody a východy z perimetru jsou dnem i nocí střeženy válčícími hlídkami, které nejprve střílí a později kladou otázky. K perimetru jsou připojeni samostatně hlídaní (a velmi podezřele vypadající) „spojenci“, včetně „Model“, „Databáze“ a „Systém souborů“. Nikdo je nechce zastřelit, ale když zkusí štěstí... prásk. Každý spojenec má svůj vlastní perimetr, který může, ale nemusí věřit tomu našemu.

    Pamatujete si moje slova o tom, komu můžete věřit? Nikdo a nic. Ve světě PHP se všude radí nedůvěřovat „uživatelskému vstupu“. To je jedna z kategorií podle míry důvěry. Za předpokladu, že uživatelům nelze věřit, myslíme si, že všemu ostatnímu lze věřit. To je špatně. Uživatelé jsou nejzjevnějším nespolehlivým zdrojem vstupů, protože je neznáme a nemůžeme je ovládat.

    Ověřovací kritéria Ověření vstupu je nejzřejmější a nejspolehlivější obrana webové aplikace. Naprostá většina zranitelností je způsobena poruchami v ověřovacím systému, proto je velmi důležité, aby tato část ochrany fungovala správně. Může selhat, ale přesto dodržujte následující úvahy. Při implementaci vlastních validátorů a používání ověřovacích knihoven třetích stran vždy mějte na paměti, že řešení třetích stran obvykle provádějí běžné úkoly a vynechávají klíčové ověřovací rutiny, které může vaše aplikace potřebovat. Při používání knihoven navržených pro potřeby zabezpečení nezapomeňte sami zkontrolovat, zda nejsou zranitelná a zda správně fungují. Také doporučuji nezapomenout, že PHP může vykazovat podivné a možná nebezpečné chování. Podívejte se na tento příklad, převzatý z funkcí filtru:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    Filtr běží bez problémů. Problém je v tom, že přijatá php:// URL může být předána funkci PHP, která očekává, že obdrží vzdálenou HTTP adresu, místo aby vrátila data ze spouštěného PHP skriptu (přes PHP handler). K této chybě zabezpečení dochází, protože možnost filtru nemá metodu, která omezuje povolené identifikátory URI. Přestože aplikace očekává odkaz http, https nebo mailto, nikoli nějaké URI specifické pro PHP. Je nutné se všemi prostředky vyhnout takovému příliš obecnému přístupu k ověřování.

    Buďte opatrní s kontextem Ověření vstupu by vám mělo zabránit v zadávání nezabezpečených dat do vaší webové aplikace. Hlavní kámen úrazu: Kontroly zabezpečení dat se obvykle provádějí pouze pro první zamýšlené použití.

    Řekněme, že jsem obdržel data obsahující jméno. Mohu v něm snadno zkontrolovat apostrofy, pomlčky, závorky, mezery a celou řadu alfanumerických znaků Unicode. Název je platný údaj, který lze použít pro zobrazení (první zamýšlené použití). Pokud to ale použijete někde jinde (například v databázovém dotazu), tak to bude v novém kontextu. A některé znaky, které jsou v názvu povoleny, budou v tomto kontextu nebezpečné: pokud je jméno převedeno na řetězec za účelem provedení SQL injection.

    Ukazuje se, že ověření vstupu je ze své podstaty nespolehlivé. Je nejúčinnější pro zkrácení jednoznačně neplatných hodnot. Řekněte, když něco potřebuje být celé číslo, alfanumerický řetězec nebo HTTP URL. Takové formáty a hodnoty mají svá omezení, a pokud jsou řádně zkontrolovány, je méně pravděpodobné, že budou představovat hrozbu. Jiné hodnoty (neomezený text, pole GET/POST a HTML) se kontrolují obtížněji a pravděpodobněji obsahují škodlivá data.

    Protože většinu času bude naše aplikace předávat data mezi kontexty, nemůžeme jen zkontrolovat všechny vstupy a považovat práci za hotovou. Přihlášení je pouze první smyčkou ochrany, ale v žádném případě ne jedinou.

    Spolu s validací vstupních dat se velmi často používá metoda ochrany, jako je escapování. S ním jsou data kontrolována z hlediska bezpečnosti při zadávání každého nového kontextu. Obvykle se tato metoda používá k ochraně proti cross-site scripting (XSS), ale je také požadována v mnoha dalších úlohách, jako nástroj pro filtrování.

    Escapování chrání před chybnou interpretací odchozích dat příjemcem. Ale to nestačí – jak data vstupují do nového kontextu, je potřeba kontrola specificky pro konkrétní kontext.

    I když to může být považováno za duplikaci počátečního ověření vstupu, dodatečné kroky ověření jsou ve skutečnosti vhodnější pro aktuální kontext, kdy jsou požadavky na data velmi odlišné. Data pocházející z formuláře mohou například obsahovat procento. Při prvním použití zkontrolujeme, že hodnota je skutečně celé číslo. Ale při předávání našemu aplikačnímu modelu mohou vyvstat nové požadavky: hodnota se musí vejít do určitého rozsahu, který je povinný pro fungování obchodní logiky aplikace. A pokud tato dodatečná kontrola nebude provedena v novém kontextu, mohou nastat vážné problémy.

    Používejte pouze bílé listiny, nikoli černé listiny Černé listiny a bílé listiny jsou dva primární přístupy k ověření vstupu. Černá znamená kontrolu neplatných dat a bílá znamená kontrolu platných dat. Upřednostňuje se zařazení na seznam povolených, protože při ověřování jsou předávána pouze data, která očekáváme. Blacklisty zase zohledňují pouze domněnky programátorů o všech možných chybných datech, takže se zde mnohem snáze splete, něco přehlédnete nebo uděláte chybu.

    Dobrým příkladem je jakýkoli ověřovací postup navržený tak, aby byl HTML bezpečný z hlediska neescapovaného výstupu v šabloně. Pokud používáme blacklist, pak musíme zkontrolovat, zda HTML neobsahuje nebezpečné prvky, atributy, styly a spustitelný JavaScript. Je to hodně práce a čističe HTML založené na černé listině vždy dokážou přehlédnout nebezpečné kombinace kódu. A nástroje pro whitelisting tuto nejednoznačnost eliminují tím, že povolují pouze známé povolené prvky a atributy. Všichni ostatní budou jednoduše odděleni, izolováni nebo odstraněni, bez ohledu na to, jací jsou.

    Whitelisting je tedy vhodnější pro jakékoli ověřovací postupy kvůli vyšší bezpečnosti a spolehlivosti.

    Nikdy se nepokoušejte opravovat vstupní data Validace vstupních dat je často doprovázena filtrováním. Pokud při kontrole jednoduše vyhodnotíme správnost údajů (s vydáním kladného nebo záporného výsledku), pak filtrování změní kontrolovaná data tak, aby splňovala konkrétní pravidla.

    To je obvykle poněkud škodlivé. Mezi tradiční filtry patří například odstranění všech znaků kromě čísel z telefonních čísel (včetně nadbytečných hranatých závorek a pomlček) nebo oříznutí zbytečné vodorovné nebo svislé mezery. V takových situacích se provádí minimální čištění, aby se eliminovaly chyby zobrazení nebo přenosu. Můžete se však nechat příliš unést používáním filtrování k blokování škodlivých dat.

    Jedním z důsledků pokusu o opravu vstupu je, že útočník může předvídat dopad vašich oprav. Řekněme, že existuje nějaká neplatná hodnota řetězce. Vyhledáte ho, smažete a dokončíte filtrování. Co když útočník vytvoří hodnotu oddělenou řetězci, aby oklamal váš filtr?

    alert(document.cookie);
    V tomto příkladu jednoduché filtrování podle značky nic neudělá: odstranění explicitní značky způsobí, že data budou považována za plně platný prvek skriptu HTML. Totéž lze říci o filtrování podle jakýchkoli konkrétních formátů. To vše jasně ukazuje, proč není možné udělat z validace vstupních dat poslední ochrannou smyčku aplikace.

    Místo pokusu o opravu vstupů stačí použít validátor na seznamu povolených a takové pokusy o vstup úplně odmítnout. A tam, kde potřebujete filtrovat, vždy filtrujte před provedením kontroly, nikdy poté.

    Nikdy nedůvěřujte externím validátorům a neustále sledujte zranitelnosti Již dříve jsem si všiml, že validace je vyžadována pokaždé, když jsou data přenesena do nového kontextu. To platí i pro validaci prováděnou mimo samotnou webovou aplikaci. Tyto ovládací prvky zahrnují ověření nebo jiná omezení aplikovaná na formuláře HTML v prohlížeči. Podívejte se na tento formulář z HTML 5 (vynechané značky):

    Rep. Irsko Spojené království
    HTML formuláře jsou schopny zavést omezení na vstupní data. Výběr můžete omezit seznamem pevných položek, nastavit minimální a maximální hodnoty a omezit délku textu. Možnosti HTML 5 jsou ještě širší. Prohlížeče mohou kontrolovat URL a e-mailové adresy, kontrolovat data, čísla a rozsahy (ačkoli podpora pro poslední dva je spíše libovolná). Prohlížeče jsou také schopny ověřit vstup pomocí regulárních výrazů JavaScript zahrnutých v atributu šablony.

    Při vší té hojnosti ovládacích prvků nesmíme zapomínat, že jejich účelem je zlepšit použitelnost vaší aplikace. Jakýkoli útočník je schopen vytvořit formulář, který neobsahuje omezení z vašeho původního formuláře. Můžete si dokonce vytvořit HTTP klienta pro automatické vyplňování formulářů!

    Dalším příkladem externích validátorů je získávání dat z API třetích stran, jako je Twitter. Tato sociální síť má dobrou pověst a je obvykle důvěryhodná. Ale protože jsme paranoidní, nevěřte ani Twitteru. V případě kompromitace budou její odpovědi obsahovat nezabezpečená data, na která nebudeme připraveni. Proto i zde uplatněte vlastní kontrolu, abyste v případě něčeho nebyli bezbranní.

    Tam, kde důvěřujeme externím prostředkům ověření, je vhodné sledovat zranitelnosti. Pokud například HTML formulář nastaví limit na maximální délku a my obdržíme vstupní data, jejichž velikost dosáhla limitu, pak je logické předpokládat, že se tento uživatel pokouší obejít ověření. Můžeme tak registrovat mezery v externích nástrojích a dále zakročit proti případným útokům omezením přístupu nebo počtu požadavků.

    Vyhněte se převodu typů v PHP PHP není silně typovaný jazyk a většina jeho funkcí a operací je typově bezpečná. To může vést k vážným problémům. Navíc to nejsou hodnoty samotné, které jsou zvláště zranitelné, ale validátoři. Například:

    Assert(0 == "0ABC"); //vrátí TRUE claim(0 == "ABC"); //vrátí TRUE (i bez úvodní číslice!) Claim(0 === "0ABC"); //vrací NULL/Upozorňuje, že aserci nelze zkontrolovat
    Při navrhování validátorů se ujistěte, že používáte přísné porovnání a ruční převod typu, když vstupní nebo výstupní hodnoty mohou být řetězce. Formuláře mohou například vracet řetězec, takže pokud pracujete s daty, která musí být celé číslo, nezapomeňte zkontrolovat jejich typ:

    Funkce checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // obsahuje nečíslicové znaky ) if (!is_int((int) $int )) ( return false; // jiná neceločíselná hodnota nebo větší než PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $kontext);
    UPD. V PHP 5.6+ je volba ssl.verify_peer standardně nastavena na TRUE.

    Rozšíření cURL zahrnuje ověření serveru ihned po vybalení, takže nemusíte nic konfigurovat. Programátoři však někdy k zabezpečení svých knihoven a aplikací přistupují bezmyšlenkovitě. Tento přístup lze nalézt ve všech knihovnách, na kterých bude vaše aplikace záviset.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, nepravda);
    Zakázání ověřování serveru v kontextu SSL nebo při použití curl_setopt() bude mít za následek zranitelnost vůči útokům typu man-in-the-middle. Vypíná se však právě proto, aby se vyřešil problém s nepříjemnými chybami, které indikují útok nebo pokusy aplikace kontaktovat hostitele, jehož certifikát SSL je nesprávně nakonfigurován nebo vypršela platnost.

    Webové aplikace mohou často fungovat jako proxy pro uživatelské akce, jako je například klient Twitter. A to nejmenší, co můžeme udělat, je udržovat naše aplikace v souladu s vysokými standardy stanovenými prohlížeči, které varují uživatele a snaží se je chránit před připojením k podezřelým serverům.

    Závěry Často máme dobré předpoklady pro vytvoření bezpečné aplikace. Ale my sami obcházíme některá rozumná omezení, abychom usnadnili vývoj, ladění a deaktivovali výstup nepříjemných chyb. Nebo se z dobrého úmyslu snažíme zbytečně zkomplikovat logiku aplikace.

    Ale ani hackeři nejedí svůj chleba nadarmo. Hledají nové způsoby, jak obejít naši nedokonalou obranu a studovat zranitelná místa v modulech a knihovnách, které používáme. A pokud je naším úkolem vytvořit bezpečnou webovou aplikaci, pak jejich úkolem je kompromitovat naše služby a data. Nakonec všichni pracujeme na vylepšení našich produktů.

    Potřebujete určit nejvhodnější dobu pro početí, zabránit nechtěnému těhotenství nebo vědět, kdy je nejlepší čas na sex s partnerem? Dříve kvůli tomu musely ženy chodit na konzultaci se svým lékařem, ale nyní mají nového nejlepšího přítele - smartphone.

    V posledních letech se objevilo mnoho aplikací pro ženy, které umožňují snadno sledovat plodné dny a dobu ovulace a také si dělat osobní poznámky. Kromě toho mají mnoho dalších funkcí. Jednou z takových aplikací je Glow, kterou používá již 47 milionů žen. Glow vám umožňuje sledovat věci, jako je nálada žen a kvalita a frekvence sexu. Díky této aplikaci bylo možné získat tato zajímavá fakta o intimním životě žen z celého světa.

    Nejlepší země pro ženy

    1. Chybí vám intimita? Jeďte do Kanady. Ukázalo se, že Kanaďané mají sex o 45 % častěji než průměrní uživatelé aplikace.

    2. Ale pozor: Kanada je skvělé místo pro otěhotnění. Kanaďanky mohou otěhotnět o 21 % snadněji než ostatní.

    3. Australské ženy mají také častý sex – o 37 % více než průměrní uživatelé aplikace.

    4. Netřeba dodávat, že ženy v Austrálii mají také velkou šanci otěhotnět? Jsou o 14 % vyšší než ostatní uživatelé.

    5. USA je dobré místo ke štěstí. Američanky mají o 16 % vyšší pravděpodobnost sexu než jiné ženy.

    6. Nejhorší místo pro radost? Latinská Amerika. Ženy zde mají sex o 4 % méně často než průměrní uživatelé aplikace.

    sexuální choutky

    1. Sexuální apetit ženy odpovídá jejímu měsíčnímu cyklu. První den cyklu je považován za první den menstruace, která trvá přibližně pět dní. Ženy tak mají nejmenší zájem o sex mezi jedním až pěti dny v měsíci.

    2. Mnoho žen hlásí během této doby změnu energetické hladiny nebo nálady, což je obvykle spojeno s poklesem chuti na sex. Také ženy mají menší zájem o sex celý týden po menstruaci.

    3. Většina žen začne znovu se sexem 12. den cyklu.

    4. Mnoho žen má pravidelný sexuální vztah od 12. do 14. dne cyklu. Aplikace Glow nazývá tyto dny „vrcholem sexuality“.

    5. Ve skutečnosti se ženy cítí nejvíce sexuálně 13. a 14. den cyklu. Ale tady je to zajímavé: nemusí mít nutně ten nejlepší a nejuspokojivější sex v tuto dobu.

    6. Nejvíce ze všeho si ženy užívají sexu poslední, 30. den cyklu. Tento den v záři je označen jako „vrcholný orgasmus“.

    Jsou ženy spokojené?

    1. Ženy se cítí nejšťastnější 15. a 16. den svého cyklu a také tehdy, když v předchozích dnech měly hodně sexu.

    2. Uživatelé Glow zaznamenali za dva roky 7,6 milionu sexuálních kontaktů.

    3. To znamená, že každou minutu má alespoň sedm žen, které používají aplikaci Glow, sex.

    4. Mimochodem, uživatelé také hlásili, že jsou zamilovaní 2 milionykrát. Aplikace také sleduje sexuální cykly a plodnost 88 000 párů.

    5. Navzdory existujícím sexuálním kontaktům bohužel ne všechny ženy jsou s nimi spokojeny. Téměř třetina žen je připravena vzdát se sexu raději než chytrého telefonu.

    6. Stále to ale znamená, že dvě třetiny se raději vzdají telefonů než sexu.

    Podobné články