Có bất kỳ khai thác bảo mật có thể xảy ra trong trường hợp này:an toàn của Python 'eval' Đối với Danh sách Deserialization
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
nơi unsanitized_user_input
là một đối tượng str. Chuỗi là do người dùng tạo và có thể khó chịu. Giả sử khuôn khổ web của chúng tôi đã không làm chúng tôi thất bại, đó là một ví dụ thực sự trung thực-đến-thần từ các nội trang Python.
Nếu điều này là nguy hiểm, chúng ta có thể làm bất cứ điều gì với đầu vào để đảm bảo an toàn không?
Chúng tôi chắc chắn không muốn thực thi bất kỳ thứ gì có trong chuỗi.
Xem thêm:
Bối cảnh lớn hơn đó là (Tôi tin) không cần thiết cho câu hỏi là chúng ta có hàng ngàn những:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
trong một số trường hợp lồng nhau:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
mà bản thân họ chuyển đổi sang chuỗi với repr()
, đưa vào lưu trữ liên tục, và cuối cùng đọc lại vào bộ nhớ với eval.
Đánh giá các chuỗi được lưu trữ từ lưu trữ liên tục nhanh hơn nhiều so với dưa chuột và đơn giản. Trình thông dịch là Python 2.5 nên json và ast không có sẵn. Không cho phép mô-đun C và cPickle không được phép.
"Lý do để thực hiện việc này sẽ có ý nghĩa hơn nhiều nếu tôi trình bày ngữ cảnh lớn hơn" Bạn có thể giải thích về vấn đề này không? Hiện tại lệnh này dường như hoàn toàn vô nghĩa - giống như không làm gì với 'unsanitized_user_input' .. – dbr
" chúng ta có hàng ngàn cái này "Điều đó không có ý nghĩa gì cả. Tại sao bạn lưu trữ đầu vào theo cách đó? Không có điểm nào trong repr() để nhập chuỗi cho mục đích lưu trữ. – Miles
Tại sao bạn không sử dụng dưa chua hoặc thứ gì đó đơn giản hơn? –