2016-04-20 9 views
2

Ich versuche jruby als Skriptsprache zu benutzen (um Quests für ein Spiel zu schreiben), aber ich muss die Verwendung von potenziell gefährlichen Klassen wie Dir, Process oder RubyVM verhindern.Wie kann man nur auf bestimmte Ruby-Klassen zugreifen?

Ich fand bereits eine umständliche Art und Weise einzelne Methoden und Klassen zur Blacklist:

class Dir 
    def Dir.[] 
    end 
    def Dir.chdir 
    end 
    def Dir.chroot 
    end 
    def Dir.delete 
    end 
    def Dir.entries 
    end 
    def Dir.exist? 
    end 
    def Dir.exists? 
    end 
    def Dir.foreach 
    end 
    def Dir.getwd 
    end 
    def Dir.glob 
    end 
    def Dir.home 
    end 
    def Dir.mkdir 
    end 
    def Dir.initialitze 
    end 
    def Dir.open 
    end 
    def Dir.pwd 
    end 
    def Dir.rmdir 
    end 
    def Dir.unlink 
    end 
    def close 
    end 
    def each 
    end 
    def fileno 
    end 
    def inspect 
    end 
    def path 
    end 
    def pos 
    end 
    def read 
    end 
    def rewind 
    end 
    def seek 
    end 
    def tell 
    end 
    def to_path 
    end 
end 

Aber ich hoffe wirklich, dass es eine viel einfachere Art und Weise ist diese Aufgabe oder noch besser die weißen Liste der Klassen durchzuführen, die in der Lage sein sollten benutzen.

Antwort

4

Sie können nur bestimmte Methoden privat:

class Dir 
    private :close, :each .... 
    private_class_method :glob, :home ... 
end 

Oder können Sie ganze Klasse (schlechte Idee, wie für mich) undefine:

Object.send(:remove_const, :Dir) 

Oder entfernen Methoden (auch schlechte Idee, Methoden zu entfernen von Coreklasse Rubin):

class Dir 
    remove_method :close, :each .... 
end 
+0

unter Verwendung von 'Klasse Dir \ um diese Prävention zu arbeiten n def Dir.workaround_pwd \ n nicht möglich ist, es Dir.pwd \ n Ende \ n Ende \ n' – seyfahni

+0

@seyfahni, ich verstehe dich nicht, bitte, geben Sie die vollständige Erklärung Ihrer Meinung durch die Aktualisierung Antwort – Ilya

+0

Ich denke nur, dass es eine einfache Problemumgehung für Ihre Lösung gibt: [ Workaround für Pastebin] (https://pastebin.com/v0ssbHhg) – seyfahni