Istnieje kilka sposobów uzyskania dostępu do kodu źródłowego biblioteki z kodu Ruby, który wymaga/ładuje tę bibliotekę. Wśród tych sposobów niektórzy czytają plik biblioteki bezpośrednio i analizują go. Inni uzyskują dostęp do źródła za pomocą wbudowanych metod dostarczających informacji o źródle (takich jak abstrakcyjne drzewo składniowe). W sytuacji, w której nie mam dostępu do bezpośredniego odczytu zawartości pliku (tak jak w poprzednich przypadkach), jedynym sposobem uzyskania dostępu do źródła byłoby uzyskanie dostępu do wbudowanych metod dostarczających informacje. Poprzez ponowne zdefiniowanie tych metod, aby zrobić coś innego, całkowicie stracę dostęp do kodu źródłowego. Jaki jest minimalny zestaw metod, że jeśli zmienię je na coś innego, całkowicie stracę dostęp do kodu źródłowego biblioteki na zewnętrznym pliku?Jakie metody umożliwiają dostęp do kodu źródłowego?
Aby przeformułować pytanie
Załóżmy:
- znajduje się użytkownik, który może pisać żadnego kodu Ruby w pliku A.
- Jest statyczny plik Ruby B napisany przez mnie, który ładuje plik A i wywołuje główną procedurę zdefiniowaną w A, a także definiuje niektóre klasy/metody, z których użytkownik może korzystać w A.
- Użytkownik nie ve + r (odczyt) lub + w (zapis) pozwolenie na B.
Które (standardowe Ruby) metody muszę przedefiniować (anulować) lub usunąć pisząc tak w pliku B, aby uniemożliwić dla użytkownika, aby uzyskać dostęp do źródła zapisanego w pliku B (za pomocą dowolnego kodu, jaki użytkownik może zapisać w pliku A), kiedy uruchamiam plik B?
Istnieje kilka bibliotek, takich jak czarnoksiężnik, podważa, że można wyodrębnić kod źródłowy metod, do których ma dostęp. Musi istnieć kilka prostych poleceń w prostym języku Ruby, na których opierają się te biblioteki, aby umożliwić im dostęp do kodu źródłowego. Jakie są metody, dzięki którym tego rodzaju rzeczy są możliwe?
Jeśli nie znasz pełnej odpowiedzi, ale wiesz, jak konkretna biblioteka wyodrębnia źródło jakiejś metody, to nadal pomoże.
Myślę, że możesz zdefiniować jakąś klasę abstrakcyjną lub coś podobnego do interfejsu w Javie, która niczego nie implementuje. Interfejs będzie publicznie dostępny z zewnętrznych komponentów. Następnie możesz dziedziczyć klasę abstrakcyjną, aby ją zaimplementować wewnętrznie. –
Podczas redefiniowania takich metod, możesz użyć 'Module # alias_method', aby upewnić się, że masz" kopię "oryginalnej metody, którą modyfikujesz. http://apidock.com/ruby/Module/alias_method – fmendez
_system_, _backtick_, _fork/exec_, itp., będą musiały być wyłączone. –