2010-05-19 16 views

Odpowiedz

7

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.

+0

"# =() 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ę. –

6

Off szczycie mojej głowie:

(keyword s) stworzy non-przestrzeni nazw słowo kluczowe z nazwą s niezależnie od tego, czy dane słowo kluczowe może być reprezentowany przez dosłownym słowa kluczowego. To może być problemem bezpieczeństwa, jeśli były, aby wydrukować te słowa kluczowe jako część jakiegoś pliku konfiguracyjnego, powiedzmy, a następnie próbować używać go jako zaufanego kodu:

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

Również tutaj są dwa wątki interesujące z grupy dyskusyjne (pierwszy jest z Clojure-dev):

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

  2. Are keywords and symbols garbage-collected?

Podsumowanie: słowa kluczowe wtrącające się w śmieci mogą być wyciekiem pamięci, więc powinieneś rozważyć wykonanie niektórych preprocessingu na łańcuchach, które możesz internować, jeśli pochodzą one z niezaufanych źródeł.

+0

Bardzo pomocna, dziękuję. –

Powiązane problemy