Partager via


Éviter d’utiliser Invoke-Expression

L'applet de commande Invoke-Expression ne doit être utilisée qu'en dernier recours. Dans la plupart des scénarios, des alternatives plus sûres et plus robustes sont disponibles. Les forums comme Stack Overflow sont remplis d'exemples d'utilisation incorrecte Invoke-Expression. Notez également que PSScriptAnalyzer a une règle pour cela. Pour plus d'informations, consultez AvoidUsingInvokeExpression.

Examinez attentivement les implications en matière de sécurité. Lorsqu'une chaîne provenant d'une source non fiable telle qu'une entrée utilisateur est transmise directement à Invoke-Expression, des commandes arbitraires peuvent être exécutées. Envisagez toujours d'abord une solution différente, plus robuste et sécurisée.

Scénarios courants

Envisagez les scénarios d'utilisation suivants :

  • Il est plus simple de rediriger PowerShell pour exécuter quelque chose naturellement. Par exemple :

    Get-Content ./file.ps1 | Invoke-Expression
    

    Ces cas sont trivialement évitables. Le script ou le code existe déjà sous forme de fichier ou AST, vous devez donc écrire un script avec des paramètres et l'invoquer directement au lieu de l'utiliser Invoke-Expression sur une chaîne.

  • Exécution d'un script à partir d'une source fiable. Par exemple, en exécutant le script d'installation à partir du dépôt PowerShell :

    Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression
    

    Vous ne devez l'utiliser qu'en mode interactif. Et, bien que cela simplifie la vie, cette pratique devrait être découragée.

  • Test des erreurs d'analyse. L'équipe PowerShell teste les erreurs d'analyse dans le code source en utilisant Invoke-Expression car c'est le seul moyen de transformer une erreur d'analyse en une erreur d'exécution.

Conclusion

La plupart des autres langages de script ont un moyen d'évaluer une chaîne en tant que code, et en tant que langage interprété, PowerShell doit avoir un moyen de s'exécuter de manière dynamique. Mais il n'y a aucune bonne raison de l'utiliser Invoke-Expression dans un environnement de production.

References