2010-06-13 44 views

Trả lời

5

Tùy thuộc vào cách bạn sử dụng. Dưới đây là một bản tóm tắt được sắp xếp từ việc sử dụng an toàn để sử dụng theo cách bạn chắc chắn không muốn để cho phép (khi chạy mã trên một máy chủ hoặc một số môi trường mà bạn muốn kiểm soát):

  • Nếu bạn sử dụng CSharpCodeProvider chỉ để tạo mã nguồn C#, thì bạn chỉ cần có quyền để lưu các tệp đã tạo vào một số thư mục hoặc ghi chú (nếu có thể lấy mã được tạo thành luồng bộ nhớ)

  • Nếu bạn sử dụng nó để biên dịch nguồn C# đã tạo, sau đó bạn cần có quyền chạy csc.exe (có thể không có sẵn trong một số môi trường giới hạn, chẳng hạn như các host được chia sẻ).

  • Nếu bạn chỉ cần tạo file & biên dịch chúng, sau đó nó có lẽ sẽ không có hại (mặc dù một người nào đó có thể có thể lạm dụng ứng dụng của bạn để tạo ra nhiều, rất nhiều tập tin và tấn công các máy chủ sử dụng một số loại tấn công DOS.

  • Nếu bạn cũng tải & thực thi mã được tạo ra, thì nó phụ thuộc vào cách bạn tạo mã.Nếu bạn cho rằng không có lỗi trong C#/CodeDOM và có thể đảm bảo rằng mã được tạo là an toàn, thì bạn sẽ ổn.

  • Nếu mã của bạn chứa những thứ như CodeSnippetExpression có thể cung cấp d bởi người dùng (theo một cách nào đó) hơn người dùng có thể viết và chạy bất cứ thứ gì họ muốn trên máy chủ của bạn, vì vậy điều này có khả năng khá nguy hiểm.

+0

Giả vờ một lúc, đây sẽ là một hệ thống mở có sẵn cho bất kỳ ai, làm cách nào họ sử dụng CodeSnippetExpression để gây ra sự tàn phá? Tôi không hoàn toàn hiểu nó được sử dụng như thế nào. Mã sẽ chỉ biên dịch mã được cung cấp với các thiết lập: GenerateExecutable = false; GenerateInMemory = true; và sau đó sẽ được gọi với provider.CompileAssemblyFromSource. – GenericTypeTea

+0

@GenericTypeTea: Điểm cuối cùng là giả định rằng điều trước đó là đúng - nghĩa là, bạn tải và chạy assembly. –

2

Sắp xếp. Trên bề mặt, đó không phải là rủi ro trực tiếp, bởi vì bạn không phải là chạy mã, chỉ cần biên dịch. Tuy nhiên, không có gì nói rằng trình biên dịch C# không chứa một số loại lỗi nào đó, do đầu vào độc hại đúng, sẽ làm cho nó được giải cứu và bắt đầu thực thi các lệnh trực tiếp.

Tuy nhiên, nếu sau này bạn thực thi mã được biên dịch (và có lẽ bạn làm - nếu không thì tại sao bạn sẽ biên dịch mã đó để bắt đầu?), Nó sẽ chạy cùng ngữ cảnh như bạn. Rõ ràng, có tất cả các loại tác động bảo mật khó chịu, giống như sử dụng tính năng tương tự như eval() của các ngôn ngữ khác.

+0

Tôi sẽ không bao giờ chạy tệp thi hành được. Đầu vào chỉ được sử dụng để đảm bảo một số biên dịch mã. Vì vậy, ngoài trình biên dịch có lỗi, điều này có nghĩa là nó hoàn toàn an toàn cho ví dụ tôi vừa đề cập? – GenericTypeTea

+0

Nếu bạn chỉ kiểm tra xem một số mã có hợp lệ về cú pháp và biên dịch không có lỗi, tôi không thể thấy tác hại. –

1

Tùy thuộc vào nguồn mà bạn đang biên soạn. Nếu bạn có đủ quyền kiểm soát nguồn, thì đó có thể là một rủi ro có thể chấp nhận được. Nếu bạn cho phép một người nào đó bên ngoài lĩnh vực cung cấp mã tin cậy của bạn cho trình biên dịch, nó có thể là một rủi ro không thể chấp nhận được.

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