Compartilhar via


Evitar usar Invoke-Expression

O cmdlet Invoke-Expression deve ser usado somente como último recurso. Na maioria dos cenários, alternativas mais seguras e robustas estão disponíveis. Fóruns como o Stack Overflow estão cheios de exemplos de uso indevido de Invoke-Expression. Observe também que PSScriptAnalyzer tem uma regra para isso. Para obter mais informações, confira AvoidUsingInvokeExpression.

Considere cuidadosamente as implicações de segurança. Quando uma cadeia de caracteres de uma fonte não confiável, como a entrada de usuário, é enviada diretamente para Invoke-Expression, comandos arbitrários podem ser executados. Sempre considere uma solução diferente, mais robusta e segura primeiro.

Cenários comuns

Considere os seguintes cenários de uso:

  • É mais simples redirecionar o PowerShell para executar algo naturalmente. Por exemplo:

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

    Esses casos podem ser facilmente evitados. O script ou código já existe no arquivo ou no formulário AST, portanto, você deve escrever um script com parâmetros e invocá-lo diretamente em vez de usar o Invoke-Expression em uma cadeia de caracteres.

  • Executar um script de uma fonte confiável. Por exemplo, executar o script de instalação no repositório do PowerShell:

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

    Você só deve usar isso de modo interativo. E, embora isso torne a vida mais simples, essa prática é desencorajada.

  • Testar em busca de erros de análise. A equipe do PowerShell testa erros de análise no código-fonte usando Invoke-Expression porque essa é a única maneira de transformar um erro de tempo de análise em um de runtime.

Conclusão

A maioria das outras linguagens de script tem uma forma de avaliar uma cadeia de caracteres como código e, por ser uma linguagem interpretada, o PowerShell precisa ter uma forma de ser executado dinamicamente. Mas não há uma boa razão para usar o Invoke-Expression em um ambiente de produção.

Referências