sandboxrexec.py
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:3k
源码类别:

其他游戏

开发平台:

Python

  1. # sandboxrexec.py
  2. #
  3. # Implement the restricted execution functionality
  4. # that makes the SafeSandbox "safe". Extends the 
  5. # standard Python RExec functionality to meet the 
  6. # specific needs of our game.
  7. #
  8. import rexec
  9. import os
  10. import os.path
  11. import string
  12. def _GetSandboxPath():
  13.   """
  14.   Return a list of Python path entries (i.e. sys.path)
  15.   that are valid to search for legal modules.
  16.   """
  17.   # load this from some kind of config file, preferably
  18.   cwd = os.getcwd()
  19.   sandboxpath = [
  20.     './',
  21.   ]  # our server's area
  22.   for ix in range(len(sandboxpath)):
  23.     pathitem = sandboxpath[ix]
  24.     newpath = os.path.normpath(os.path.join(cwd, pathitem))
  25.     sandboxpath[ix] = newpath
  26.   #print sandboxpath
  27.   return sandboxpath
  28. class SandboxRExec(rexec.RExec):
  29.   """
  30.   Responsible for defining the Python features allowed 
  31.   to be used within the SafeSandbox environment.
  32.   """
  33.   #
  34.   # Class-level attributes define the restricted environment.
  35.   #
  36.   # Extend Python's list of builtin functions we do not allow
  37.   nok_builtin_names = rexec.RExec.nok_builtin_names + 
  38.     ('compile', 'delattr', 'execfile', 'globals', 
  39.      'input', 'locals', 'raw_input', 'vars')
  40.   
  41.   ok_builtin_modules = ('math', 'operator', 'time')
  42.   ok_path = _GetSandboxPath() # load the valid path
  43.   ok_posix_names = ()           # no os module access
  44.   ok_sys_names = ()             # no sys module access
  45.   # Python library modules that are okay to import - 
  46.   # may be redundant with certain modules in ok_builtin_modules
  47.   ok_library_modules = 
  48.     ('types', 'operator', 'copy', 'string', 'math', 'cmath', 'random', 'time')
  49.   # our server modules that are okay to import
  50.   ok_server_modules = 
  51.     ('gameserver.gameevents', 'gameeventkeys')
  52.   # set of all okay modules
  53.   ok_modules = ok_builtin_modules + ok_library_modules + ok_server_modules
  54.   # server packages below which it is okay to import modules
  55.   ok_packages = ('gameserver.sandboxmodules',)
  56.   # 
  57.   # Override the rexec.RExec interface
  58.   #
  59.   def r_open(self, filename, mode=None, bufsize=None):
  60.     """
  61.     Prevent all access to the filesystem by disallowing calls to open().
  62.     """
  63.     raise IOError, 'No access to filesystem is allowed.'
  64.   def r_import(self, modulename, globals={}, locals={}, fromlist=[]):
  65.     """
  66.     Verify that module being imported is among the list of 
  67.     modules and packages that are allowed, and return a 
  68.     reference to it if so.
  69.     """
  70.     okToImport = 0
  71.     if modulename in self.ok_modules:
  72.       okToImport = 1
  73.     else:
  74.       # special test to see if module is a submodule of an allowed package
  75.       for pkg in self.ok_packages:
  76.         if len(modulename) >= len(pkg):
  77.           if modulename[:len(pkg)] == pkg:
  78.             okToImport = 1
  79.     if okToImport:
  80.       mod = rexec.RExec.r_import(self, modulename, globals, locals, fromlist)
  81.       components = string.split(modulename, '.')
  82.       for comp in components[1:]:
  83.         mod = getattr(mod, comp)
  84.       return mod
  85.     raise ImportError, 'Cannot import %s in restricted environment' % (modulename,)