Restricted Execution
Python code executed dynamically normally suffers no special restrictions. Python’s general philosophy is to give the programmer tools and mechanisms that make it easy to write good, safe code, and trust the programmer to use them appropriately. Sometimes, however, trust might not be warranted. When code to execute dynamically comes from an untrusted source, the code itself is untrusted. In such cases it’s important to selectively restrict the execution environment so that such code cannot accidentally or maliciously inflict damage. If you never need to execute untrusted code, you can skip this section. However, Python makes it easy to impose appropriate restrictions on untrusted code if you ever do need to execute it.
When the
__builtins__
item in the global namespace
isn’t the standard __builtin__
module (or the latter’s dictionary), Python knows
the code being run is restricted. Restricted code executes in a
sandbox environment, previously prepared by the trusted code, that
requests the restricted code’s execution. Standard
modules rexec
and Bastion
help
you prepare an appropriate sandbox. To ensure that restricted code
cannot escape the sandbox, a few crucial internals (e.g., the
__dict__
attributes of modules, classes, and
instances) are not directly available to restricted code.
There is no special protection against restricted code raising exceptions. On the contrary, Python diagnoses any attempt by restricted code to violate the sandbox restrictions ...
Get Python in a Nutshell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.