Vývojářský blog Tomáše Jechy

Tisk článku Tisk článku

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

[Zpět na blog]

Datum: 6. 9. 2009 10:08       Autor: Tomáš Jecha       Zobrazeno: 2103x

Kategorie: C#, Život, vesmír a vůbec


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);
}

> Na začátek

 

Hodnocení:

Hlasů: 1
Zvolte své hodnocení

Tomáš Jecha

Tomáš Jecha již několikátým rokem získal ocenění Microsoft MVP. V současné době pracuje ve společnosti AVAST jako architekt a vývojář interních systémů. Působí také jako lektor a konzultant v počítačové škole Gopas. V současné době se zajímá především o SQL Server a technologie nad .NET Frameworkem 4. Společně s Tomášem Hercegem napsal tento web a stará se o jeho administraci.

Podpořte vznik dalších článků
RSS Feed RSS Feed

Diskuse

1 

Chyba

Datum: 6.9.2009 15:27
Autor: neregistrovaný (85.119.91.122)
Hodnocení autora: není
Příspěvků: 0
Chyba nastane když parametr metody bude mít hodnotu null. Řešením je ošetřit toto podmínkou nebo vyjímkou.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 6.9.2009 17:02
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 6.9.2009 19:59
Autor: Tomáš Jecha
Hodnocení autora: 704
Příspěvků: 1287
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 6.9.2009 20:27
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 6.9.2009 20:46
Autor: Tomáš Jecha
Hodnocení autora: 704
Příspěvků: 1287
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 6.9.2009 21:46
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 30.11.2009 18:15
Autor: neregistrovaný (78.128.194.83)
Hodnocení autora: není
Příspěvků: 0
Co když se sice bude předávat List<Player>, ale uživatelův kód zavolá AddPlayers víckrát?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Chyba

Datum: 30.11.2009 19:36
Autor: Tomáš Jecha
Hodnocení autora: 704
Příspěvků: 1287
V této verzi kódu to tak je. Máte pravdu.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Jeste jedna

Datum: 14.12.2009 20:33
Autor: neregistrovaný (88.146.167.57)
Hodnocení autora: není
Příspěvků: 0
Je tu jeste jedna variace. Pri AddRange se pouziva vnitrne GetEnumerator na pridavane kolekci. Takze staci tady poupravit enumeraci a je taky hotovo.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Jeste jedna

Datum: 15.12.2009 12:48
Autor: Tomáš Jecha
Hodnocení autora: 704
Příspěvků: 1287
Skvělý postřeh!
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
1 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.