2012-09-09 32 views
7

Tôi cam qua mã này từ một chức năng truy cập từ xa (clojurescriptone) nơi dữ liệu được gửi trở lại từ trình duyệt đang được đọc. Câu hỏi của tôi là ý nghĩa của việc thiết lập read-eval thành false là gì?Biến * read-eval * làm gì?

(ràng buộc [đọc eval sai] (đọc chuỗi dữ liệu))

Cảm ơn, Murtaza

Trả lời

9

Đó là một biện pháp an ninh để trình duyệt không thể gửi mã được được thực hiện trong máy chủ. Ví dụ: nếu ứng dụng khách/trình duyệt gửi "#=(eval (System/exit 1))" và * read-eval * là đúng, quy trình máy chủ sẽ thoát, có thể là điều bạn không muốn.

Thấy sự khác biệt về hành vi:

(binding [*read-eval* false] (read-string "#=(eval (System/exit 1))")) 
(binding [*read-eval* true] (read-string "#=(eval (System/exit 1))")) 

Xem thêm các tài liệu trên *read-eval*.

+0

Cảm ơn bạn đã giải thích @dAni! Nó rất hữu ích. – murtaza52

+0

'eval' sẽ gây nhầm lẫn cho mọi người. Vấn đề là biểu thức sau khi # = được đánh giá khi '* read-eval *' là đúng. Không cần sử dụng eval. – miner49r

4

Mục đích chính của *read-eval* là cho phép người đọc đánh giá biểu thức ở thời gian đọc, thường là đối với nội dung không có ký hiệu chữ. Nếu *read-eval* là true (mặc định), readread-string sẽ đánh giá biểu thức sau # =. Bạn có thể thấy cách tính năng được sử dụng khi *print-dup* bị ràng buộc là true - nghĩa là bạn muốn các giá trị in theo cách mà các kiểu chính xác của chúng được giữ nguyên, trong trường hợp này bạn sẽ thấy một số giá trị in với ký hiệu # =. Giá trị mặc định cho *print-dup* là sai - đối với hầu hết mọi thứ, ký hiệu Clojure chuẩn là tốt. Ví dụ, chúng ta thường không quan tâm đến sự khác biệt giữa số nguyên và thời gian dài.

Tính năng *read-eval* hữu ích khi tải mã, nhưng nó tạo ra nguy cơ bảo mật khi được sử dụng với đầu vào không tin cậy. Lời khuyên thông thường trước Clojure 1.5 là ràng buộc *read-eval* sai khi xử lý đầu vào của người dùng. Tuy nhiên, vẫn còn một số vấn đề với việc đọc các đối tượng Java có thể gây ra vấn đề. Đó là cố định trong Clojure 1.5. Quan trọng hơn, Clojure 1.5 được giới thiệu, clojure.edn/readclojure.edn/read-string không hỗ trợ bất kỳ tính năng nào trong số các tính năng *read-eval*. Chúng an toàn cho việc đọc đầu vào của người dùng đại diện cho các giá trị Clojure thông thường như được định nghĩa bởi định dạng EDN. Xem http://edn-format.org để biết thêm thông tin.

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