2011-12-23 11 views
15

Obecnie pracuję nad tekstowym silnikiem gry w języku Ruby, z aplikacją podzieloną na kod Ruby w/lib i dane YAML w/data, która jest ładowana w razie potrzeby przez grę . Chcę zezwolić, aby pliki danych zawierały podstawowe skrypty, głównie w modelu zdarzeń/obserwatorów. Jednak chcę również, aby użytkownicy mogli generować i udostępniać niestandardowe scenariusze bez obawy o złośliwy kod osadzony w skrypcie.Rubbingowe piaskowanie a integracja języka skryptowego

Uzupełnienie: Mój pierwotny plan był mają treści tworzone przez użytkowników podzielić na dwa rodzaje, „moduły”, które były dane tylko (a więc bezpieczny) i wtyczek, które dodaje dodatkowe funkcje (ale oczywiście nie były bezpieczne). Aby uczynić analogię do gier na tabletach, moduły byłyby jak opublikowane scenariusze przygodowe i treści, a wtyczki byłyby regułami zawierającymi dodatkowe reguły i systemy.

skrypt (składnia z zastrzeżeniem oczywiście zmieniają się w zależności od rozwiązania):

--- 
Location: 
    observers: 
    on_door_open: | 
     monster = spawn_monster(:goblin); 
     monster.add_item(random_item()); 
     monster.hostile = true; 

Z punktu widzenia bezpieczeństwa, byłoby idealnie, gdyby skryptowy był ściśle opt-in, prawdopodobnie za pośrednictwem dołączonego wstawek z trochę DSL, np:

class Frog 
    include Scriptable 

    def jump; ... ; end # this can be called from a script 
    allow_scripting :jump 

    def ribbit; ... ; end # this cannot be called from a script 
end 

szukałem na trzy czterech opcji, ale nie jestem pewien, co jest najlepszym podejściem do podjęcia:

  1. Używaj skryptów w języku Ruby, ale w piaskownicy.

    9 Zalety: Bardzo dobrze zna Ruby, nie ma potrzeby stosowania "kleju" kodu lub problemów z łączeniem obiektów między językami.

    Niezbyt zaznajomieni z problemami bezpieczeństwa lub piaskownicą, nie znaleźli żadnych gotowych rozwiązań, które pasują do siebie.

  2. Implementacja Umożliwia osadzenie innego języka skryptowego, np. Lua.

    Zalety: Ruby i Lua oparte są na C, więc wiązania powinny być dość proste. Lua jest dość popularnym językiem, więc pomoc dostępna, jeśli napotkasz problemy później. Bezpieczne, ponieważ każda funkcja, której nie wiążę, będzie niedostępna ze skryptów.

    Minusy: Istniejące wiązania Ruby-Lua wydają się być jednokierunkowe, stare i źle utrzymane, lub jedno i drugie. Wygląda na podejrzanego, aby osadzić język skryptowy w innym języku skryptowym.

  3. Implementacja niestandardowego języka skryptowego za pomocą interpretera Ruby. Eksperymentowałem z Treetop i nie powinno być zbyt trudno tworzyć prostą gramatykę, która wystarczyłaby dla skryptów.

    Plusy: Nie trzeba osadzać innego języka. Tylko funkcja, którą specjalnie zaimplementowałem, będzie dostępna dla skryptów.

    Minusy: Overkill. Zespół "Nie zbudowano tutaj". Prawdopodobnie czeka nas straszne gniazdo robaków.

  4. Wdrażaj pliki danych całkowicie w Ruby, używając języka specyficznego dla domeny.

    Zalety: Prosty i łatwy.

    Żadne dane utworzone przez użytkownika nie są zaufane.

Jestem również otwarty na inne sugestie nieuwzględnione na tej liście, o których być może nie myślałem. Jakie jest najlepsze rozwiązanie do bezpiecznego wdrażania skryptów osadzonych w plikach danych?

Edytuj 2011 年 12 月 23 日: Dodano czwartą opcję z DSL, dodano "dodatek" u góry z dodatkowymi myślami/kontekstem.

+0

Hmm, nie znam się dobrze na skryptowaniu gier, ale dlaczego nie używać V8 i JavaScript? Błyskawicznie i większość osób będzie wygodnie pracować z JS. – omninonsense

+0

Wesołych świąt, wszyscy! –

+1

To naprawdę zależy od tego, co chcesz osiągnąć, jeśli wtyczki są w rubinach, trudno będzie im zapobiec ponownemu otwarciu głównej klasy i robieniu wszystkiego, co chcą, w ten sam sposób, w jaki wtyczka ruby ​​na szynach może zrobić wszystko, co chce. . Poza tym używanie jakiegokolwiek innego języka jako języka wtyczki jest przesadzone, będziesz robić więcej pracy nad nim niż samej gry;) – Schmurfy

Odpowiedz

4

Można rozważyć użycie opcji Shikashi gem, która umożliwia tworzenie obszarów izolowanych i definiowanie białej listy dozwolonych wywołań metod dla poszczególnych obiektów.

+0

Shikashi wygląda bardzo interesująco, bardziej zgodnie z moimi początkowymi intencjami. Czy (czy ktoś) ma jakieś doświadczenie, opowieści wojenne, porady lub ogólne komentarze na ten temat? –

+0

Wybrano jako odpowiedź, ponieważ najlepiej odpowiada na pytanie, które pierwotnie miałem na myśli. –

+0

Czy klejnot Shikashi współpracuje z Rails 5 beta ruby ​​2.3?To nie jest instalacja dla mnie. – abrocks

1

Należy rozważyć użycie jRuby zamiast Ruby. Java została pierwotnie zaimplementowana do obsługi kodu mobilnego (z powrotem w set-top dni) i ma dobrze przetestowany security model/implementation, który mógł, jak podejrzewam, owinąć wystarczająco jRuby, aby powstrzymać skrypty/klasy użytkowników od spustoszenia z resztą systemu gry . jRuby obsługuje także embedding, co może pomóc oddzielić rdzeń gry od aplikacji użytkownika, chociaż nie wiem, jak bardzo jest on w tym momencie.

I, oczywiście, jRuby to Ruby!

+0

Dobry pomysł z juby. Ale testy, które zrobiłem z jruby i jsr 223, nie są zbyt udane (zmienne przechodzenie). Mam nadzieję, że to się zmieni w przyszłości. – plang

+0

Poza faktem (i zdaję sobie sprawę, że mam dodatkowe 2-letnie zaległości w czasie lub moim komentarzu), że Java okazała się pełna dziur w bezpieczeństwie. Oczywiście nie jest to tak naprawdę problem Java - bezpieczeństwo kodu uruchomionego na komputerze jest koszmarem zaufania, ponieważ ostatecznie sprowadza się do zaufania innych programistów. Zaufanie do piaskownicy, ponieważ jest reklamowane jako piaskownica, jest może lepsze niż nigdy nie ufać nikomu, ale wciąż jest zaufaniem. – jefflunt