11

Tệp kê khai của Chrome API phiên bản 2 đã loại bỏ khả năng làm không an toàn-eval. Điều này có nghĩa là sử dụng hàm eval hoặc nói chung tạo một hàm từ văn bản.Mẫu Javascript Công cụ hoạt động với Chính sách bảo mật nội dung của Chrome

Dường như hầu hết nếu không phải tất cả các Công cụ đánh dấu Javascript đều làm điều này. Tôi đã sử dụng Jaml, nhưng tôi đã thử một số khác như backbone.js (thực sự sử dụng công cụ tạo khuôn mẫu của underscore.js) mà không có may mắn.

This comment on the Chromium project dường như chỉ ra rằng có rất nhiều thư viện bị ảnh hưởng bởi điều này.

Tôi nghĩ Angular.js có chế độ an toàn CSP, nhưng Angular.js thực sự quá lớn đối với những gì chúng tôi cần. Chúng ta chỉ cần một công cụ tạo khuôn mẫu khá cơ bản và không cần các mô hình hoặc bộ điều khiển và như vậy. Có ai biết về bất kỳ động cơ templating CSP-compatbility ra khỏi đó?

+1

Sao chép? http://stackoverflow.com/questions/10744764/javascript-template-library-that-doest-use-eval-new-function – apsillers

Trả lời

7

Giải pháp tốt nhất cho vấn đề này là biên dịch trước các mẫu của bạn trước khi bạn triển khai tiện ích. Cả hai handlebarsjseco cung cấp tính năng biên dịch trước làm tính năng. Tôi thực sự đã viết một blog post mà đi vào chiều sâu hơn.

+0

Cảm ơn điều này có vẻ thực sự hứa hẹn, chỉ cần nhìn vào nó một chút trước khi phê duyệt. –

+0

Google đã cho phép lại không an toàn-eval cho tệp kê khai 2. Xem http://stackoverflow.com/a/13335364/17815 –

3

Bạn hoàn toàn nên sử dụng biên dịch trước theo khuyến cáo của Mathew cho các mẫu vừa và lớn. Đối với các mẫu rất nhỏ, chúng tôi đang sử dụng mẫu này:

var template = function(message, data) { 
    if (typeof data === 'undefined') { 
    return _.partial(template, message); 
    } else { 
    return message.replace(/\{\{([^}]+)}}/g, function(s, match) { 
     var result = data; 
     _.each(match.trim().split('.'), function(propertyName) { 
     result = result[propertyName] 
     }); 
     return _.escape(result); 
    }); 
    } 
}; 

var data = { 
    foo: 'Hello', 
    bar: { baz: 'world!' } 
}; 

// print on-the-fly 
template('{{foo}}, {{bar.baz}}' args); // -> 'Hello, world!' 

// prepare template to invoke later 
var pt = template('{{foo}}, {{bar.baz}}'); 
pt(args); // -> 'Hello, world!' 

Triển khai này không sử dụng eval, nhưng sẽ yêu cầu gạch dưới.

+0

Gạch dưới nội bộ sử dụng hàm tạo 'Hàm' để biên dịch mẫu, đó là ngầm' eval'. Xem https://github.com/jashkenas/underscore/blob/91632707/underscore.js#L1192-L1232 –

+1

Triển khai này không sử dụng phương thức '_.template', có phương thức' eval' phụ thuộc (các phương thức gạch dưới khác là khỏe). Chúng tôi đang sử dụng nó với một Content-Security-Policy và hoạt động độc đáo. –

+0

Xin lỗi, tôi đã hiểu nhầm nhận xét cuối cùng của bạn. Tôi nhầm lẫn giải thích nó là "underscore' _.template' không sử dụng eval ". Bạn hoàn toàn chính xác: Việc triển khai đề xuất của bạn không sử dụng 'eval'. –

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