Attualmente sto lavorando a un motore di gioco basato su testo in Ruby, con l'app separata in codice Ruby in/lib e dati YAML in/data, che viene caricata quando necessario dal gioco . Voglio consentire ai file di dati di contenere script di base, principalmente in un modello di evento/osservatore. Tuttavia, voglio anche che gli utenti siano in grado di generare e condividere scenari personalizzati senza doversi preoccupare del codice dannoso incorporato nello script.Ruby sandboxing vs. integrazione di un linguaggio di scripting
addendum: mio piano originale era quello di avere contenuti creati separato in due tipi, "moduli", che erano soli dati (e quindi sicuro) e plugin che aggiunge funzionalità aggiuntive (ma ovviamente non erano sicuri). Per fare un'analogia con il gioco da tavolo, i moduli sarebbero come scenari e contenuti di avventura pubblicati e i plugin sarebbero libri di regole contenenti regole e sistemi aggiuntivi.
Script di esempio (sintassi ovviamente soggetta a modifiche in base soluzione):
---
Location:
observers:
on_door_open: |
monster = spawn_monster(:goblin);
monster.add_item(random_item());
monster.hostile = true;
Dal punto di vista della sicurezza, sarebbe ideale se scripting era rigorosamente opt-in, probabilmente attraverso un mixin incluso con un po ' DSL, ad esempio:
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
ho guardato tre quattro opzioni, ma non sono sicuro che è l'approccio migliore per prendere:
Utilizzare lo script Ruby, ma in una sandbox di qualche tipo.
Pro: Molto familiare con Ruby, nessuna necessità di codice "colla" o problemi di integrazione di oggetti tra le lingue.
Contro: Non molto familiare con problemi di sicurezza o sandboxing, non ho trovato nessuna soluzione pronta per l'uso che sembra adattarsi.
ImplementareIncorporare un altro linguaggio di scripting, ad es. Lua.Pro: Ruby e Lua sono basati su C, quindi i binding dovrebbero essere ragionevolmente semplici. Lua è un linguaggio ragionevolmente popolare, quindi aiuto disponibile se mi imbatto in problemi successivi. Sicuro, dal momento che qualsiasi funzionalità che non associo in modo specifico non sarà disponibile dagli script.
Contro: Gli attacchi esistenti in Ruby-Lua sembrano essere a senso unico, vecchio e mal gestito, o entrambi. Sembra un acaro dubbia di incorporare un linguaggio di scripting in un altro linguaggio di scripting.
Implementare un linguaggio di scripting personalizzato con l'interprete Ruby. Ho sperimentato con Treetop e non dovrebbe essere troppo difficile fare una semplice grammatica che sarebbe sufficiente per gli script.
Pro: Non è necessario incorporare un'altra lingua. Solo le funzionalità che ho implementato in modo specifico saranno disponibili per gli script.
Contro: Overkill. Sindrome "non costruita qui". Probabilmente orrendo nido di insetti in attesa di accadere.
Implementare i file di dati interamente in Ruby, utilizzando un linguaggio specifico del dominio.
Pro: Semplice e facile.
Contro: Nessun dato creato dall'utente è affidabile.
Sono aperto anche ad altri suggerimenti non presenti in quella lista a cui non avrei pensato. Qual è la soluzione migliore per implementare in modo sicuro gli script incorporati nei file di dati?
Edit 2011 年 12 月 23 日: Aggiunta quarta opzione con DSL, ha aggiunto "addendum" in alto con l'aggiunta di pensieri/contesto.
Hmm, non ho molta familiarità con lo scripting di giochi, ma perché non utilizzare V8 e Javascript? È veloce e la maggior parte di tutti sarà a suo agio a lavorare con JS. – omninonsense
Buone vacanze, a tutti! –
Dipende davvero da cosa si vuole ottenere, se i plugin sono in ruby sarà difficile impedire a uno di loro di riaprire una classe principale e fare tutto ciò che vogliono nello stesso modo in cui un plugin ruby on rails può fare tutto ciò che vuole . A prescindere dal fatto che l'uso di qualsiasi altra lingua come lingua per i plug-in è eccessivo, farai più lavoro rispetto al gioco stesso;) – Schmurfy