Mode de fonctionnement sécurisé. Comment ajouter un formulaire d'impression ou un traitement externe Mode de fonctionnement sécurisé 1s 8.3

L'ouverture programmatique du traitement externe s'effectue à l'aide de l'objet contextuel global ExternalProcessing, qui a le type Gestionnaire de traitement externe. Pour chaque mode de fonctionnement de la plateforme 1C (mode d'application régulier et mode d'application géré), différentes méthodes objets sont utilisées pour travailler avec des traitements externes.

Exécution d'un traitement externe en mode d'application normal

Dans une application typique, vous devez utiliser la méthode Create() de l'objet ExternalProcessing, à laquelle est transmis le nom complet du fichier de traitement externe. La méthode renvoie un objet de type TraitementExterne, cet objet est le traitement externe en cours d'ouverture. Si vous devez ouvrir un formulaire de traitement externe, appelez la méthode GetForm() sur l'objet reçu, qui renverra le formulaire principal, puis appelez la méthode Open() pour l'ouvrir.


Traitement = ExternalProcessing.Create(FullFileName);
Processing.GetForm().Open();

Dans le traitement externe, le formulaire principal doit toujours être un formulaire régulier et le formulaire contrôlé doit toujours être un formulaire supplémentaire, sinon la méthode GetForm() ne fonctionnera pas en mode d'application normal.

Exécution d'un traitement externe en mode application gérée

En mode formulaires gérés, l'algorithme est divisé par contexte d'exécution. Sur le client, nous recevons des données binaires utilisant le nom complet du fichier de traitement externe. Nous transférons les données binaires reçues vers le serveur et les plaçons dans un stockage temporaire. Ensuite, vous devez appeler la méthode Connect() de l'objet ExternalProcessing, à laquelle l'adresse de stockage temporaire est transmise. La méthode renvoie le nom du traitement externe connecté. Nous renvoyons le nom du traitement externe au client, créons un chemin de chaîne vers le formulaire de traitement et utilisons la méthode OpenForm() pour ouvrir le formulaire de traitement externe.

&Sur le serveur
Fonction GetExternalProcessingName (BinaryData)
AddressInTemporaryStorage = PlaceInTemporaryStorage(BinaryData);
Retourner ExternalProcessing.Connect(AddressInTemporaryStorage);
FinFonction

&SurClient
NomFichierComplet = "" ; // Nom complet du fichier de traitement externe.
FileData = nouveau BinaryData (FullFileName);
ExternalProcessingName = GetExternalProcessingName (FileData);
OpenForm("ExternalProcessing." + ExternalProcessingName + ".Form");

Mode sans échec pour le traitement externe

Les méthodes Create() et Connect() de l'objet ExternalProcessing ont un paramètre entrant SafeMode - un signe de connexion d'un traitement externe en mode sans échec. Si le paramètre n'est pas précisé, la connexion se fera en mode sécurisé.
Le mode sans échec est conçu pour protéger le système contre l’exécution de code de programme « non fiable » sur le serveur. Le danger potentiel provient d'un traitement externe ou d'un code de programme saisi par l'utilisateur pour être utilisé dans les méthodes Run() et Calculate().
Le mode sans échec impose les restrictions suivantes :
  • le mode privilégié est annulé s'il a été installé ;
  • les tentatives d'accès au mode privilégié sont ignorées ;
  • les opérations avec des objets COM sont interdites ;
  • le chargement et la connexion de composants externes sont interdits ;
  • l'accès au système de fichiers est interdit (sauf pour les fichiers temporaires) ;
  • L'accès à Internet est interdit.
Les processus ouverts de manière interactive ne sont pas exécutés en mode sans échec, il est donc recommandé de mettre en œuvre un mécanisme d'ouverture des processeurs externes en mode sans échec, ainsi qu'au niveau d'autorisation pour interdire à l'utilisateur d'ouvrir de manière interactive des processeurs externes.
Pour interdire l'ouverture interactive de traitements, dans tous les rôles attribués à l'utilisateur, il est nécessaire de supprimer le droit « Ouverture interactive de traitements externes » (voir Figure 1).
Figure 1. Droits d'ouverture interactive de traitements/rapports externes
Le droit « Ouverture interactive de sous-traitance » n'affecte en rien l'objet Sous-traitance.

L'ouverture par programmation de rapports externes est similaire au traitement externe, mais vous devez utiliser l'objet de contexte global ExternalReports, qui a le type Gestionnaire de rapports externes.

Le fait est que lors de l'utilisation de la version client-serveur de 1C, les traitements/rapports externes sont ouverts en mode sans échec, dans lequel l'utilisation du mode privilégié est interdite. Et le mode privilégié est très souvent utilisé dans des configurations typiques : génération de formulaires imprimés, titres-services divers (enregistrement des échanges), etc. Par conséquent, même en utilisant un rapport régulier sur le système de contrôle d'accès sans formulaire (par défaut, le formulaire général "ReportForm" est utilisé) et en enregistrant les paramètres du rapport personnalisé (dans le répertoire correspondant), vous recevrez une erreur concernant un accès insuffisant droits sur diverses constantes et paramètres de session utilisés à des fins officielles après la ligne SetPrivilegedMode(True) ;

La solution « correcte » serait de connecter le traitement externe et les rapports via les mécanismes BSP « Rapports et traitements supplémentaires » en désactivant le mode sans échec ou en ajoutant des autorisations (à mon avis, à partir de la version 2.2.2.1 de BSP). Mais si, pour une raison quelconque, il est nécessaire d'utiliser des fichiers de reporting/traitement externes, vous pouvez alors configurer un profil de sécurité de cluster utilisé comme profil de sécurité en mode sans échec pour une base d'informations spécifique.

Je voudrais immédiatement noter que cette option n'est pas préférable, mais qu'en raison de diverses circonstances, elle peut être utilisée sous une forme aussi simplifiée. Par exemple, j'ai plusieurs bases de données dans différentes villes, une base de données locale commune avec des droits strictement limités, une clé USB fermée, etc., quelque part j'utilise Comptabilité 2.0, et quelque part 3.0, je fais presque tous les rapports à l'aide des outils ACS sans formulaires, afin qu'ils ouvert dans les deux versions. La maintenance de tous ces rapports pour différentes versions et différentes bases de données est fastidieuse et inutile, car Il est prévu de passer à une configuration et une base uniques...

Créons un profil.
Dans la console du cluster, nous créons un profil de sécurité dans lequel nous définissons les indicateurs "Peut être utilisé comme profil de sécurité en mode sans échec" et " dans la section " Accès complet autorisé :" "en mode privilégié".

Dans de nombreux cas d'utilisation de rapports et de traitements simples, cette méthode sera applicable. Pour des situations plus complexes, cela ne sert à rien de décrire le processus, car il est décrit dans la documentation (possibilité de configurer des profils de sécurité pour des fichiers externes spécifiques en précisant leur quantité de hachage, etc.).

P.S. Je pensais que les profils de sécurité ne fonctionnaient que lors de l'utilisation de licences de plateforme et de serveur au niveau CORP, mais cette fonctionnalité fonctionne également sur la plateforme 1C:Enterprise 8.3 (elle peut être conditionnellement appelée PROF, par analogie avec les configurations standards Basic/PROF/CORP)

Avec la sortie de la plateforme 8.3.9.2033, un nouveau mécanisme est apparu "Protection contre les actions dangereuses".

Grâce à cette innovation, 1C commence désormais à jurer sur l'ouverture de la transformation (et pas seulement) :

Avertissement de sécurité

Ouvre « Mon traitement externe » à partir du fichier « Mon_Processus_Externe.epf »

Il est recommandé de faire attention à la source à partir de laquelle ce fichier a été obtenu. S'il n'y a pas d'accord avec la source sur le développement de modules supplémentaires, ou s'il y a des doutes sur le contenu du fichier, il n'est pas recommandé de l'ouvrir, car cela pourrait endommager l'ordinateur et les données.

Me permettre d'ouvrir ce fichier ?

Alors 1C a décidé de lutter contre les codes malveillants !

La provenance de ce « code malveillant » dans une entreprise reste un mystère.)

Les actions potentiellement dangereuses comprenaient :

  • Chargement d'un rapport externe, d'un traitement ou d'une extension de configuration.
  • Chargement ou mise à jour de la configuration/extension.
  • Accès depuis un rapport/processeur externe ou une extension aux fonctionnalités suivantes :
  • Exécution d'une commande du système d'exploitation.
  • Gestion des utilisateurs (enregistrement ou suppression d'informations sur un utilisateur de l'infobase).
  • Appel de la méthode Connect() du gestionnaire de traitements externes (rapports).
  • Appel de la méthode ExtendConfiguration.Write().
  • Travailler avec des objets COM.

Comment désactiver ce « miracle » ?

Pour ce faire, vous devez lancer 1C Enterprise en mode configurateur.
Sélectionnez le menu « Administration » - « Utilisateurs ».
Dans la fenêtre qui s'ouvre pour nos utilisateurs, vous devez ouvrir la fenêtre des paramètres utilisateur et décocher l'onglet « Basique » "Protection contre les actions dangereuses"

Il existe d'autres moyens de désactiver cela :

Il est désormais possible de spécifier une liste d'infobases lorsque vous travaillez avec lesquelles la protection contre les actions dangereuses sera désactivée.
Cette fonction est responsable du paramètre DisableUnsafeActionProtection dans le fichier conf.cfg, qui permet de désactiver le mécanisme de protection contre les actions dangereuses pour tous les utilisateurs de certaines infobases dont les chaînes de connexion satisfont aux masques spécifiés dans le paramètre DisableUnsafeActionProtection.

Dans ce paramètre vous pouvez spécifier plusieurs masques séparés par le symbole « ; »

DisableUnsafeActionProtection=test_.*;stage_.*;

De plus, la protection contre les actions dangereuses de l'utilisateur peut être désactivée par programme, pour lequel les paramètres et propriétés suivants sont disponibles :

  • Protection des paramètres contre les actions dangereuses des méthodes Connect() des gestionnaires de traitement externe (rapports)
  • La propriété Protection contre les actions dangereuses de l'objet Extension de configuration avant d'appeler la méthode Write() de cet objet.

La vérification de la nécessité d'utiliser une protection contre les actions dangereuses s'effectue dans l'ordre suivant :

1. Si la case « Protection contre les activités dangereuses » de l’utilisateur actuel n’est pas cochée, alors la protection est considérée comme désactivée.

2. Si la chaîne de connexion à l'infobase correspond à l'un des modèles spécifiés dans le paramètre DisableUnsafeActionProtection du fichier conf.cfg, alors la protection est considérée comme désactivée.

3. Si la protection est explicitement désactivée à l'aide du paramètre Protection contre les actions dangereuses du traitement externe ou du rapport.

4. Si la protection est explicitement désactivée à l'aide de la propriété d'extension Protection contre les actions dangereuses.

Le fait est que lors de l'utilisation de la version client-serveur de 1C, les traitements/rapports externes sont ouverts en mode sans échec, dans lequel l'utilisation du mode privilégié est interdite. Et le mode privilégié est très souvent utilisé dans des configurations typiques : génération de formulaires imprimés, titres-services divers (enregistrement des échanges), etc. Par conséquent, même en utilisant un rapport régulier sur le système de contrôle d'accès sans formulaire (par défaut, le formulaire général "ReportForm" est utilisé) et en enregistrant les paramètres du rapport personnalisé (dans le répertoire correspondant), vous recevrez une erreur concernant un accès insuffisant droits sur diverses constantes et paramètres de session utilisés à des fins officielles après la ligne SetPrivilegedMode(True) ;

La solution « correcte » serait de connecter le traitement externe et les rapports via les mécanismes BSP « Rapports et traitements supplémentaires » en désactivant le mode sans échec ou en ajoutant des autorisations (à mon avis, à partir de la version 2.2.2.1 de BSP). Mais si, pour une raison quelconque, il est nécessaire d'utiliser des fichiers de reporting/traitement externes, vous pouvez alors configurer un profil de sécurité de cluster utilisé comme profil de sécurité en mode sans échec pour une base d'informations spécifique.

Je voudrais immédiatement noter que cette option n'est pas préférable, mais qu'en raison de diverses circonstances, elle peut être utilisée sous une forme aussi simplifiée. Par exemple, j'ai plusieurs bases de données dans différentes villes, une base de données locale commune avec des droits strictement limités, une clé USB fermée, etc., quelque part j'utilise Comptabilité 2.0, et quelque part 3.0, je fais presque tous les rapports à l'aide des outils ACS sans formulaires, afin qu'ils ouvert dans les deux versions. La maintenance de tous ces rapports pour différentes versions et différentes bases de données est fastidieuse et inutile, car Il est prévu de passer à une configuration et une base uniques...

Créons un profil.
Dans la console du cluster, nous créons un profil de sécurité dans lequel nous définissons les indicateurs "Peut être utilisé comme profil de sécurité en mode sans échec" et " dans la section " Accès complet autorisé :" "en mode privilégié".

Dans de nombreux cas d'utilisation de rapports et de traitements simples, cette méthode sera applicable. Pour des situations plus complexes, cela ne sert à rien de décrire le processus, car il est décrit dans la documentation (possibilité de configurer des profils de sécurité pour des fichiers externes spécifiques en précisant leur quantité de hachage, etc.).

P.S. Je pensais que les profils de sécurité ne fonctionnaient que lors de l'utilisation de licences de plateforme et de serveur au niveau CORP, mais cette fonctionnalité fonctionne également sur la plateforme 1C:Enterprise 8.3 (elle peut être conditionnellement appelée PROF, par analogie avec les configurations standards Basic/PROF/CORP)

Imprimer (Ctrl+P)

Objets de configuration

S'il est nécessaire d'utiliser du code programme « non fiable » sur le serveur : traitement externe ou code programme saisi par l'utilisateur pour être utilisé dans les méthodes Run() et Calculate(), vous pouvez utiliser le mode de fonctionnement sécurisé.

En mode sans échec :

  • Mode privilégié annulé.
  • Passer en mode privilégié ignoré.
  • Interdit opérations conduisant à l'utilisation de moyens externes en relation avec la plateforme 1C:Enterprise (y compris les analogues non bloquants des méthodes spécifiées) :
  • Mécanismes COM :
    • COMObject();
    • GetCOMObject();
    • WrapperHTMLDocument.GetCOMObject().
  • Chargement de composants externes :
    • LoadExternalComponent();
    • ConnectExternalComponent().
  • Accès au système de fichiers :
    • ValueInFile();
    • CopierFichier();
    • Fusionner les fichiers();
    • MoveFile();
    • SplitFile();
    • CreateDirectory();
    • Supprimer les fichiers ();
    • Nouveau fichier ;
    • Nouveau xBase ;
    • EntréeHTML.OpenFile();
    • ReadHTML.OpenFile();
    • ReadXML.OpenFile();
    • WriteXML.OpenFile();
    • ReadingFastInfoset.OpenFile();
    • RecordFastInfoset.OpenFile();
    • CanonicalXMLRecord.OpenFile();
    • TransformXSL.LoadFromFile();
    • WriteZipFile.Open();
    • LectureZipFile.Open();
    • Nouveau ReadText(), si le premier paramètre est une chaîne ;
    • ReadText.Open(), si le premier paramètre est une chaîne ;
    • NewTextRecord(), si le premier paramètre est une chaîne ;
    • WriteText.Open(), si le premier paramètre est une chaîne ;
    • NouveauTextExtract();
    • modifier la propriété ExtractText.FileName ;
    • ExtractText.Write();
    • New Picture(), si le premier paramètre est une chaîne ;
    • Image.Write();
    • new BinaryData();
    • BinaryData.Write();
    • NewDataRecord(), si le premier paramètre est une chaîne ;
    • Nouveau ReadData(), il y a un premier paramètre - une chaîne ;
    • toutes les méthodes de l'objet FileStreamManager ;
    • Nouveau FileStream();
    • FormattedDocument.Write();
    • GeographicScheme.Read();
    • GeographicScheme.Write();
    • GeographicScheme.Print();
    • TabularDocument.Read();
    • TabularDocument.Write();
    • TabularDocument.Print(); GraphicScheme.Read();
    • GraphicScheme.Write();
    • GraphicScheme.Print();
    • TextDocument.Read();
    • TextDocument.Write().
  • Accès Internet:
    • Nouvelle connexion Internet,
    • Nouveau courrier Internet,
    • Nouveau proxy Internet,
    • Nouvelle connexion HTTP,
    • Nouvelle connexion FTP.

ATTENTION! Lors de l'exécution d'opérations interdites, une exception est levée au moment de l'exécution.

Note. Les rapports et traitements externes ouverts à l'aide du menu Fichier - Ouvrir sont exécutés en mode sans échec si l'utilisateur ne dispose pas de droits d'accès administratif.

Le nombre d'activations du mode sans échec doit correspondre au nombre de désactivations. Cependant, si le mode sans échec a été activé dans une procédure ou une fonction (une ou plusieurs fois), mais n'a pas été désactivé, le système s'arrêtera automatiquement autant de fois qu'il y aura d'activations incomplètes dans la procédure ou la fonction laissée.

Si dans une procédure ou une fonction appelle une méthode DéfinirSafeMode (Faux) fait plus que des appels de méthode DéfinirSafeMode (Vrai), alors une exception sera levée.

L'installation du logiciel en mode sans échec peut être requise dans le cas où le développeur de configuration a l'intention d'utiliser un code de programme tiers (en relation avec la configuration), dont le développeur ne peut garantir la fiabilité. Un exemple d'un tel code est l'exécution des méthodes Execute() et Compute() dans les cas où le code exécutable est obtenu du monde extérieur. Dans ce cas, une bonne pratique serait de définir le mode sans échec avant d'exécuter ces méthodes :

// Le code du programme est généré et doit être exécuté // Il est possible que le code soit chargé à partir de sources externes // ou saisi manuellement ExecutableCode = GetExecutedCodeFromExternalWorld(); // Activer le mode sans échec SetSafeMode(True); // Exécute du code potentiellement dangereux Execute(ExecutableCode); // Désactive le mode sans échec SetSafeMode(False);

Dans certains cas, les paramètres du mode sans échec peuvent entrer en conflit avec les paramètres du mode privilégié. Un exemple d'un tel conflit est la publication d'un document pour lequel la propriété Mode privilégié lors de la publication est définie, à partir du code du langage intégré exécuté en mode sans échec. Dans ce cas, le mode privilégié est désactivé et les tentatives pour l'activer sont ignorées. En conséquence, le code du langage embarqué, qui « compte » sur le mode privilégié activé, « se heurte » à son absence, ce qui conduit à des erreurs avec des raisons non évidentes pour leur apparition. Pour éviter cette situation, le système 1C:Enterprise désactive automatiquement le mode sans échec pour les gestionnaires d'événements disponibles dans le module objet ou le module gestionnaire, à condition que le code exécutable dans le langage intégré ne se trouve pas dans l'extension de configuration. Ces gestionnaires sont marqués d'une manière spéciale dans l'assistant de syntaxe.

Il offre également la possibilité de désactiver le mode sans échec à partir du langage intégré (si le code du programme qui tente de le désactiver ne se trouve pas dans une extension de configuration). Pour désactiver le mode sans échec, il existe une méthode SetDisableSafeMode(). Vous pouvez vérifier que le mode sans échec est actuellement désactivé (automatiquement ou en appelant une méthode) en utilisant la méthode GetDisableSafeMode().

Au sein d'une méthode du langage intégré, il ne peut y avoir plus d'un niveau d'imbrication de définition du mode sans échec (en appelant la méthode SetSafeMode()) et de définition de la désactivation du mode sans échec (automatiquement lors de l'exécution de l'événement d'objet de métadonnées gestionnaires ou en appelant la méthode SetSafeModeDisable()). Lorsque vous essayez d'augmenter l'imbrication, une exception est levée :

// Utilisation correcte de ProcedureProcedureName() SetDisableSafeMode(True);