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.
fonte
2010-05-21 15:51:07
"# =() 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. –