Programowanie w Ruby Wykład 7 Marcin Młotkowski 2 grudnia 2016
Plan wykładu Jak zajrzeć do środka 1 Jak zajrzeć do środka 2 3 Marcin Młotkowski Programowanie w Ruby 2 / 28
Refleksje (introspekcje) Przegląd zaimplementowanych metod Przegląd stanu obiektu I inne... Marcin Młotkowski Programowanie w Ruby 3 / 28
Analiza stanu obiektu Metoda inspect [ 1, 2, 3..4, five ].inspect Marcin Młotkowski Programowanie w Ruby 4 / 28
Analiza stanu obiektu Metoda inspect [ 1, 2, 3..4, five ].inspect wynik [1, 2, 3..4, \ five\ ] Marcin Młotkowski Programowanie w Ruby 4 / 28
Zmienne obiektu Jak zajrzeć do środka class Klasa def initialize @a = 1; @b = 2 end end Marcin Młotkowski Programowanie w Ruby 5 / 28
Zmienne obiektu Jak zajrzeć do środka class Klasa def initialize @a = 1; @b = 2 end end Klasa.new.instance variables Wynik [ @a, @b ] Marcin Młotkowski Programowanie w Ruby 5 / 28
Metody obiektu Jak zajrzeć do środka 3.14.methods Marcin Młotkowski Programowanie w Ruby 6 / 28
Metody obiektu Jak zajrzeć do środka 3.14.methods [ %, inspect, singleton method added, clone, round, method, public methods, instance variable defined?, divmod, nan?, equal?, freeze, integer?, *, +, to i, methods, respond to?, -,... untaint, is a? ] Marcin Młotkowski Programowanie w Ruby 6 / 28
Przykład zastosowania Zrzut stanu programu zrzut stanu wszystkich obiektów dane są prezentowane w formie stringu ze znacznikami html Marcin Młotkowski Programowanie w Ruby 7 / 28
Specyfikacja zadania Każdy obiekt powinien mieć metodę to html, która zwraca stan obiektu w formie html Jeśli obiekt nie ma własnej metody to korzystamy z metody to s Marcin Młotkowski Programowanie w Ruby 8 / 28
Implementacja Jak zajrzeć do środka html = <html><body> ObjectSpace.each object(object) do o if o.respond to?( to html ) html += o.to html else html += <div> + o.to s + </div> end end Marcin Młotkowski Programowanie w Ruby 9 / 28
Plan wykładu Jak zajrzeć do środka 1 Jak zajrzeć do środka 2 3 Marcin Młotkowski Programowanie w Ruby 10 / 28
hostom Potrzebny jest serwer, który będzie działał na ustalonym porcie, np. 9000 Klient powinien znać adres serwera i port Marcin Młotkowski Programowanie w Ruby 11 / 28
Zadanie serwera Jak zajrzeć do środka Serwer logów Implementacja metody save(str), która zapisuje str w pliku; nazwa pliku powinna odzwierciedlać czas Marcin Młotkowski Programowanie w Ruby 12 / 28
Zadanie serwera Jak zajrzeć do środka Serwer logów Implementacja metody save(str), która zapisuje str w pliku; nazwa pliku powinna odzwierciedlać czas Rozwiązanie Drb: Distributed Ruby, distributed object system Marcin Młotkowski Programowanie w Ruby 12 / 28
Implementacja: serwer drb require drb class LogSerwer def save(str) fn = Time.new.to s open(fn, w ) { f f << str } end def LogSerwer.Run @@server = LogSerwer.new DRb.start service( druby://localhost:9000, @@server) DRb.thread.join end end Marcin Młotkowski Programowanie w Ruby 13 / 28
Uruchomienie serwera LogSerwer.run Marcin Młotkowski Programowanie w Ruby 14 / 28
Implementacja klienta obj = DRbObject.new with uri( druby://localhost:9000 ) if obj.respond to?( save ) obj.save(html) end Marcin Młotkowski Programowanie w Ruby 15 / 28
A jak ktoś nam zrobi kawał def save(str) system(str) end Marcin Młotkowski Programowanie w Ruby 16 / 28
A jak ktoś nam zrobi kawał def save(str) system(str) end obj.save( rm -rf * ) Marcin Młotkowski Programowanie w Ruby 16 / 28
System bezpieczeństwa Podział obiektów w Ruby: Obiekty zaufane Obiekty niezaufane: pochodzące z sieci, plików etc. Marcin Młotkowski Programowanie w Ruby 17 / 28
Kontrola zaufania Object#tainted? sprawdzenie czy obiekt jest zaufany Object#taint ustawienie obiektu na niezaufany Object#untaint usunięcie braku zaufanie z obiektu (nie zawsze działa) Marcin Młotkowski Programowanie w Ruby 18 / 28
Poziomy zabezpieczeń Wartości zmiennej $SAFE 0 brak kontroli (domyślne) 1 m.in. zabrania wywoływań eval dla niepewnych stringów 2 m.in. nie można usuwać i tworzyć katalogów oraz wykonywać pewnych operacji z modułu Kernel 3 nie można wywołać untain 4 nie można modyfikować bezpiecznych obiektów Marcin Młotkowski Programowanie w Ruby 19 / 28
Problemy Jak zajrzeć do środka Można obejść mechanizm zabezpieczeń, więc nie należy używać w środowiskach niezaufanych. Marcin Młotkowski Programowanie w Ruby 20 / 28
Zabezpieczenie Jak zajrzeć do środka Użycie ACL (Access Control Lists) Klasa ACL list = %w[ deny all allow 192.168.1.1 allow ::ffff:192.168.1.2 allow 192.168.1.3 ] acl = ACL.new(list, ACL::DENY_ALLOW) Marcin Młotkowski Programowanie w Ruby 21 / 28
Zabezpieczenie Jak zajrzeć do środka Użycie ACL (Access Control Lists) Klasa ACL list = %w[ deny all allow 192.168.1.1 allow ::ffff:192.168.1.2 allow 192.168.1.3 ] acl = ACL.new(list, ACL::DENY_ALLOW) DRb.install acl(acl) Marcin Młotkowski Programowanie w Ruby 21 / 28
Plan wykładu Jak zajrzeć do środka 1 Jak zajrzeć do środka 2 3 Marcin Młotkowski Programowanie w Ruby 22 / 28
Systemowe punkty zaczepienia Procedury uruchamiane przy okazji wywołania wybranej funkcji czy metody Marcin Młotkowski Programowanie w Ruby 23 / 28
Systemowe punkty zaczepienia Procedury uruchamiane przy okazji wywołania wybranej funkcji czy metody Przykład punktu zaczepienia Jakie są wywoływane polecenia systemowe (rm, ls, mkdir etc.) podczas biegu programu? Marcin Młotkowski Programowanie w Ruby 23 / 28
Realizacja Jak zajrzeć do środka Polecenia systemowe są wywoływane funkcją Kernel.system Zamiast funkcji Kernel.system wstawimy własną funkcję Marcin Młotkowski Programowanie w Ruby 24 / 28
Implementacja Jak zajrzeć do środka module Kernel alias method :old system, :system def system(*args) puts system(#{args.join(, )}) old system(args) end end Marcin Młotkowski Programowanie w Ruby 25 / 28
Inspekcja biegu programu caller zwraca stos wywołań w postaci tablicy set func proc pozwala na wywołanie bloku dla każdej instrukcji global variables tablica nazw zmiennych globalnych local variables Marcin Młotkowski Programowanie w Ruby 26 / 28
Śledzenie zmian zmiennych trace var(symbol, blok) śledzi przypisywanie wartości zmiennej untrace var(symbol) usunięcie śledzenia zmiennej Marcin Młotkowski Programowanie w Ruby 27 / 28
Debugger Jak zajrzeć do środka ruby -r debugger plik.rb Marcin Młotkowski Programowanie w Ruby 28 / 28