2011-10-14 24 views
7

Tôi có chức năng trộn thư giống như một mẫu, một số đối tượng kinh doanh và tạo ra html sau đó được tạo thành PDF.Làm thế nào nguy hiểm là nó cho phép người dùng xác định các mẫu RazorEngine?

Tôi đang sử dụng RazorEngine để làm mẫu + mẫu thành bit html.

Nếu tôi cho phép người dùng chỉ định các mẫu, tôi đang có những rủi ro gì? Có thể giảm thiểu rủi ro không?

Ví dụ: người dùng có thể thực thi mã tùy ý không? (xóa các tập tin, thay đổi cơ sở dữ liệu, vv?) Có cách nào tôi có thể phát hiện loại điều này? (Tôi biết rằng sẽ là không thể nói chung, nhưng các bit của mã trong mẫu dao cạo nên được mô hình tài sản được, hoặc có thể nếu báo cáo dựa trên các giá trị tài sản mô hình).

Tôi thực sự tin tưởng người dùng ở đây (đó là một dự án riêng tư nhỏ), nhưng khi động cơ templating đi, điều này có vẻ quá mạnh mẽ cho ứng dụng này.

Trả lời

6

Tệp dao cạo cshtml có thể thực thi bất kỳ. NET trong bối cảnh của trang web để có, nó là một nguy cơ bảo mật để cho phép họ được cung cấp bởi người dùng.

Bạn sẽ được phục vụ tốt hơn bằng cách chấp nhận mẫu HTML chung chung hơn, với mã thông báo tùy chỉnh để nhập dữ liệu Mô hình.

+0

Cảm ơn. Tôi đang tìm nơi khác cho một động cơ templating bây giờ.Nó đã cảm thấy như Razor không an toàn trong ứng dụng này, nhưng tôi đã không tìm thấy bất cứ ai làm cảnh báo này (và có rất nhiều bài viết về cách sử dụng nó để kết hợp thư). – Greg

1

Tôi tin rằng việc xóa using câu lệnh và thay thế bất kỳ @System.[...] như System.IO.File.Delete(filepath) bằng cách sử dụng regex có thể giảm số lượng lỗ hổng bảo mật có thể có.

Hãy nhớ rằng Mẫu chạy bên trong ngữ cảnh và chỉ có thể truy cập vào những gì có sẵn trong đó, nhưng cũng bao gồm cả các hội đồng .NET Framework.

+0

@ {using System.IO;} Với cố gắng, tôi sẽ nghi ngờ mã đó hoạt động tốt và tôi chắc chắn đó sẽ là những cách thông minh khác để đánh bại hầu hết mọi regex. Nó không an toàn và tốt hơn để xây dựng một cái gì đó đơn giản an toàn từ đầu tôi muốn nói –

+0

Đó là sự thật. Nhưng cách duy nhất để ai đó có thể sử dụng các thư viện .NET là viết bằng System. [...] hoặc sử dụng NS = System. [...] hoặc nhập vào namespace đầy đủ. (Tôi không thể nghĩ ra cách khác). Tuy nhiên tôi đồng ý rằng nó nguy hiểm nhưng tất cả mọi thứ đi kèm với một thương mại và nếu ai đó phải sử dụng RazorTemplates tôi tin rằng việc chăm sóc. NET Lib là một khởi đầu tốt. – djsolid

+0

Tôi chắc chắn bạn có thể làm một số thứ thú vị với sự phản chiếu, nếu bạn đang cố * thực sự * khó đánh bại các regex ... ... mặc dù bạn cần gọi * cái gì đó * trực tiếp tại một thời điểm nào đó, tôi cho là vậy. – Greg

11

Trong phiên bản 3, tôi đã giới thiệu một IsolatedTemplateService hỗ trợ phân tích cú pháp/biên dịch mẫu trong AppDomain khác. Bạn sẽ có thể kiểm soát việc tạo miền ứng dụng mà các khuôn mẫu sẽ được biên dịch, có nghĩa là bạn có thể giới thiệu bất kỳ yêu cầu bảo mật nào bạn muốn bằng cách áp dụng chính sách bảo mật cho chính miền ứng dụng con.

Trong tương lai, tôi hy vọng sẽ giới thiệu một cách chung để thêm tiện ích mở rộng vào đường ống, vì vậy bạn có thể làm những việc như kiểm tra tạo mã. Tôi sẽ tưởng tượng điều này sẽ cho phép các kịch bản kiểm tra kiểu của mã được tạo trước khi nó được biên dịch.

Tôi đã đẩy phiên bản đầu tiên của RazorEngine (v3) lên GitHub vài ngày trước. Kiểm tra nó thoải mái. https://github.com/Antaris/RazorEngine

+0

Cảm ơn, tôi sẽ theo dõi RazorEngine - nó có vẻ thực sự hữu ích (nhưng không phải cho ứng dụng này, tại thời điểm này). – Greg

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