Evitar el uso de Invoke-Expression

El cmdlet Invoke-Expression solo se debe utilizar como último recurso. En la mayoría de los recursos hay disponibles alternativas más seguras y sólidas. Los foros como Stack Overflow están repletos de ejemplos de uso incorrecto de Invoke-Expression. Tenga en cuenta también que PSScriptAnalyzer tiene una regla para esto. Para obtener más información, vea AvoidUsingInvokeExpression..

Plantéese con atención las implicaciones de seguridad. Cuando una cadena de un origen que no es de confianza, como la entrada de usuario, se pasa directamente a Invoke-Expression, se pueden ejecutar comandos arbitrarios. Plantéese siempre primero una solución diferente, más sólida y segura.

Escenarios comunes

Considere los escenarios de uso siguientes:

  • Es más sencillo redirigir PowerShell para ejecutar algo de forma natural. Por ejemplo:

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

    Estos casos son extremadamente evitables. El script o código ya existe en el archivo o formulario AST, por lo que debe escribir un script con parámetros e invocarlo directamente en lugar de usar Invoke-Expression en una cadena.

  • Ejecución de un script desde un origen de confianza. Por ejemplo, al ejecutar el script de instalación desde el repositorio de PowerShell:

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

    Solo debe usar esto de forma interactiva. Y, aunque esto hace que todo sea más sencillo, esta práctica debe desaconsejarse.

  • Prueba de errores de análisis. El equipo de PowerShell comprueba si hay errores de análisis en el código fuente mediante Invoke-Expression porque esa es la única manera de convertir un error en tiempo de análisis en uno en tiempo de ejecución.

Conclusión

La mayoría de los demás lenguajes de scripting tienen una manera de evaluar una cadena como código y, como lenguaje interpretado, PowerShell debe tener una manera de ejecutarse dinámicamente. Pero no hay ningún motivo convincente para usar Invoke-Expression en un entorno de producción.

Referencias