2015-10-13 20 views
5

Tôi đang làm việc trên react-metaform và một trong những thách thức của tôi là tôi cần cho phép người dùng cuối xác định siêu dữ liệu dưới dạng hàm. Ví dụ:Làm cách nào để kiểm tra xem hàm có phải là hàm thuần túy không?

socialSecurityNumber.required: (m) => m.type == 'person' 

Vấn đề là hiển nhiên: Tôi không thể tin tưởng người dùng. Vì vậy, đây là những biện pháp phòng ngừa tôi đang lập kế hoạch để thực hiện:

  • chức năng người dùng định nghĩa nên chức năng tinh khiết. Theo nghĩa đó, các chức năng này chỉ có thể truy cập thông số của chúng, không có gì khác.
  • Các hàm do người dùng định nghĩa sẽ chạy trong môi trường có khả năng đàn hồi ngoại lệ, thời gian thực thi quá dài và vòng lặp vô hạn. (Tôi không lo lắng về điều này ngay bây giờ).

Câu hỏi đặt ra là: Làm cách nào để đảm bảo chức năng do người dùng xác định chỉ truy cập vào thông số và không có gì khác?

+3

tôi sẽ giả định đặt cược tốt nhất của bạn để xác định ngôn ngữ biểu hiện của riêng bạn mà được phân tách và sau đó được đánh giá trên các đối tượng thực tế của bạn, thay vì sử dụng 'hàm mới'. – Bergi

+2

http://stackoverflow.com/questions/14889393/how-to-run-a-javascript-function-in-a-sandbox-environment – epascarello

+2

Tôi nghĩ từ lúc bạn yêu cầu người dùng viết JS và thực hiện nó bạn được thực hiện khá nhiều. Bạn không thể ngăn chặn thời gian thực hiện lâu dài (chạy-to-hoàn thành, yeah!) Hoặc đảm bảo rằng các chức năng là tinh khiết (có thể với bóng lớn thông qua các thông số, nhưng đó sẽ là lạ). –

Trả lời

1

Tôi sẽ sử dụng esprima để phân tích cú pháp các chức năng JavaScript của người dùng được lưu trữ trong tệp hoặc trong cơ sở dữ liệu. Và tôi sẽ cho phép chỉ chạy mã vượt qua bài kiểm tra phân tích cú pháp (chỉ các tính năng thuộc danh sách trắng - sử dụng biến cục bộ, tham số, ...).

Bạn có thể bắt đầu bằng mã kiểm tra rất đơn giản chỉ cho phép các tập lệnh rất hạn chế và cải thiện dần các tập lệnh đó. Tuy nhiên, tôi đoán bạn sẽ dành rất nhiều nỗ lực cho giải pháp theo thời gian bởi vì người dùng của bạn sẽ luôn muốn nhiều hơn nữa.


Lưu ý: Angular.js sử dụng cho dependency injection của loại 'lừa': https://jsfiddle.net/987Lwezy/

function test() { 
    console.log("This is my secret!"); 
} 


function parser(f) { 
    document.body.innerHTML = test.toString(); 
} 

parser(test); 
+0

Hm, làm thế nào điều này sẽ ngăn chặn một cái gì đó như 'function() {[] .__ proto __. Slice = function() {return" Tôi đã làm hỏng ứng dụng của bạn! "; }; } '(không sử dụng biến miễn phí)? – Bergi

+0

OP cho biết anh ta chỉ muốn cho phép truy cập thông số người dùng. Việc gán cho '[] .__ proto __. Slice' không được gán cho tham số người dùng. –

+0

Về cơ bản, bạn phải đưa ra một tập hợp con JavaScript mà bạn cho phép hoặc chọn một giải pháp khác. Nó hoàn toàn quan trọng để sử dụng một "giải pháp danh sách trắng" và không phải là một "giải pháp danh sách đen". Tôi có nghĩa là bạn không thể cấm 'eval' và hy vọng điều tốt nhất. Bạn chỉ có thể kích hoạt các arithmetics cơ bản với các tham số chức năng ... cho tất cả những gì tôi biết nó có thể đủ trong một số kịch bản. –

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