Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [teoria] System pluginów do użytku przez usera, Czyli jak to zrobić by było bezpiecznie
agmakonts
post
Post #1





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 20.08.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Wiem że jest wątek w dziale Pro o pluginach w aplikacjach ale dotyczy on innego typu wtyczek. Mi chodzi o ich wersje jaką znają zwykli szarzy użytkownicy którzy nie widza większej różnicy między BHP a PHP.

Aplikacja nie ma być żadnym cms-em który instalujemy na swoim serwerze tylko zwykłą aplikacją webową i tu pojawia się problem jak umożliwić użytkownikom rozszerzanie funkcjonalność bo wiadomo że nikt nie jest w stanie napisać programu który zaspokoi oczekiwania wszystkich dlatego system pluginów byłby mile widziany.
Takie rozwiązania niestety wymagają dodania do własnej aplikacji kodu osób trzecich a to do najbezpieczniejszych rzeczy nie należy.

Rozwiązanie znane np. z Facebooka jest genialne w swej prostocie ale sprawia (tak mi się wydaje) sporo problemów z przesyłaniem danych z serwera do tych aplikacji. Z resztą rozwiązanie z iframe nie podoba mi się do końca bo nie dość że zabija ograniczenia co do wyglądu to jeszcze cholera wie co się dzieje z danymi wyciągniętymi do aplikacji głównej na serwerach dodatku.

W moim przypadku pluginy nie mają być aż tak potężne by zmieniać całą aplikacje. Gdyby porównywać to do rozszerzeń w przeglądarkach to bliżej temu systemowi ma być do Chrome lub nawet widżetów w Operze niż mocnych, potrafiących zmienić całą przeglądarkę pluginów Firefoxa. Takie zwykłe małe programiki dodające np jedną ikonkę do paska narzędzi i pozwalające wyświetlić jakieś informacje lub obrobić istniejące, wypluć dane do innego formatu niż domyślne itp.

W teorii jest bardzo fajnie ale gdy doszedłem do momentu myślenia o implementacji zaczęły się problemy. Generalnie widzę dwie opcje jak to można zrobić:

Tworzenie:


Opcja 1 - Online:

Rozwiązanie dajce twórcom pluginów jakieś ładne IDE w serwisie gdzie mogą zrobić podstawowe GUI korzystając z danych im elementów (takie Visual Studio biggrin.gif) oraz dodawać funkcjonalność. O ile z tworzeniem samego GUI nie ma problemu bo przy zdefiniowanych elementach i nadawaniu im nazwy, etykiety itp działamy na zwykłym formularzu przyjmującym zwykły tekst i nie ma powodów do niepokoju o bezpieczeństwo. Problemy zaczynają się gdy trzeba kazać coś zrobić tym elementom interfejsu.
Wiadomo że udostępnienie pisania w czystym PHP lub JS jest niedopuszczalne i trzeba znaleźć alternatywę. Tutaj mocno zainspirowały mnie Smarty, pomyślałem że można by stworzyć taki własny pseudo język w obrębie PHP (więcej w części o języku;]). Takie rozwiązanie ma ten plus że kontroluje co twórca mi wysyła i mogę łatwo stworzyć bazę pluginów gdzie będą dodawane rozszerzenia po akceptacji. Dla użytkownika końcowego to też wygodne bo wchodzi sobie do tego mojego AppStore-a i wybiera co chce.
Takie rozwiązanie wydaje się też bezpieczniejsze bo żadnego dziwnego pliku nikt nie wrzuci na serwer. Jest ono jednak kłopotliwe dla twórców.

Opcja 2 - Offline:

W tym wariancie zakładam wysyłanie na serwer paczki np zip w której jest kilka plików. Definicja i opis pluginu w XML, schemat interfejsu też w XML i sam kod jeszcze nie wiem w czym smile.gif. Wysyłanie paczki jest o tyle wygodne że zawsze dostanę paczkę a nie np skrypt PHP a twórcy pozwala wygodnie rozbić warstwy. To rozwiązanie jest jednak o wiele mniej bezpieczne i utrudnia robienie bazy pluginów z której mogli by korzystać użytkownicy. Podobnie jak przypadku wersji Online musiałby powstać jeżyk tych rozszerzeń. Trudną sprawą jest tutaj testowanie pluginu bo jak udostępnić API serwujące choćby testowe dane by nie mijało się to z celem trzymania pluginów u siebie i było wygodne, na razie nie wiem.

Pseudo opcja dla chętnych i posiadających za wiele czasu oraz mało znajomych 3 - Hybryda

Połączyć obydwa rozwiązania.

Język:

Tutaj zaczęły się moje największe problemy, jak pozwolić komuś na odpalenia własnego kodu na moim serwerze, w obrębie mojej aplikacji i byłoby to na tyle bezpieczne bym nie został nazwany szaleńcem. Tak jak pisałem zainspirowały mnie Smarty i ich własny języczek używany w szablonach, jakby nie było komenda w stylu {loop &data}{/loop} nie może zbytniej szkody wyrządzić. Wiadomo że do napisania prostych pluginów nie potrzeba obiektów, super wyrafinowanych typów zmiennych, połączeń z bazą danych i innych bajerów. Implementacja najprostszych poleceń nie powinna być trudna, to jak tan język będzie wyglądać jest jeszcze do przemyślana. Miałem małą styczność z vb.net i pomyślałem że można by tutaj przeszczepić bardzo okrojoną wersję obsługi zdarzeń. Chodzi o to że jeśli mamy w interfejsie pole tekstowe o nazwie "text1" i obok przycisk "napisz Hello World" o nazwie "button1" to nasz kod mógłby wyglądać tak:

Kod
[GUI button1 "button1" [clickLive]]
     text1.text = "Hello World";
[/GUI button1]


Takie coś generowałoby np taki JS:

Kod
    $('#plugin_name_button1').click(function(){$('#plugin_name_text1').val('Hello World')});


Jest to szalenie prosty przykład, wiadomo że trzeba będzie wyjść też poza przeglądarkę i czasem stworzyć kod PHP i umożliwiać jakieś bardziej skomplikowane operacje ale myślę że mając podstawy nie będzie trudno to zrobić.

Kolejny problem to filtrowanie, zabezpieczenie się przed wgraniem <php die(); ?> nie jest trudne ale jeśli udostępnię funkcję do obsługi ciągów to 'bbb<bbb?bbbpbbbhbbbpbbb-bbbdbbbibbbebbb(bbb)bbb;bbb-bbb?bbb>' może być niebezpieczne przy {replace $string | 'bbb' -> '' | '-' -> ' '}.

Pytania:

Co o tym sądzicie? Czy nie jest to rzucanie się z motyką na słońce? Może jest lepszy sposób na stworzenie tego systemu? O czym jeszcze nie pomyślałem?



--------------------
Folio :: Blog
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 15:04