Zgodnie z http://clojure.org/reader istnieją zasady, dla których znaki są poprawne w symbolach i słowach kluczowych. (Na razie znaki alfanumeryczne i *
, +
, !
, , i ?
.) Nie powinieneś nigdy tworzyć symbolu zawierającego jakiekolwiek inne znaki. Jednak teraz zasady te są całkowicie niewymuszone przez kompilator.
W najlepszym razie możesz otrzymać nieprawidłowe słowa kluczowe. W najgorszym wypadku możesz skończyć ze złymi/niebezpiecznymi, jak powiedział Michał Marczyk. Pamiętaj, że do uruchomienia kodu w czasie odczytu można użyć kodu #=()
, więc nie musisz nawet oceniać ciągu znaków, aby coś złego mogło się wydarzyć, musisz tylko go przeczytać.
(keyword "foo #=(steal-passwords-and-delete-hard-drive)")
(Zobacz (doc *read-eval*)
dla jak wyłączyć to zachowanie, ale odczytu eval jest domyślnie włączona).
myślę ogólne zasady dezynfekcji wprowadzanych przez użytkownika stosuje się tutaj. Zdefiniuj dokładnie to, na co chcesz zezwolić i domyślnie wyłączaj wszystko inne. Może zezwolić na coś takiego jak regex #"[a-zA-Z0-9*+!-_?]+"
, z możliwymi innymi alfanumerycznymi w zależności od języka, którym mówisz.
"# =() może być użyty do uruchomienia dowolnego kodu w czasie odczytu, więc nie musisz nawet oceniać ciągu znaków, aby coś złego mogło się wydarzyć, musisz tylko go przeczytać." Tego nie wiedziałem, dziękuję. –