Ruby hat von Haus aus einen "`Schutzmechanismus"' eingebaut. Mit der
Thread-lokalen Variablen $SAFE
kann zwischen vier unterschiedlich restriktiven
Sicherheitsebenen gewechselt werden, allerdings nur in Richtung zu
stärkeren Einschränkungen. Außerdem enthalten die höheren Stufen
alle Einschränkungen der niedrigeren Stufen.
| $SAFE | Einschränkung |
| 0 | Keine Prüfung. Ruby-Standard. |
| >=1 | Kein Zugriff auf markierte (tainted) Objekte durch "`heikle"' Methoden (Ein- und Ausgabe, Prozessverwaltung). |
| >=2 | Ruby verhindert das Laden von Programmen aus schreibbaren Verzeichnissen. |
| >=3 | Alle neuen Objekte werden sofort markiert (tainted). |
| >=4 | Nicht markierte Objekte dürfen nicht mehr geändert werden. |
$SAFE #-> 0, alles ist möglich $SAFE = 3 #-> 3, jetzt wird's eng $SAFE = 0 #-> SecurityError, geht nicht mehr
Um die Sicherheitsmechanismen verstehen zu können, muss der aus Perl
entlehnte Begriff "`tainted"'
(verschmutzt) herangezogen werden. Objekte, die aus "`nicht
vertrauenswürdigen"' Quellen entstehen - darunter fällt alles,
was nicht aus dem Programm selbst kommt -,
werden automatisch als "`tainted"' markiert. Jedes von ihnen
abgeleitete Objekt ist wiederum "`tainted"'. Diese Klassifizierung
wird von Ruby automatisch vorgenommen, unabhängig von der aktuellen
Sicherheitsstufe.
input = STDIN.gets input.tainted? #-> true str = "Hallo" str.tainted? #-> false str.taint str.tainted? #-> true part = str[0,2] part.tainted? #-> true
$SAFE