2010-05-19 2 views

Trả lời

7

Mỗi http://clojure.org/reader, có các quy tắc cho ký tự nào hợp lệ trong biểu tượng và từ khóa. (Hiện tại, các ký tự chữ và số và *, +, !, -, _?.) Bạn không bao giờ nên tạo biểu tượng chứa bất kỳ ký tự nào khác. Tuy nhiên, ngay bây giờ, các quy tắc này hoàn toàn không được thực thi bởi trình biên dịch.

Tốt nhất bạn có thể kết thúc với từ khóa không hợp lệ. Tệ nhất bạn có thể kết thúc với những cái ác/nguy hiểm, như Michał Marczyk nói. Hãy nhớ rằng #=() có thể được sử dụng để chạy mã tùy ý vào thời gian đọc, vì vậy bạn thậm chí không phải đánh giá chuỗi để những điều xấu xảy ra, bạn chỉ phải đọc nó.

(keyword "foo #=(steal-passwords-and-delete-hard-drive)") 

(Xem (doc *read-eval*) cho làm thế nào để vô hiệu hóa hành vi này, nhưng đọc eval được kích hoạt theo mặc định.)

Tôi nghĩ quy tắc chung cho sanitizing đầu vào người sử dụng áp dụng ở đây. Xác định chính xác những gì bạn muốn cho phép và không cho phép mọi thứ khác theo mặc định. Có thể cho phép một cái gì đó giống như regex #"[a-zA-Z0-9*+!-_?]+", với các chữ cái khác có thể tùy thuộc vào ngôn ngữ bạn nói.

+0

"# =() có thể được sử dụng để chạy mã tùy ý vào thời gian đọc, vì vậy bạn thậm chí không phải đánh giá chuỗi để những điều xấu xảy ra, bạn chỉ phải đọc nó." Điều đó tôi không biết, cảm ơn bạn. –

6

Off đỉnh đầu của tôi:

(keyword s) sẽ tạo ra một từ khóa không namespaced với tên s bất kể một từ khóa như vậy có thể được đại diện bởi một chữ từ khóa. Đó có thể là một mối quan tâm an ninh nếu bạn đã in những từ khóa hiện như một phần của một số tập tin cấu hình, nói, và sau đó cố gắng sử dụng nó như là mã đáng tin cậy:

(with-out-str (println (keyword "foo (println :bar)"))) 
; => :foo (println :bar) 

Ngoài ra, đây là hai chủ đề quan tâm từ nhóm của Google (người đầu tiên là từ clojure-dev):

  1. Request for Improvement (with patch): non-interning keyword lookup

  2. Are keywords and symbols garbage-collected?

Tóm tắt: từ khóa rác trong thực tế có thể là rò rỉ bộ nhớ, vì vậy bạn nên xem xét thực hiện một số tiền xử lý trên các chuỗi mà bạn có thể thực tập nếu chúng đến từ các nguồn không đáng tin cậy.

+0

Rất hữu ích, cảm ơn bạn. –