2012-03-05 61 views
6

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ó.

+1

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

+0

Bạn đã bao giờ nhận được một câu trả lời cho câu hỏi này? – ccleve

+0

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

Trả lời

1

Tôi có thể khuyên bạn nên nhúng Rhino, cho phép người dùng viết javascript. Nó phù hợp với tiêu chuẩn của bạn trong (2) hoàn toàn là một thư viện java cho phép bạn chạy javascript (hoặc chạy java từ javascript).

Bạn thiết lập ngữ cảnh và người dùng chỉ có quyền truy cập vào nội dung bạn đưa vào ngữ cảnh hoặc truy cập từ ngữ cảnh đó. Các biểu thức javascript có thể đơn giản như trường hợp đơn giản nhất bạn hiển thị ở trên hoặc có thể phức tạp như chúng cần. Nhúng Rhino và phơi bày một tập hợp các đối tượng hạn chế là một cách tuyệt vời để cho phép tất cả các kiểu kịch bản người dùng trong một dự án trước đây và đó là một vài năm trước đây, Rhino giờ đã trưởng thành.

Bạn cũng có lợi thế là nếu vấn đề của bạn yêu cầu nó, bạn cũng có thể thiết lập nó để các biểu thức giống nhau sẽ vui vẻ chạy phía máy khách hoặc phía máy chủ.

Thông tin thêm về nhúng Rhino để thực hiện những gì bạn cần tại http://www.mozilla.org/rhino/tutorial.html#runScript

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