Tcl/Tk

Tcl/Tk ist eine Skriptsprache

###
# "sicher" ist ein Tcl-Skript
# um ein nicht vertrauenswürdiges Skript dessen
# Namen die Variable "nomo_de_malsekura_skripto"
# beinhaltet relativ sicher auszuführen.
# Aufruf in der Console mittels " wish sicher "

# Sicherheit bedeutet hierbei:
# Ein nicht vertrauenswürdiges Skript darf nur in einem
# bestimmten Verzeichnis ausgeführt werden.
# (Inhalt der Variablen "sablokesto").
# Das sichere Skript "sicher" darf sich nicht in diesem
# Verzeichnis befinden! - Sonst könnte ein bösartiges
# Skript die Parameter des Skriptes "sicher" abfragen und
# manipulieren!!!
# Es dürfen sich höchstens "maksNombro" Files in diesem
# Verzeichnis befinden.
# Pro Sitzung dürfen höchstens "maksBajtoj" Bytes in dem
# Verzeichnis abgespeichert werden.
# Die Tcl-Befehle cd, exec, fconfigure, glob, pwd und
# socket sind gesperrt.
# Die Tcl-Befehle exit, file, load, open, source und puts
# sind eingeschränkt benutzbar.
# Die Tk-Befehle bell, selection, send, tk appname,
# tk_chooseDirectory, tk_getOpenFile und tk_getSaveFile
# sind gesperrt.
# Die Tk-Befehle clipboard, grab, menu, tk_chooseColor,
# tk_messageBox, toplevel und wm sind erlaubt, obwohl das
# problematisch sein kann.
# Es können keine Bilder geladen werden.

####### die Variablen werden wie folgt gesetzt: ##########
set nomo_de_malsekura_skripto 0 ;###
set sablokesto "/home/knoppix/sekura" ;###
set maksNombro 100 ;###
set maksBajtoj 10000 ;###
##########################################################

global entute maksNombro maksBajtoj
set entute 0

proc pu {sekura_interpretilo args} {
global entute maksBajtoj
set zahl [llength $args]
incr zahl -1
set s [lindex $args $zahl]
set laenge [string length $s]
incr entute $laenge
puts "$entute von $maksBajtoj Bytes"
if {$entute > $maksBajtoj} {puts "Limit von $maksBajtoj \
Bytes überschritten!!!
Der unsichere Interpreter wird in 10sec abgeschaltet!"
after 10000 {interp delete sekura_interpretilo}}
if {$zahl == 0} {interp invokehidden sekura_interpretilo \
puts [lindex $args 0]}
if {$zahl == 1} {interp invokehidden sekura_interpretilo \
puts [lindex $args 0] [lindex $args 1]}
if {$zahl == 2} {interp invokehidden sekura_interpretilo \
puts [lindex $args 0] [lindex $args 1] [lindex $args 2]}
}

proc opn {sekura_interpretilo dat {mode r}} {
global maksNombro
set files [glob *]
set nf [llength $files]
puts "$nf von $maksNombro Files"
if {$nf > $maksNombro} {puts "$nf Files sind zuviele \
Dateien!
Der unsichere Interpreter wird in 10sec abgeschaltet!"
after 10000 {interp delete sekura_interpretilo}}
set datei [file tail $dat]
if {$dat != $datei} {puts "open $dat nicht erlaubt!"}
if {$dat == $datei} {
interp invokehidden sekura_interpretilo open $datei $mode
}
}
toplevel .embed -container 1
safe::interpCreate sekura_interpretilo
safe::loadTk sekura_interpretilo -use [winfo id .embed]
foreach cmd {clipboard grab menu toplevel wm} {
interp expose sekura_interpretilo $cmd
}
wm title .embed "safe Tk"
### Fenstergröße setzen
wm geometry .embed 480x640
### Pfad zum sicheren ArbeitsVerzeichnis definieren
safe::interpAddToAccessPath sekura_interpretilo \
/home/knoppix/sekura
cd /home/knoppix/sekura
interp hide sekura_interpretilo puts
interp alias sekura_interpretilo puts {} pu \
sekura_interpretilo
interp alias sekura_interpretilo open {} opn \
sekura_interpretilo
interp share {} stdout sekura_interpretilo
interp eval sekura_interpretilo [list source \
$nomo_de_malsekura_skripto]

# Masterinterpreter verbergen
wm geometry . 1x1
lower . ###