Angenommen, ich nehme eine vom Benutzer angegebene Zeichenfolge, Benutzerzeichenfolge und Aufruf (Schlüsselwort userstring) an.
Gibt es Sicherheitsbedenken darüber? Und wenn ja, was wäre der beste Weg, sie zu mildern?
Pro Ссылка 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 werden diese Regeln vom Compiler jedoch nicht vollständig aufgehoben.
Im besten Fall könnten Sie ungültige Keywords erhalten. 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 schlechte Dinge passieren können. Sie müssen sie nur lesen.
(Siehe (doc *read-eval*)
, um dieses Verhalten zu deaktivieren, aber read-eval ist standardmäßig aktiviert.)
Ich denke, dass hier allgemeine Regeln für die Bereinigung von Benutzereingaben gelten. 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.
Aus der Spitze meines Kopfes:
(keyword s)
erstellt ein nicht namespaced Schlüsselwort mit dem Namen s
unabhängig davon, ob ein solches Schlüsselwort durch ein Schlüsselwortliteral repräsentiert werden könnte. Das könnte ein Sicherheitsrisiko darstellen, wenn Sie diese Schlüsselwörter beispielsweise als Teil einer Konfigurationsdatei ausgeben und dann versuchen, sie als vertrauenswürdigen Code zu verwenden:
Auch hier sind zwei Threads von Interesse von den Google-Gruppen (die erste stammt von clojure-dev):
Eine Zusammenfassung: Internierende Garbage-Schlüsselwörter könnten ein Speicherleck sein, daher 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 stammen.