Jp Calderone wrote:
>  Probably not.  For example:
> 
>    >>> (1).__class__.__bases__[0].__subclasses__()[-1]('/dev/null')
>    <open file '/dev/null', mode 'r' at 0xb7df53c8>

However:

py> eval("(1).__class__.__bases__[0]"
...      ".__subclasses__()[16]('/dev/null')",
...      dict(__builtins__={}))
Traceback (most recent call last):
   File "<interactive input>", line 3, in ?
   File "<string>", line 0, in ?
IOError: file() constructor not accessible in restricted mode

Also worth noting that you can't get the builtins through a function's 
globals either:

py> eval("(1).__class__.__bases__[0]"
...      ".__subclasses__()[17].substitute.func_globals",
...      dict(__builtins__={}))
Traceback (most recent call last):
   File "<interactive input>", line 3, in ?
   File "<string>", line 0, in ?
RuntimeError: restricted attribute

I've read some of the older posts, which suggested that you could 
restore __builtins__ using a global declaration and a delete, but I 
can't reproduce that bug in current Python.

Note that even if you supply the file object as part of your 
__builtins__, the constructor is still not accessible in restricted mode:

py> eval("file('/dev/null')", dict(__builtins__=dict(file=file)))
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
   File "<string>", line 0, in ?
IOError: file() constructor not accessible in restricted mode

I believe the official stance is something like: "Well restricted mode 
probably works in a lot of cases, but we're not confident enough in it 
(having found bugs in it over and over) that we'd suggest it for 
production use."

STeVe
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to