Najdete v kódu bezpečnostní díru?

Tomáš Jecha, MVP, MCSD       06.09.2009       C#, Offtopic       11453 zobrazení

Zrovna dopisuji "hodnotící" systém pro .NET Challange 2010. Sám jsem si našel moc roztomilou bezpečnostní díru v následujícím kódu. Tuto metodu volá kód třetí strany (soutěžícího) a má za úkol zaregistrovat do hry nové soutěžní hráče. Kde je ale chyba a jak ji nejjednušeji vyřešit?
		
public void AddPlayers(IList<Player> players)
{
	if (players.Count != definedPlayersCount)
	{
		throw new InvalidOperationException("Nesprávný počet hráčů!");
	}

	this.players.AddRange(players);
}

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: Najdete v kódu bezpečnostní dirku?

Je tu jeste jedna variace. Pri AddRange se pouziva vnitrne GetEnumerator na pridavane kolekci. Takze staci tady poupravit enumeraci a je taky hotovo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Skvělý postřeh!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Najdete v kódu bezpečnostní dirku?

Chyba nastane když parametr metody bude mít hodnotu null. Řešením je ošetřit toto podmínkou nebo vyjímkou.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Také bych řekl, ale rozhodně to není bezpečnostní díra. Bezpečnostní díra by to mohla být leda v případě, že by se v implementaci vlastnosti Count nacházel nějaký zlobivý kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta kontrola null hodnoty tam byla (stejně jako několik podobných dalších), ale pro přehlednost jsem ji dal pryč. Jak ale říkáte bezpečnostní díra to není.

Pravdu máte také s tím Count. Pokud totiž kontroluji počet hráčů přes Count (což může být implementováno libovolným způsobem), tak ta kontrola vlastně pozbývá smyslu. Zlobivec mi může říct, že mi předává například správný počet hráčů a přitom jich bude v seznamu například 2x tolik.

Obecným řešením bude změnit typ předaného parametru z IList<Player> na List<Player>. Tam totiž nemůže přepsat tuto vlastnost.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A co když někdo vytvoří třídu odvozenou od List<Player> a pomocí shadowingu přepíše funkčnost vlastnosti Count? Potom pomůže už jen kontrola typu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To si nepomůže. Count u List<T> není virtual, takže ji neřepíšete. A shadowing funguje, jen pokud pracuji s datovým typem, který jej používá. Pokud pracuji s původním List<Player>, tak se budu vždy odkazovat na původní Count i když je v pravém (odvozeném) typu použit přes tuto vlastnost shadowing. To je přeci základní rozdíl mezi použitím klíčového slova new a override.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pravda, teď jsem to zkoušel. Nějak mi nedošlo že shadowing nebude fungovat pokud se bude pracovat s nadřazeným datovým typem. Nicméně jinak s konkrétním typem to samozřejmě funguje a je to jediná možnost jak obejít pokud není člen třídy Overridable.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co když se sice bude předávat List<Player>, ale uživatelův kód zavolá AddPlayers víckrát?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V této verzi kódu to tak je. Máte pravdu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback