2010-05-19 11 views

risposta

7

Per http://clojure.org/reader, esistono regole per le quali i caratteri sono validi in simboli e parole chiave. (Per ora, caratteri alfanumerici e *, +, !, -, _ e ?.) Non si dovrebbe mai creare un simbolo contenente altri caratteri. Tuttavia, al momento, queste regole sono completamente non applicate dal compilatore.

Nella migliore delle ipotesi si potrebbero finire con parole chiave non valide. Nel peggiore dei casi potresti finire con quelli malvagi/pericolosi, come diceva Michał Marczyk . Tieni presente che il codice #=() può essere utilizzato per eseguire codice arbitrario in fase di lettura, quindi non devi nemmeno valutare una stringa per far accadere cose brutte, devi solo leggerlo.

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

(Vedi (doc *read-eval*) su come disabilitare questo comportamento, ma leggi-valuta è abilitato di default.)

Penso regole generali per la sanificazione input dell'utente applicare qui. Definire con precisione ciò che si desidera consentire e disabilitare tutto il resto per impostazione predefinita. Forse consentire qualcosa come la regex #"[a-zA-Z0-9*+!-_?]+", con possibilmente altri alfanumerici a seconda della lingua che parli.

+0

"# =() può essere utilizzato per eseguire codice arbitrario in fase di lettura, in modo da non dover nemmeno valutare una stringa per far accadere cose brutte, basta leggerlo." Che non lo sapevo, grazie. –

6

Fuori della parte superiore della mia testa:

(keyword s) creerà una parola chiave non namespace con il nome s indipendentemente dal fatto che tale parola chiave potrebbe essere rappresentata da un letterale parola chiave. Questo potrebbe essere un problema di sicurezza se si dovesse stampare tali parole chiave come parte di un file di configurazione, per esempio, e quindi tentare di usarlo come codice di fiducia:

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

Inoltre, qui ci sono due fili di interesse da parte del gruppi di Google (il primo è da clojure-dev):

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

  2. Are keywords and symbols garbage-collected?

Un riepilogo: le parole chiave garbage di interning potrebbero essere una perdita di memoria, quindi è consigliabile prendere in considerazione la possibilità di eseguire una preelaborazione su stringhe che si potrebbero eseguire internamente se provengono da fonti non attendibili.

+0

Molto utile, grazie. –

Problemi correlati