fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Łamiemy prywatność, czyli załóżmy Jarkowi konto!


11.03.2008

Czasami zdarza się, że jesteśmy świadomi istnienia jakiejś funkcjonalności, jednak wredny twórca biblioteki bezwstydnie ją przed nami ukrył. A my ją odkryliśmy na przykład przy pomocy Reflectora.
Zasymulujmy taką sytuację. Wyobraźmy sobie bibliotekę z klasą Jarek oznaczoną jako internal. Klasa Jarek z kolei chowa przed nami bardzo ciekawą funkcjonalność – zakładanie konta w banku za pośrednictwem nieistotnej dla nas klasy Bank:

 1:   namespace JarekLibrary
2: {
3: internal class Jarek
4: {
5: private void CreateBankAccount()
6: {
7: Console.WriteLine(“<płacze_i_krzyczy>”);
8: Bank.CreateAccount(this);
9: Console.WriteLine(“<lecz_zalozyl>”);
10: }
11: }
12: }

My, podli użytkownicy, bardzo chcemy zmusić Jarka do założenia konta. Umożliwia nam to mechanizm refleksji. Poniższy kod pozostawiam bez komentarza – jest to działająca metoda a po szczegóły odsyłam MSDN, żeby bezsensownie nie przepisywać tutaj dokumentacji:

 1:   static void Main(string[] args)
2: {
3: Assembly jarekLibrary = Assembly.LoadFrom(“JarekLibrary.dll”);
4: Type jarekType = jarekLibrary.GetType(“JarekLibrary.Jarek”);
5: object jarekInstance = Activator.CreateInstance(jarekType);
6: MethodInfo createAccountMethod = jarekType.GetMethod(“CreateBankAccount”, BindingFlags.NonPublic | BindingFlags.Instance);
7: createAccountMethod.Invoke(jarekInstance, null);
8: }

W efekcie zobaczymy na konsoli słodki tekst informujący o sukcesie.


P.S. Wszekie skojarzenia z faktycznym stanem rzeczywistości oczywiście niezamierzone – równie dobrze można było nazwać klasę Bonifacy, ale nie wyglądałoby to tak ślicznie.

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Zapisując się na newsletter zgadzasz się na przetwarzanie Twoich danych osobowych w celu wysyłania na wskazany przez Ciebie adres e-mail informacji handlowych o nowościach, promocjach, produktach i usługach związanych z serwisem devstyle.pl. Będzie to marketing bezpośredni, do realizacji którego wykorzystam Twoje telekomunikacyjne urządzenia końcowe. Administratorem Twoich danych osobowych będzie Maciej Aniserowicz prowadzący działalność gospodarczą w Białymstoku (15-215) przy ul. Konopnickiej 14/8, NIP 5422824401. Przysługuje Tobie prawo do cofnięcia zgody, żądania wglądu do Twoich danych, wniesienia sprzeciwu co do ich przetwarzania, sprostowania, usunięcia i ograniczenia przetwarzania. Więcej informacji o tym jak przetwarzam Twoje dane znajdziesz na devstyle.pl/RODO. Powered by ConvertKit
Notify of
Jacek Ciereszko

Wiedziałem że introspekcja ma duże możliwości ale że aż takie, to nie. nice :D

Choć ja ze swojej strony radzę uważać, jak Jarek podeśle nowszą wersje .dll i zmieni coś z klasą "Jarek" lub metodą "CreateBankAccount()", to nasz kod może się wyłożyć, pomimo tego że będzie się kompilował.

Procent

Mało tego, kompiluje się nawet gdy biblioteka nie zawiera klasy "Jarek". Dlatego też stosując ten mechanizm trzeba sobie zdawać sprawę z ryzyka jakie on ze sobą niesie.

andrzej

refleksje dość znane – w każdej niemal literaturze wspominają o tym, że dla refleksji nie ma świętości. fajny przykład. śmiałem się kilka minut z ideii Jarka :D brawo za pomysł ;) !

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również