### Safe Tcl Commandes Internes Tcl

NOM
Safe Base - Mécanisme pour la création et la manipulation d'interpréteurs sūr.
SYNTAXE
::safe::interpCreate ?slave? ?options...?
::safe::interpInit slave ?options...?
::safe::interpConfigure slave ?options...?
::safe::interpDelete slave
::safe::interpAddToAccessPath slave directory
::safe::interpFindInAccessPath slave directory
::safe::setLogCmd ?cmd arg...?
OPTIONS
?-accessPath pathList? ?-statics boolean? ?-noStatics? ?-nested boolean? ?-nestedLoadOk? ?-deleteHook script?
DESCRIPTION
Safe Tcl est un mécanisme pour exécuter des scripts Tcl étrangers sans risque et pour fournir un accès à de tels scripts potentiellement dangereux.
Safe Base s'assure que des scripts Tcl étrangers ne peuvent nuire à l'application hôte. Safe Base prévient les attaques d'intégrité et de sécurité. Les scripts étrangers sont empêchés de corrompre l'état de l'application ou de l'ordinateur hôte. Ces scripts sont également empêchés de révéler l'information stockée sur l'ordinateur principal ou dans l'application hôte à n'importe quel espion.
Safe Base permet à un interprèteur maītre de créer des interprèteurs sécurisés et restreints qui contiennent un ensemble d'alias prédéfinis pour les commandes source, load, file, encoding, et exit et peuvent employer des mécanismes d'auto-chargement et de paquet.
Aucune connaissance de la structure de système de fichiers n'est nécessaire à l'interprèteur sūr, parce qu'il accède seulement à un chemin virtuel contenant des repères. Quand l'interprèteur sūr demande le source d'un fichier, il emploie les repères dans le chemin virtuel en tant qu'élément du nom du fichier; l'interprèteur maītre d'une manière transparente traduit les repères en vrais noms de répertoires et exécute l'opération demandée (voir la section SECURITE ci-dessous pour les détails). Différents niveaux de sécurité peuvent être choisis en employant les flags optionnels des commandes décrites ci-dessous.
Toutes les commandes fournies dans l'interprèteur maītre par la commande Safe Base résident dans le namespace safe:
COMMANDES
Les commandes suivantes sont fournies dans le maītre interpréteur:

::safe::interpCreate ?slave? ?options...?
  Crée un interprèteur sūr, installe les alias décrits dans la section ALIAS et initialise le mécanisme d'auto-chargement et de paquet comme indiqué par les options fournies. Voir la section OPTIONS ci-dessous pour un description de l optionnel arguments. ci-dessous pour une description des arguments facultatifs. Si l'argument slave est omis, un nom sera généré.. ::safe::interpCreate renvoie toujours le nom d'interprèteur.
::safe::interpInit slave ?options...?
  Cette commande est identique à interpCreate excepté qu'elle ne crée pas l'interprèteur sūr. slave doit avoir été créé par d'autres moyens, comme interp create-safe.
::safe::interpConfigure slave ?options...?
  Si aucunes options ne sont données, renvoie les paramètres pour toutes les options de l'interprèteur sūr comme liste d'options et leurs valeurs courantes pour slave. Si un argument additionnel est fourni, renvoie une liste de 2 éléments name et value où name est le nom complet de cette option et value la valeur courante pour cette option et slave. Si plus de deux arguments additionnels sont fournis, il modifiera l'interprèteur sūr et changera chacunes et seulement les option fournies. Voir la section OPTIONS ci-dessous pour la description d'options. Exemple d'utilisation:
  # Crée un nouvel interp avec la même configuration que "$i0" :
  set i1 [eval safe::interpCreate [safe::interpConfigure $i0]]
  # Obtient le deleteHook courant
  set dh [safe::interpConfigure $i0 -del]
  # Change (seulement) l'attribut de chargement statics ok d'un interp
  # et son deleteHook (laissant le reste inchangé) :
  safe::interpConfigure $i0 -delete {foo bar} -statics 0 ;
::safe::interpDelete slave
  Efface l'interprèteur sūr et nettoie les structures de données principales correspondantes d'interprèteur. Si un script deleteHook a été spécifié pour cet interpréteur, il est évalué avant l'interpréteur que soit effacé, avec le nom de l'interpréteur comme argument additionnel.
::safe::interpFindInAccessPath slave directory
  Cette commande trouve et renvoie le jeton pour le vrai répertoire directory de l'accès au chemin virtuel courant de l'interprèteur sūr. Elle génère une erreur si le répertoire n'est pas trouvé. Exemple d'utilisation:
  $slave eval [list set tk_library [::safe::interpFindInAccessPath $ name $tk_library]]
::safe::interpAddToAccessPath slave directory
  Cette commande ajoute directory au chemin virtuel maintenu pour l'interprèteur sūr dans le maītre, et retourne un jeton qui peut être utilisé dans l'interpréteur sūr pour obtenir accès aux fichiers dans ce répertoire. Si le répertoire est déjà dans le chemin virtuel, elle renvoie seulement le jeton sans ajouter le répertoire au chemin virtuel de nouveau. Exemple d'utilisation:
  $slave eval [list set tk_library [::safe::interpAddToAccessPath $nom $ tk_library]]
::safe::setLogCmd ?cmd arg...?
  Cette commande installe un script qui sera appelé quand les événements intéressants du cycle de vie se produisent pour un interprèteur sūr. Une fois appelée sans arguments, elle renvoie le script actuellement installé. Si appelée avec un argument, une chaīne vide, le script actuellement installé est enlevé et la journalisation est arrêtée. Le script sera appelé avec un argument supplémentaire, une chaīne décrivant l'évènement intéressant. Le but principal est d'aider le debugging des interpréteur sūrs. En utilisant ce service vous pouvez obtenir des message d'erreurs complets pendant que l'interpréteur sūr reēoit seulement des messages d'erreurs génériques. Ceci empêche l'interpréteur sūr de voir des messages au sujet des échecs et d'autres événements qui pourraient contenir une information sensible telle que de vrais noms de répertoire.
  Exemple d'utilisation:
  ::safe::setLogCmd puts stderr

Ci-dessous vous trouverez la sortie d'une session exemple dans laquelle un interpréteur sūr a essayé de " sourcer " un fichier non trouvé dans son chemin d'accès virtuel. Notez que l'interpréteur sūr a seulement reēu un message d'erreur disant que le fichier n'a pas été trouvé:
NOTICE for slave interp10 : Created
NOTICE for slave interp10 : Setting accessPath=(/foo/bar) staticsok=1 nestedok=0 deletehook=()
NOTICE for slave interp10 : auto_path in interp10 has been set to {$p(:0:)}
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or directory
OPTIONS
Les options suivantes sont communes à ::safe::interpCreate, ::safe::interpInit, et ::safe::interpConfigure. N'importe quel nom d'option peut être abrégé à son nom non-ambigu minimal. Les noms d'option ne sont ne sont pas sensibles à la casse.

-accessPath directoryList
  Cette option place la liste de répertoires desquels l'interpréteur sūr peut source et load des fichiers. Si cette option n'est pas spécifiée, ou si elle est donnée comme liste vide, l'interpréteur sūr emploiera les même répertoires que son maītre pour auto-chargement. Voir la section SECURITE ci-dessous pour plus de détail au sujet des chemins virtuels, des jetons et du contrôle d'accès.
-statics boolean
  Cette option indique si l'interpréteur sūr sera autorisé à charger les packages statiquement liés (comme load {} Tk). La valeur par défaut est true : les interpréteur sūrs sont autorisé à charger les packages statiquement liés.
-noStatics
  Cette option est un raccourci de convenance pour -statics false et indique ainsi que l'interpréteur sūr ne sera pas autorisé à charger les packages statiquement liés.
-nested boolean
  Cette option spécifie si l'interpréteur sūr sera autorisé à charger des packages dans ses propre sous-interpréteurs. La valeur par défaut est false: les interpréteur sūrs ne sont pas autorisé à charger de packages dans leurs propres interprèteurs secondaires.
-nestedLoadOk
  Cette option est un raccourci de convenance pour -nested true et indique ainsi que l'interpréteur sūr sera autorisé à charger des packages dans ses propres interprèteurs secondaires.
-deleteHook script
  Quand à cette option est donné un script non vide, elle est évaluée dans le maītre avec le nom de l'interprèteur sūr comme argument additionnel juste avant supprimer réellement l'interprèteur sūr. Donner une valeur vide enlève n'importe quel script d'effacement actuellement installé pour cet interpréteur sūr. La valeur par défaut ({}) n'est n'avoir aucun appel de suppression.

ALIAS
Les alias suivants sont fournis dans un interpréteur sūr:

source fileName
  Le fichier requis, un fichier source Tcl, est "sourcé" dans interpréteur sūr s'il est trouvé. L'alias source peut seulement " sourcer " les fichier des répertoires qui se trouvent dans le chemin virtuel pour l'interpréteur sūr. L'alias source exige de l'interpréteur sūr qu'il utilise un des noms de jeton dans son chemin virtuel pour désigner le répertoire dans lequel le fichier a "sourcer" peut être trouvé. Voir la section sur la SECURITE pour une discussion plus approfondie des restrictions sur les noms de fichiers valides.
load fileName
  Le fichier requis, un fichier objet partagé, est chargé dynamiquement dans l'interpréteur sūr s'il est trouvé. Le nom de fichier doit contenir le nom d'un jeton mentionné dans le chemin virtuel de l'interpréteur sūr pour être trouvé avec succès. De plus, le fichier objet partagé doit contenir un point d'entrée sūr; voyez la page de manueluel de la commande load pour plus de détails.
file ?subCmd args...?
  L'alias file donne accès à un sous ensemble sūr des sous-commandes de file; il permet seulement les sous-commandes dirname, join, extension, root, tail, pathname et split. Pour plus de détails sur ces sous-commandes voyez la page de manueluel pour la commande file.
encoding ?subCmd args...?
  L'alias encoding donne accès à un sous ensemble sūr des sous-commandes de encoding il interdit de fixer l'encodage système, mais permet tout autre sous-commandes incluant system à vérifier l'encodage courant.
exit
  L'interprèteur appelant est supprimé et son traitement est arrêté, mais le processus Tcl dans lequel cet interprèteur existe n'est pas terminé.

SECURITE
La Safe Base n'essaye pas d'empêcher complètement les attaques d'ennui et de deni de service. Ces formes d'attaque empêchent temporairement l'application ou l'utilisateur d'utiliser l'ordinateur pour effectuer des tāches utiles, par exemple en consommant tout le temps CPU ou tout l'affichage disponible. Ces attaques, quoique graves, sont considérées comme moins importantes en général que les attaques d'intégrité et d'intimité que la Safe Base doit empêcher.
Les commandes disponibles dans un interpréteur sūr, en plus de l'ensemble sūr comme défini en page de manueluel d' interp, sont des alias de source, load, exit, et des sous-ensembles sūrs de file et encoding. L'interpréteur sūr peut aussi auto-charger du code et il peut demander que des packages soient chargés..
Puisque certaines de ces commandes accèdent au système de fichiers local, il y a un danger potentiel de fuites d'information au sujet de la structure des répertoires. Pour empêcher ceci, les commandes qui prennent des noms de fichier comme aguments dans un interpréteur sūr utilisent des jetons au lieu des noms réels de répertoires. Ces jetons sont traduits en nom réel de répertoire pendant qu'une requête pour, ex., sourcer un fichier est traitée par le maītre interpréteur. Ce système de chemin virtuel est maintenu dans l'interprèteur principal pour chaque interprèteur sūr créé par ::safe::interpCreate ou initialisé par ::safe::interpInit et le chemin pointe des jetons accessibles dans l'interpréteur sūr vers les noms de chemin réels sur le système de fichier local empêchant de ce fait les interprèteurs sūrs de connaītre la structure du système de fichiers de la machine sur lequel l'interprèteur s'exécute. Les seuls arguments valides de noms de fichier pour les alias source et load fournis à l'esclave sont des chemin sous la forme de [file join tokenfilename] (ie, en utilisant les formats natifs de chemin: token/filename sous Unix, token\filename sous Windows, et token:filename sur Mac), où token représente un des répertoires de la liste accessPath et filename est un fichier dans ce répertoire (on ne permet aucun accès aux sous-répertoires).
Quand un jeton est utilisé par un interpréteur sūr dans un requête pour " sourcer " ou charger un fichier, le jeton est vérifié et traduit en un nom réel de chemin et le fichier a "sourcer" ou chargé est localisé sur le système de fichier. L'interpréteur sūr n'a jamais connaissance du nom de chemin actuel sous lequel le fichier est stocké sur le système de fichier.
Pour empêcher une fuite d'information potentielle à partir de fichiers sensibles accidentellement inclus dans l'ensemble de fichiers qui peut être "sourcé" par un interpréteur sūr, l'alias source restreint l'accès aux fichiers respectant les contraintes suivantes: le nom de chemin ne doit pas avoir plus de quatorze caractères, ne doit pas contenir plus d'un point ("."), doit finir avec l'extension .tcl ou être appelé tclIndex.
Chaque élément de la liste initiale de chemin d'accès sera assigné à un jeton qui sera placée dans l'auto_path de l'esclave et le premier élément de cette liste sera fixé en tant que tcl_library pour cet esclave.
Si l'argument de chemin d'accès n'est pas donné ou est une liste vide, le comportement par défaut est de laisser l'esclave acceder aux mêmes packages que le maītre (ou pour être plus précis: seulement les packages écrits en Tcl (ne peuvent pas être dangereux tant qu'ils fonctionnent dans l'interpréteur esclave) et les extensions C qui fournissent un point d'entrée Safe_Init). Dans ce but, l'auto_path du maītre sera employé pour construire le chemin d'accès de l'esclave. Pour que l'esclave charge avec succès la bibliothèque Tcl (qui inclut le mécanisme d'auto-chargement) la tcl_library sera ajoutée ou déplacée à la première position si nécessaire, dans le chemin d'accès de l'esclave, ainsi la tcl_library esclave sera la même que celle du maītre (son vrai chemin sera cependant toujours invisible à l'esclave). Pour que l'auto-chargement fonctionne de même pour l'esclave et le maītre dans ce cas par défaut, les sous répertoires de premier-niveau de chaque répertoire dans l'auto_path du maītre sera aussi ajouté (si aucun n'est déjà inclus) au chemin d'accès de l'esclave. Vous pouvez toujours indiquer un chemin plus restrictif pour lequel les sous répertoires ne seront jamais recherchés explicitement en spécifiant votre liste de répertoires avec le flag -accessPath au lieu de compter sur ce mécanisme par défaut.
Quand le accessPath est changé après la première création ou l'initialisation (c.a.d au travers de interpConfigure -accessPath list), un auto_reset est automatiquement évalué dans l'interpréteur sūr pour synchroniser son auto_index avec la nouvelle liste de jetons
VOIR EGALEMENT
interp(n), library(n), load(n), package(n), source(n), unknown(n)
Dernière révision: 8.0

Copyright © 2003 - Le Portail Tcl/Tk Francophone.