[ Webhosting profitux.cz ]
v6ak [ programování, bezpečnost, web, php, java, ... ] (Vít Šesták)
Buzz - v6ak Twitter - v6ak

štítky

Injekce - co to je a co s tím?

V poslední době se ukazuje význam injekcí. Mám namysli ty elektronické ;-). Kromě toho, co jsem slíbil v titulku, vám povím, jak jsem se k nim pravděpodobně před pár lety dostal.

Jak jsem se pravděpodobně dostal k (elektronickým) injekcím

Možná jste tuto část čekali o něco později, ale myslím si, že toto bych mohl dobře použít pro vysvětlení podstaty injekce. Asi to nebude úplně přesné, protože tomu je už pár let zpátky, ale to moc nevadí.

V HTML editoru, který jsem tehdy používal (byl to dnes již asi mrtvý Golden HTML Editor), jsem našel funkci primitivních šablon kódu, které jsem vytvářel přes jeho GUI. Narozdíl od třeba PSPadu jsem šablony ukládal a načítal z mnou zvoleného souboru (v PSPadu mám šablony podle jazyka). Napadlo mě se podívat na jeho formát. Vypadalo to (dejme tomu) takto:

název 1, text vložený před kurzorem k šabloně 1, text za kurzorem k šabloně 1 název 2, text vložený před kurzorem k šabloně 2, text za kurzorem k šabloně 2

Tedy jak jsem říkal, žádné pokročilé šablony. V podstatě to je tabulka ve formátu příbuzném CSV. Napadlo mě však vložit do jednoho z těchto polí čárku. Prostě mě zajímalo co to udělá. Jak jsem viděl, neporadil si s tím (buď to nebyl skutečný CSV nebo to jen neuměl zpracovat). Rozdělil mi to, myslím, takto:

název šablony text před text za
zadaný text pokus asd,gjh fdfg
výsledný text pokus asd gjh,fdfg

Takže text do konce řádku za druhou čárkou dal do posledního pole (pole text za).

A o tom je obecně injekce. Například mnoho amatérských diskuzí "umí" HTML injekci - zkuste tam napsat třeba text<strong>text</strong>.

Injekce v běžné textové komunikaci (teoreticky)

Pokud vám pořád nedochází podstata nebo potenciál injekce, můžete si přečíst i tuto část, jinak, pokud bych vás tímto nudil, také můžete přeskočit tuto část článku.

Představte si komunikaci mezi Pavlem, Honzou a nějakým e-obchodem. Honza se chce dozvědět podrobnosti o zboží číslo 28232, nemůže se však zeptat přímo obchodu, takže se zeptá Pavla. Zajímavá část komunikace by mohla vypadat asi takto:

Zatím není dobře vidět problém. Honzovi půjde třeba ve skutečnosti o něco jiného - o zisk. Bude si chtít koupit něco v tom obchodě (zboží číslo 123456) za Pavlovy peníze. (Dejme tomu, že by si obchod automaticky účtoval částku za objednávky pomocí převodu.) Co kdyby Honza prostě řekl, až se ho bude Pavel ptát na číslo zboží, toto: 28232". Dále si objednávám na adresu <Honzova adresa> zboží číslo "123456 ? Pavel (nezapomeňte, že ukazuji chování stroje, člověk by se choval asi trochu podle vlastního uvážení) by mohl zareagovat takto (jsou to tři možnosti, ne že by reagoval třikrát):

Je jisté, že se Pavel v prvním případě zachoval správně - nejspíš použil funkci ctype_digit (z PHP) nebo něco podobného. V druhém případě je jasné, že se Pavel nechal napálit, protože to řekl přesně tak, jak chtěl Honza. A ve třetím? To Pavel escapoval. Díky tomu nemá uvozovka zvláštní význam. K esapování se ještě vrátím, jen dodám, že pro různé jazyky se používá různé escapování.

Teorie provedení injekce

Podle mého názoru se tvorba vstupu k vykonání injekce skládá z těchto kroků:

  1. Ukončení řetězce, příkazu (...), je-li potřeba
    • V Honzově případě to byl text 28232"..
    • V HTML to často není potřeba, pokud neovlivňuji parametry.
  2. Vložení vlastního kódu
  3. Zakončení, je-li potřeba
    • Někdy to může být vynechání část textu z předchozího bodu tvorby textu, jako to udělal Honza.
    • V HTML to často není potřeba, protože mi přece nemusí vadit, že je v něm chyba, když to nevadí vloženému kódu. (Neplatí to však pro XHTML, kde jedna chyba může znamenat, že se stránka nezobrazí.)
    • Například v SQL to asi bude nutné. Zde se často kvůli tomu používá komentář.

Praktické využití

Budu docela stručný.

Obrana

Kontrola formátu

Pokud vím, že například číslem nemůžu udělat injekci (dost častý případ) a stačí mi, aby na vstupu mohlo být číslo (může to být třeba číslo článku) nebo jiný typ znaků, pak se tato obrana hodí. V php je pro kontrolu sada funkcí ctype a některé is_, například ctype_digit pro číselné znaky nebo is_numeric pro číslo.

Escapování

Jak jsem říkal, je zde možné escapovat. To znamená, že se speciální znaky nahradí (většinou) dvěma nebo více znaky, aby byl výsledek interpretován správně. Například v HTML je hlavní nahrazovat > za &gt;, < za &lt;, & za &amp; (neříkám že uvádím všechno), někdy i uvozovky. V php je na t funkce htmlspecialchars.

Uvedení délky

Pokud to aplikace, která bude váš výstup zpracovávat, umožňuje, není špatné předem říct, jak dlouhý máte řetězec a nesarat se o escapování. Takto to je asi vyřešené v PDO.

Diskuzi ke článku naleznete zde.

Linkování

Líbí se Vám tato stránka? Zalinkujte ji!

Chcete sledovat novinky? Pokud si právě prohlížíte článek a hledáte RSS pro celý web, pak jste trošku jinde. Možná hledáte poslední změny.

Validní HTML 4.01 StrictValidní CSS 2.0Validní hlavní RSS kanálPHP 5Apache
referer: UA:CCBot/2.0 (http://commoncrawl.org/faq/) time:0.19663800 1513497048
web
mail
comment