Tôi muốn ứng dụng của mình đánh giá biểu thức từ người dùng không đáng tin cậy, mà tôi sẽ đọc từ tệp JSON. Chẳng hạn như:Cách đánh giá biểu thức người dùng trong hộp cát
value = "(getTime() == 60) AND isFoo('bar')"
Tôi đã tìm thấy nhiều chủ đề về điều này ở đây trên StackOverflow. Thường đề xuất sử dụng lớp ScriptEngine của Java, có thể đọc JavaScript. Hoặc đề xuất người dùng sử dụng thư viện hiện có như JEXL, MVEL hoặc bất kỳ thư viện nào khác từ danh sách này: http://java-source.net/open-source/expression-languages
Nhưng tất cả họ đều dựa vào người dùng đáng tin cậy (ví dụ: tệp cấu hình bạn tự viết và muốn làm một số kịch bản trong đó). Nhưng trong trường hợp của tôi, tôi muốn đánh giá biểu hiện của mình chạy trong một hộp cát an toàn. Vì vậy, người dùng không thể làm điều gì đơn giản như:
value = "while(true)" // or
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL
Và khóa ứng dụng của tôi hoặc truy cập tài nguyên không mong muốn.
1) Vì vậy, có bất kỳ thư viện hiện tại nào có thể được cấu hình dễ dàng để nó có thể chạy trên một hộp an toàn không? Bởi 'dễ dàng', tôi có nghĩa là API cấu hình mức cao mà sẽ nhanh hơn cho tôi để sử dụng hơn để viết đánh giá biểu hiện của riêng tôi. Sau khi thực hiện một ít nghiên cứu của riêng tôi, cả JEXL và MVEL dường như đã ra ngoài.
2) Hoặc có ngôn ngữ biểu thức hiện tại cực kỳ đơn giản để người dùng không tin cậy khai thác nó không? Tất cả những cái tôi thấy là rất phức tạp, và thực hiện những thứ như vòng lặp, câu lệnh nhập khẩu ... Tất cả những gì tôi cần là phân tích toán học, toán tử logic và các biến và phương thức được xác định của riêng tôi. Bất cứ thứ gì ngoài phạm vi của tôi nằm ngoài phạm vi của tôi.
3) Nếu giải pháp duy nhất là viết bộ đánh giá biểu thức của riêng tôi, thì tôi có thể tìm một số hướng dẫn về cách viết mô hình bảo mật nhất quán ở đâu? Tôi mới làm quen với điều này và không biết các thủ thuật phổ biến được sử dụng để tiêm mã là gì. Đó là lý do tại sao tôi muốn tránh phải tự viết nó.
Có thể có một số thông tin hữu ích từ những câu dưới đây (trong đó giao dịch với tình hình khó khăn hơn một chút mã Java không tin cậy): http://stackoverflow.com/câu hỏi/9041246/những gì-là-an ninh-rủi ro-i-nên-guard-chống-khi-chạy-người dùng-cung cấp-ja/9041423 # 9041423 – DNA
Bạn đã bao giờ nhận được một câu trả lời cho câu hỏi này? – ccleve
Không có gì thỏa mãn tôi. Tôi quyết định tự mình xây dựng nó và học nó khi tôi đi. – VIBrunazo