2010-05-19 3 views

Antwort

7

Pro http://clojure.org/reader gibt es Regeln, für die Zeichen in Symbolen und Schlüsselwörtern gültig sind. (Vorerst alphanumerische Zeichen und *, +, !, -, _ und ?.) Sie sollten niemals ein Symbol mit anderen Zeichen erstellen. Im Moment sind diese Regeln vom Compiler jedoch nicht vollständig aufgehoben.

Im besten Fall könnten Sie mit ungültigen Keywords enden. Im schlimmsten Fall könntest du mit bösen/gefährlichen enden, wie Michał Marczyk sagte . Denken Sie daran, dass #=() zum Ausführen von beliebigem Code zur Lesezeit verwendet werden kann, so dass Sie nicht einmal eine Zeichenfolge auswerten müssen, damit schlimme Dinge passieren, Sie müssen sie nur lesen.

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

(Siehe (doc *read-eval*) für, wie dieses Verhalten zu deaktivieren, aber schreib eval standardmäßig aktiviert ist.)

denke ich, allgemeine Regeln für die desinfizierenden Eingang Benutzer gelten hier. Definieren Sie genau, was Sie zulassen möchten, und verbieten Sie alles andere standardmäßig. Vielleicht erlauben Sie etwas wie die Regex #"[a-zA-Z0-9*+!-_?]+", mit möglicherweise anderen alphanumerischen Zeichen abhängig von der Sprache, die Sie sprechen.

+0

"# =() kann verwendet werden, um beliebigen Code zur Lesezeit auszuführen, so dass Sie nicht einmal eine Zeichenfolge auswerten müssen, damit schlimme Dinge passieren, Sie müssen sie nur lesen." Das wusste ich nicht, danke. –

6

Aus der Spitze von meinem Kopf:

(keyword s) einen Nicht-Namespace-Schlüsselwort mit Namen erstellen s unabhängig davon, ob ein solches Schlüsselwort durch ein Schlüsselwort wörtlichen dargestellt werden könnte. Das könnte ein Sicherheitsproblem, wenn Sie diese Keywords aus als Teil einer Konfigurationsdatei drucken sind, sagt sie, und dann versuchen, es als vertrauenswürdiger Code zu verwenden:

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

Auch hier sind zwei Themen von Interesse aus dem Google-Gruppen (die erste ist aus clojure-dev):

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

  2. Are keywords and symbols garbage-collected?

Eine Zusammenfassung: Interning Garbage Keywords könnten ein Speicherleck sein, also sollten Sie in Erwägung ziehen, einige Vorverarbeitungen für Strings durchzuführen, die Sie internieren könnten, wenn sie aus nicht vertrauenswürdigen Quellen kommen.

+0

Sehr hilfreich, danke. –

Verwandte Themen