Hầu hết các ngôn ngữ hiện đại (được giải thích bằng cách nào đó) có một số loại chức năng eval . Một hàm như vậy thực thi mã ngôn ngữ tùy ý, hầu hết thời gian được dùng làm đối số chính dưới dạng một chuỗi (các ngôn ngữ khác nhau có thể thêm nhiều tính năng hơn cho hàm eval).
Tôi hiểu rằng người dùng không được phép thực thi chức năng này ( chỉnh sửa tức là lấy trực tiếp hoặc gián tiếp đầu vào tùy ý từ người dùng tùy ý để chuyển đến eval
), đặc biệt là với phần mềm phía máy chủ, vì họ có thể buộc quy trình thực thi mã độc. Theo cách đó, các hướng dẫn và cộng đồng bảo chúng ta không sử dụng eval. Tuy nhiên, có nhiều lần eval hữu ích và được sử dụng:
- Quy tắc truy cập tùy chỉnh cho các phần tử phần mềm (IIRC OpenERP có một đối tượng
ir.rule
có thể sử dụng mã python động). - Tính toán và / hoặc tiêu chí tùy chỉnh (OpenERP có các trường như thế để cho phép tính toán mã tùy chỉnh).
- Trình phân tích báo cáo OpenERP (vâng tôi biết tôi đang làm bạn bối rối với công cụ OpenERP ... nhưng đó là ví dụ chính tôi có).
- Mã hóa hiệu ứng chính tả trong một số game RPG.
Vì vậy, họ có một sử dụng tốt, miễn là họ được sử dụng đúng cách. Ưu điểm chính là tính năng này cho phép quản trị viên viết mã tùy chỉnh mà không phải tạo thêm tệp và bao gồm chúng (mặc dù hầu hết các khung sử dụng tính năng eval cũng có cách chỉ định tệp, mô-đun, gói, ... để đọc từ đó).
Tuy nhiên, eval là xấu xa trong văn hóa đại chúng. Những thứ như đột nhập vào hệ thống của bạn đến với tâm trí.
Tuy nhiên, có những chức năng khác có thể gây hại nếu người dùng truy cập bằng cách nào đó: hủy liên kết, đọc, ghi (ngữ nghĩa tệp), cấp phát bộ nhớ và số học con trỏ, truy cập mô hình cơ sở dữ liệu (ngay cả khi không xem xét các trường hợp tiêm SQL).
Vì vậy, về cơ bản, hầu hết thời gian khi bất kỳ mã nào không được viết đúng hoặc không được xem đúng cách (tài nguyên, người dùng, môi trường, ...), mã này là xấu và có thể dẫn đến tác động kinh tế.
Nhưng có một cái gì đó đặc biệt với các eval
chức năng (bất kể ngôn ngữ).
Câu hỏi : Có sự thật lịch sử nào cho nỗi sợ hãi này trở thành một phần của văn hóa đại chúng, thay vì chú ý đến những đặc điểm nguy hiểm khác có thể xảy ra không?
eval
, nó có một chức năng nội bộ được gọi safe_eval
là chuẩn bị môi trường để ngăn chặn mã làm những việc nguy hiểm. Tuy nhiên, lỗi đã được tìm thấy vì Python là một ngôn ngữ khá linh hoạt và do đó khó kiểm soát.