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à *
, +
, !
, -
, _
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.
Nguồn
2010-05-21 15:51:07
"# =() 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. –