2013-06-11 10 views
5

Tôi thích ý tưởng "mã dưới dạng dữ liệu" cho cấu hình, vì xác thực bạn nhận được từ các lớp chữ thường là xác thực giống như bạn muốn cho một tệp cấu hình. Twitter đã viết một tiện ích đánh giá tốt đẹp mà làm cho điều này dễ dàng (https://github.com/twitter/util). Tôi muốn cho phép người dùng tải tệp cấu hình lên dịch vụ từ xa. Điều đó mở ra tiềm năng để tiêm mã chống lại dịch vụ từ xa của tôi.Làm cách nào để bạn có thể buộc Scala Eval của Twitter ngăn chặn mã tiêm? Tôi muốn giới hạn Eval để chỉ định các tham số cấu hình

Ví dụ, nếu tôi có lớp trường hợp cấu hình sau:

case class MyConfig(param1: String) 

tôi muốn người dùng có thể tải lên một tập tin có chứa các lệnh:

MyConfig(param1 = "My Param Value") 

... nhưng không phải tệp có chứa lệnh:

MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"}) 

Có cách nào để chặn việc biên dịch để đảm bảo không chức năng đang được gọi?

+3

Nếu bạn đã có các lớp vỏ, tại sao bạn không chỉ sử dụng cấu hình typesafe cho tệp cấu hình và giải nén nó từ đó? – drexin

+1

hãy xem http://code.google.com/p/scalascriptengine/ Tôi nghĩ rằng chúng cung cấp một số tùy chọn bảo mật cơ bản – vitalii

+0

Nếu tôi tạo và xác thực cá thể lớp chữ bằng tệp Cấu hình Typesafe HOCON, thì số dòng của tôi sẽ phản ánh trường hợp được tạo ra, không phải là HOCON ban đầu - trừ khi tôi hiểu sai cách tiếp cận ... –

Trả lời

0

Mọi người có thể thêm mã nguy hiểm mà không cần nhập gói; cần bao nhiêu dòng mã để đưa ra lệnh rm ...?

Giải pháp tốt nhất là không cho phép mọi người gửi mã để định cấu hình; chỉ cần sử dụng một trình phân tích cú pháp XML hoặc như vậy. Cách duy nhất thực sự an toàn là tự phân tích bản tải lên và so sánh nó với danh sách trắng từ khóa nghiêm ngặt (và chuỗi được trích dẫn) mà chúng được phép sử dụng. Đến thời điểm này, bạn có một nửa cách viết trình thông dịch của riêng bạn và vẫn còn dễ bị nhiều lỗi, do đó việc phân tích cú pháp các tệp văn bản bắt đầu có vẻ giống như tùy chọn lười biếng cũng như tùy chọn an toàn.

+0

Cảm ơn, Josiah. Tôi đã kết thúc từ bỏ Twitter Eval và đi với một DSL tùy chỉnh bằng cách sử dụng Scala Parser Combinators. Nó thực sự dễ dàng hơn so với phân tích cú pháp XML khi bạn vượt qua cú pháp. –

+0

@ToddFlanders vui lòng đóng câu hỏi –

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