Die Programmiersprache Ruby (German Edition)
eingefroren.
3.8.11 Taint-Objekte
Webanwendungen müssen häufig Daten im Auge behalten, die aus nicht vertrauenswürdigen Benutzereingaben stammen, um SQL-Injection-Attacken und ähnliche Sicherheitsrisiken zu vermeiden. Ruby stellt eine einfache Lösung für dieses Problem zur Verfügung: Jedes Objekt kann durch den Aufruf seiner
taint
-Methode als Taint-Objekt gekennzeichnet werden. Sobald ein Objekt ein Taint-Objekt ist, sind auch alle davon abgeleiteten Objekte Taint-Objekte. Der Taint-Zustand eines Objekts kann mithilfe der Methode
tainted?
überprüft werden:
s = "zweifelhaft" # Objekte sind normalerweise keine Taint-Objekte
s.taint # Nicht vertrauenswürdiges Objekt als Taint kennzeichnen
s.tainted? # true: Taint-Objekt
s.upcase.tainted? # true: Abgeleitete Objekte sind Taint-Objekte
s[3,4].tainted? # true: Tail-Strings sind Taint-Objekte
Benutzereingaben – etwa Kommandozeilenargumente, Umgebungsvariablen und mit
gets
eingelesene Strings – sind automatisch Taint-Objekte.
Kopien von Taint-Objekten, die mit
clone
und
dup
erzeugt werden, bleiben Taint-Objekte. Einem Taint-Objekt können Sie mithilfe der Methode
untaint
seinen Taint-Zustand nehmen. Sie sollten das natürlich nur tun, wenn Sie das Objekt untersucht haben und überzeugt sind, dass es kein Sicherheitsrisiko darstellt.
Der Objekt-Tainting-Mechanismus von Ruby ist am leistungsfähigsten, wenn er mit der globalen Variablen
$SAFE
verwendet wird. Wenn diese Variable auf einen Wert über null gesetzt wird, schränkt Ruby diverse eingebaute Methoden ein, so dass sie nicht mit Taint-Daten funktionieren. Siehe Kapitel 10 für weitere Details über die Variable
$SAFE
.
----
[ 7 ] Verwenden Sie ri , um mehr zu erfahren:
ri Kernel.sprintf.
[ 8 ] In Ruby 1.8 führt das Setzen der veralteten globalen Variablen
$=
auf
true
dazu, dass
==
,
<
und verwandte Vergleichsoperatoren ohne Unterscheidung von Groß- und Kleinschreibung vergleichen. Sie sollten das allerdings nicht so machen; das Setzen dieser Variablen erzeugt selbst dann eine Warnung, wenn der Ruby-Interpreter ohne das Flag
-w
aufgerufen wird. Und in Ruby 1.9 wird
$=
gar nicht mehr unterstützt.
[ 9 ] Das Ergebnis ist eine Syntax, die stark an JavaScript-Objekte erinnert.
[ 10 ] Wenn Sie mit C oder C++ vertraut sind, können Sie sich eine Referenz als Zeiger vorstellen: die Adresse des Objekts im Speicher. Ruby verwendet allerdings keine Zeiger. Referenzen in Ruby sind unsichtbar und implementierungsintern. Es gibt keine Möglichkeit, die Adresse eines Wertes zu ermitteln, einen Wert zu dereferenzieren oder Zeigerarithmetik zu betreiben.
[ 11 ] Es ist allerdings davon abzuraten, dies zu tun, und Ruby 1.9 erlaubt die implizite Konvertierung von
Exception
in
String
nicht mehr.
[ 12 ] Das Wort »marshal« und seine Varianten werden manchmal mit zwei l geschrieben: marshall, marshalling und so weiter. Wenn Sie das Wort auf diese Weise schreiben, müssen Sie daran denken, dass der Name der Ruby-Klasse nur ein einzelnes l enthält.
4.1 Literale und Schlüsselwortliterale
Literale sind Werte wie zum Beispiel
1.0
,
'Hallo Welt'
und
[]
, die unmittelbar in ihren Programmcode eingebettet werden. Wir haben sie in Kapitel 2 vorgestellt und in Kapitel 3 detailliert dokumentiert.
Es ist wichtig, darauf hinzuweisen, dass viele Literale – wie etwa Zahlen – Primärausdrücke sind – die einfachsten möglichen Ausdrücke, die nicht aus einfacheren Ausdrücken zusammengesetzt sind. Andere Literale wie zum Beispiel Array- oder Hash-Literale sowie Strings in doppelten Anführungszeichen, die Interpolationen verwenden, enthalten Unterausdrücke und sind daher keine Primärausdrücke.
Bestimmte Ruby-Schlüsselwörter sind Primärausdrücke und können als Schlüsselwortliterale oder spezielle Form von Variablenreferenzen betrachtet werden:
nil
Ergibt den Wert
nil
aus der Klasse
NilClass
.
true
Ergibt die Singleton-Instanz der Klasse
TrueClass
, ein Objekt, das den Boolean-Wert
true
darstellt.
false
Ergibt die Singleton-Instanz der Klasse
FalseClass
, ein Objekt, das den Boolean-Wert
false
darstellt.
self
Ergibt das aktuelle Objekt. (Siehe Kapitel 7 für weitere Informationen über
self
.)
__FILE__
Ergibt einen String, der die Datei benennt, die der Ruby-Interpreter gerade ausführt. Dies kann in Fehlermeldungen nützlich sein.
__LINE__
Ergibt einen Integer, der die Zeilennummer innerhalb der aktuellen Codezeile von
__FILE__
angibt.
__ENCODING__
Ergibt ein
Encoding
-Objekt, das die Kodierung der aktuellen
Weitere Kostenlose Bücher