2012-11-09 16 views
26

Nếu tôi mở chế độ tương tác và nhập:bạn có thể phục hồi từ việc gán lại __builtins__ trong python không?

__builtins__ = 0 # breaks everything 

tôi đã hoàn toàn bị hỏng phiên chưa? Nếu vậy, những gì đang diễn ra đằng sau hậu trường để gán __builtins__ cho mô đun dựng sẵn mà không thể được xử lý bởi thông dịch viên? Nếu không, làm thế nào tôi có thể phục hồi từ điều này?

Chỉ cần một vài trong số những nỗ lực của riêng tôi để sửa chữa nó:

  • Bất kỳ cố gắng để nhập khẩu kết quả bất cứ điều gì trong một lỗi "ImportError __import__ không tìm thấy"
  • tất cả các chức năng tôi có thể sử dụng để làm bất cứ điều gì khác hơn là đánh giá biểu thức số bị hỏng
  • Có một biến __package__ khác vẫn có thể truy cập được, nhưng tôi không biết liệu/nó có thể được sử dụng hay không.

Trả lời

29

Bạn thường có thể truy cập mọi thứ bạn cần, ngay cả khi __builtins__ đã bị xóa. Nó chỉ là một vấn đề đào đủ xa. Ví dụ:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> __builtins__ = 0 
>>> open 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'open' is not defined 
>>> dir 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'dir' is not defined 
>>> int 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'int' is not defined 
>>> float 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'float' is not defined 
>>> 
>>> __builtins__ = [t for t in().__class__.__bases__[0].__subclasses__() if 'warning' in t.__name__][0]()._module.__builtins__ 
>>> 
>>> open 
<built-in function open> 
>>> int 
<type 'int'> 
>>> float 
<type 'float'> 
>>> 

Để giải thích về những gì heck chỉ xảy ra ở đây, đọc Eval really is dangerous, nơi các kỹ thuật tương tự được sử dụng để chứng minh rằng bạn không thể an toàn thực thi mã Python không tin cậy.

+0

Chỉ cần thử chạy nó trong python 3 .. có một lỗi. Đáng chú ý, điều này: [t cho t in() .__ lớp __.__ căn cứ __ [0] .__ lớp con __() nếu 'cảnh báo' trong t .__ name__] mở rộng thành [] khi tôi thử chạy. Có lẽ đây là một vấn đề với python 3 vs 2? –

+0

Slick! Có cách nào để thực sự hoàn toàn phá vỡ một phiên? – acjay

+4

@HartSimha: Python 2 cho phép chế độ hạn chế nếu nội trang dựng sẵn trong khung hiện tại khác với nội dung phiên dịch.Vì chế độ hạn chế đã được gỡ bỏ trong Python 3, nên dễ dàng sửa đổi câu trả lời này để nhận '__builtins__' từ một hàm:' __builtins__ = [t cho t in() .__ lớp __.__ cơ sở __.__ lớp con __() nếu t .__ name__ == 'Sized '] [0] .__ len __.__ globals __ [' __ builtins __ '] '. – eryksun

3

Về cơ bản, rối tung với tên được bảo vệ và dành riêng có nghĩa là phá vỡ phiên của bạn, đôi khi không có cách nào để khôi phục.

Ví dụ, bạn có thể gõ vào vỏ:

True = False # The chaos begins! 

Đây không phải là có thể với ngôn ngữ lập trình khác, nhưng python cho phép bạn làm những gì bạn muốn, ngay cả khi nó sẽ phá vỡ mọi thứ.

+0

Tôi nhận được một SyntaxError khi tôi gõ True = False, ngay cả trong vỏ bị hỏng. Nếu phiên làm việc hoàn toàn bị hỏng, thì \ _ \ _ builtins \ _ \ _ được gán cho mô-đun trong python ở vị trí đầu tiên như thế nào. Tôi giả định người thông dịch khởi tạo nó bằng cách sử dụng một câu lệnh tối nghĩa và có thể một số loại truy cập tệp cấp thấp. Nhưng nếu không, cách ** ** nội trang được gán. –

+7

Điều này chỉ hoạt động trong Python 2. Python 3 sẽ không cho phép bạn chỉ định mọi thứ cho từ khóa. Nhưng ngay cả trong Python 2, điều này có thể dễ dàng được sửa: 'False = (False không phải là False)' và 'True = not False' và bạn quay lại bản gốc. – poke

3

Bạn nói đúng; bạn thực tế có thể phá vỡ một phiên Python. Tôi nghi ngờ có một cách để phá hủy hoàn toàn nó - nhìn thấy câu trả lời của Ned hoàn toàn là sự mặc khải đối với tôi.

Là một ngôn ngữ rất năng động, Python cung cấp cho bạn rất nhiều dây để tự treo. Tuy nhiên, đừng coi đây là một lỗ hổng; một khẩu hiệu Python phổ biến nói rằng "tất cả chúng ta đều là người lớn đồng ý ở đây." Nếu bạn hiểu ngôn ngữ và thực sự biết những gì bạn đang làm, bạn có một số lượng điên kiểm soát về cơ bản mọi khía cạnh của Python.

+2

Điều này thực sự đúng. Đó cũng là lý do tại sao không có người kiểm duyệt trợ năng như 'công khai' và' riêng tư 'cho các thành viên. Khi sử dụng một cái gì đó, bạn dự kiến ​​sẽ ở lại trong việc thực hiện nội bộ, trừ khi bạn biết chính xác những gì bạn làm. – poke

Các vấn đề liên quan