Bagikan melalui


Hindari menggunakan Invoke-Expression

Invoke-Expression Cmdlet hanya boleh digunakan sebagai upaya terakhir. Dalam sebagian besar skenario, alternatif yang lebih aman dan lebih kuat tersedia. Forum seperti Stack Overflow diisi dengan contoh penyalahgunaan Invoke-Expression . Perhatikan juga bahwa PSScriptAnalyzer memiliki aturan untuk ini. Untuk informasi selengkapnya, lihat MenghindariPenggunaanInvokeExpression.

Pertimbangkan implikasi keamanan dengan hati-hati. Ketika string dari sumber yang tidak tepercaya seperti input pengguna diteruskan langsung ke Invoke-Expression, perintah arbitrer dapat dijalankan. Selalu pertimbangkan solusi yang berbeda, lebih kuat, dan aman terlebih dahulu.

Skenario umum

Pertimbangkan skenario penggunaan berikut:

  • Lebih mudah untuk mengalihkan PowerShell untuk menjalankan sesuatu secara alami. Contohnya:

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

    Kasus-kasus ini dapat dihindari secara sepele. Skrip atau kode sudah ada dalam file atau formulir AST, jadi Anda harus menulis skrip dengan parameter dan memanggilnya secara langsung alih-alih menggunakan Invoke-Expression pada string.

  • Menjalankan skrip dari sumber tepercaya. Misalnya, menjalankan skrip penginstalan dari repositori PowerShell:

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

    Anda hanya boleh menggunakan ini secara interaktif. Dan, meskipun ini membuat hidup lebih sederhana, praktik ini harus disarankan.

  • Pengujian untuk kesalahan penguraian. Tim PowerShell menguji kesalahan penguraian dalam kode sumber menggunakan Invoke-Expression karena itulah satu-satunya cara untuk mengubah kesalahan penguraian waktu menjadi runtime.

Kesimpulan

Sebagian besar bahasa skrip lainnya memiliki cara untuk mengevaluasi string sebagai kode, dan sebagai bahasa yang ditafsirkan, PowerShell harus memiliki cara untuk menjalankannya secara dinamis. Tetapi tidak ada alasan yang baik untuk digunakan Invoke-Expression di lingkungan produksi.

Referensi